Creative IT practitioner's blog - take your thought and give it idea acceleration! My IT-goals: GenAI, Networks, Security, Virtualization and Multimedia.
Tuesday, 26 December 2017
Happy New Year 2018!
По ключу:
геолокация,
календарь,
планировщик,
поиск,
путешествие,
разработка,
человек
Monday, 25 December 2017
Биткоин шагает по планете.
Всем привет.
Биткоин шагает по планете. К нему сейчас разное отношение. Его стоимость поднялась до небес, поэтому счастливые обладатели битков потирают руки, но не спят ночами чтобы не упустить момент обвала. Или торгуют ими на бирже. Ничего не напоминает? Акции, форекс, спекуляции? Не совсем так. Практики от биткоина утверждают что это Честные деньги. В том плане что обмана тут нет и быть не может изначально. Как это достигается? Просветите себя чтеним лучших книг по теме.
Биткойн - это пиринговая платежная система и финансовая технология, ломающая многие привычные представления о деньгах и их роли в обществе. В этой книге представлена невероятная история о том, как идея подобной системы, изначально интересная лишь маленькой группке энтузиастов, постепенно привлекла к себе внимание всего мира. В этой истории принимают участие самые неожиданные персонажи: финский студент и аргентинский миллионер, китайский предприниматель и программист-создатель Netscape, неудавшийся физик, ставший онлайн-наркобароном, и близнецы-плейбои, засудившие главу Facebook, акулы венчурного капитала и руководители крупнейших мировых банков, прокуроры, спецагенты и сенаторы США, ну и конечно, сам отец-основатель Биткойна, известный под псевдонимом Сатоши Накамото. И хотя многих ставит в тупик сама мысль о цифровой валюте, за которой не стоит мощное государство или центробанк, энтузиасты Биткойна во всем мире, от Пекина до Буэнос-Айреса, верят в потенциальную возможность этой финансовой системы стать всемирно признанными деньгами цифровой эпохи. Книга адресована тем, кто интересуется современными финансовыми системами, и в частности, криптовалютными технологиями.
Sunday, 24 December 2017
LogParser, выборка строк по индексу одним запросом.
А я говорил что бесплатный LogParser может быть весьма полезен. При правильном его использовании.
Ситуация следующая: в журнале FTP надо выбрать записи касающиеся передачи ночного бекапа базы данных. Но не просто строку где было установлено соединение, но также строку о его успешном завершении. Например из следующего фрагмента в результат должны попасть и "Opening data connection" и "Transfer Complete".
Фрагмент ftpzip.log:
...
Local directory now E:\backup_db\DB.
ftp> lcd e:\backup_db\DB
mput *.zip
200 PORT Command OK
150 Opening data connection for db1506190314.zip (12.168.1.53,4108)
226 Transfer Complete
ftp: 2276702207 bytes sent in 180,45Seconds 12616,52Kbytes/sec.
ftp> ftp>
cd \
250 Directory successfully changed to "/"
и т.д.
...
Local directory now E:\backup_db\DB.
ftp> lcd e:\backup_db\DB
mput *.zip
200 PORT Command OK
150 Opening data connection for db1506190314.zip (12.168.1.53,4108)
226 Transfer Complete
ftp: 2276702207 bytes sent in 180,45Seconds 12616,52Kbytes/sec.
ftp> ftp>
cd \
250 Directory successfully changed to "/"
и т.д.
Оказывается, в LogParser в это можно сделать одним запросом! Строки вызова LogParser помещаем в любой пакетный файл:
-- куда поместить вывод запроса
set Output = "D:\test\base\Out"
set Output = "D:\test\base\Out"
-- откуда берем данные
set Input = "D:\test\base\MyDB\ftpzip.log"
set Input = "D:\test\base\MyDB\ftpzip.log"
-- сам запуск LogParser-а
LogParser.exe file:FTPQuery.sql?Path=%Input%+Out=%Output% -o:CSV -fileMode:0
LogParser.exe file:FTPQuery.sql?Path=%Input%+Out=%Output% -o:CSV -fileMode:0
А вот и наш FTPQuery.sql. Весь фокус в том что все строки при обрабокте LogParser-ом имеют индекс. Поэтому чтобы получить три строки подряд нам надо согласно шаблона '%db15% по имени файла бекапа выбрать еще две строки ниже, т.е. те у которых индекс будет отличаться на +1 и +2 соответственно:
Select LogFileName, Index, Text
INTO '%Out%\ftpzip.res'
FROM '%Path%'
WHERE Index in (
SELECT add(Index,2)
FROM '%Path%'
WHERE (Text like '%db15%'))
OR
Index in (
SELECT add(Index,1)
FROM '%Path%'
WHERE (Text like '%db15%'))
OR
Index in (
SELECT Index
FROM '%Path%'
WHERE (Text like '%db15%'))
И имеем результат.
LogFilename,Text
D:\test\_base\DB\ftprar1.log,17,"150 Opening data connection for db1506190314.zip (12.168.1.53,4108)"
D:\test\_base\DB\ftprar1.log,18,226 Transfer Complete
D:\test\_base\DB\ftprar1.log,19,"ftp: 2276702207 bytes sent in 180,45Seconds 12616,52Kbytes/sec.
...
D:\test\_base\DB\ftprar1.log,17,"150 Opening data connection for db1506190314.zip (12.168.1.53,4108)"
D:\test\_base\DB\ftprar1.log,18,226 Transfer Complete
D:\test\_base\DB\ftprar1.log,19,"ftp: 2276702207 bytes sent in 180,45Seconds 12616,52Kbytes/sec.
...
Успехов.
Friday, 22 December 2017
Linux, профили пользователя.
Всем привет.
Как у вас с Linux? Так вот, некто Кирилл Семаев в youtube доходчиво рассказывает все про Linux согласно требованиям LPIC. И я не смог удержаться чтобы в качестве примера не выложить шпаргалку про профили пользователя из коментариев к его уроку.
Есть такие понятия как Login shell и Non Login Shell.
Login shell выполняет /etc/profile, ~/.profile, ~/.bash_logout (левая часть слайда)
Non Login Shell выполняет /etc/bashrc, ~/.bashrc (правая часть слайда)
Отличить один от другого можно через echo $0:
-bash (внимание на первый символ) означает Login shell
bash (просто bash) - Non Login shell
-bash (внимание на первый символ) означает Login shell
bash (просто bash) - Non Login shell
Когда мы работаем в графике, это мы уже залогинились (другим способом) и все терминалы будут запускать Non Login shell.
Если мы зайдём на удалённую машину по ssh или на своей машине перейдём на текстовую консоль (Ctrl+Alt+F1) то после ввода пароля мы попадём в Login shell.
Итого, Login shell запускается не более одного раза за "сеанс" и может подчищать за собой при завершении сеанса (bash_logout) и однократно инициализировать окружение пользователя (.profile), а Non Login может запускаться много раз за "сеанс" и выполняет (.bashrc и т.п.),
поэтому, все свои алиасы и настройки мы обычно пишем в .bashrc, а не в .profile.
поэтому, все свои алиасы и настройки мы обычно пишем в .bashrc, а не в .profile.
Кто молодец? Кирилл молодец! Рекомендую.
Wednesday, 20 December 2017
Быстрый подсчет строк в выводе Powershell.
Всем привет.
По аналогии со оценкой времени выполнения скрипта частенько надо просто сосчитать количество строк в выводе. Особенно когда надо быстро оценить повлияло ли изменение ключа на общий вывод или нет.
Оказывается для этого есть общее свойсто Count.
Используем его. Простой пример, считаем количество строк в файле 1.csv в текущей директории:
(dir 1.csv | select-string "$").Count
Следующий пример, считаем количество строк в файле 1.csv, но при это не учитываем пустые строки:
(dir 1.csv | select-string "^(s*)$" -notMatch).Count
Следующий пример, считаем количество строк в файлах csv с рекурсией во всех вложенных папках, но при этом исключаем файлы по маске *old.csv:
(dir -Include *.csv -Recurse -Exclude *old.csv | select-string "^(s*)$" -notMatch).Count
Вывод любого, даже самого страшного, командлета считается также:
(Get-Process).Count
или
(Get-Command -Module Microsoft.PowerShell.Diagnostics).Count
Успехов.
Tuesday, 19 December 2017
Время выполнения скрипта в Powershell.
Иногда в скриптах PowerShell требуется определить время, затраченное на выполнение команды. В PowerShell есть несколько способов решения этой задачи. К примеру в .NET есть специальный класс StopWatch, который можно использовать как секундомер для измерения времени, потраченного на выполнение задачи.
Класс StopWatch входит в пространство имен System.Diagnostics и у него есть статический метод StartNew. С помощью этого метода создадим новый экземпляр класса StopWatch, сохраним его в переменную и выведем свойства и методы нашего таймера:
$watch = [System.Diagnostics.Stopwatch]::StartNew()
$watch | Get-Member
$watch | Get-Member
Здесь нас интересуют методы Start и Stop, отвечающие за запуск и остановку таймера и свойство Elapsed, показывающее прошедшее время.
Теперь создадим вот такой скрипт, который ищет в некоторой папке все файлы с расширением txt и записывает полученный результат в файл:
$watch = [System.Diagnostics.Stopwatch]::StartNew()
$watch.Start() #Запуск таймера
Get-Childitem -Path E:\TMP\audit -Filter ?*.txt? -Recurse | Out-File e:\files1.txt
$watch.Stop() #Остановка таймера
Write-Host 'Время выполнения 1' $watch.Elapsed
$watch.Start() #Запуск таймера
Get-Childitem -Path E:\TMP\audit -Filter ?*.txt? -Recurse | Out-File e:\files1.txt
$watch.Stop() #Остановка таймера
Write-Host 'Время выполнения 1' $watch.Elapsed
Запустим его и посмотрим, что выдаст секундомер. Как видите, выполнение задачи заняло 3674526 долей секунды.
Еще для измерения времени выполнения задачи в PowerShell есть командлет Measure-Command. Этот командлет берет команду(блок команд), указанную в фигурных скобках, выполняет ее внутри себя и в качестве результата выдает время, затраченное на выполнение. Вот так будет выглядеть наш скрипт с использованием Measure-Command:
Measure-Command -Expression {Get-Childitem -Path E:\TMP\audit -Filter ?*.txt? -Recurse | Out-File e:\files2.txt}
Measure-Command выдает результат в не очень удобном виде. Для того, чтобы получить более наглядное представление, можно воспользоваться методом ToString:
$time2 = Measure-Command -Expression {Get-Childitem -Path E:\TMP\audit -Filter ?*.txt? -Recurse | Out-File e:\files2.txt}
Write-Host 'Время выполнения 2' $time2.ToString()
Write-Host 'Время выполнения 2' $time2.ToString()
В этом случае результат выводится в одну строку, в таком же виде, как и при использовании StopWatch.
Ух ты, а на первый раз результат то на порядок меньший, как в предыдущем примере - всего 269218 долей секунды.
Такая огромная разница в показателях хронометра видна только на малых выборках. Чем больше данных надо обработать тем больше совпадение результатов между Measure-Command и
System.Diagnostics.Stopwatch.
Также следует учесть, что на скорость выполнения скрипта может влиять загруженность системы, скорость сетевого подключения и прочие внешние факторы. Для одной и той же команды, запущенной в разное время результат может заметно различаться. Поэтому для получения более-менее точного результата измерение стоит повторить несколько раз и усреднить итог.
Успехов.
Saturday, 16 December 2017
Фишка Windows Script Host.
Всем привет.
Слегка подзабытый сервер сценариев Windows Script Host имел очень полезные фишки. Одна из них это выполнение сценариев написанных на разных скриптовых языках.
WSH позволяет комбинировать все установленные в системе скриптовые языки в одном файле с расширением .wsf. Например, VBScript предоставляет функцию, отображающую окошко для ввода текста (InputBox), и она вам очень нужна, но скрипт свой вы пишете на JScript, который такой функцией не располагает. Решается проблема очень просто - создать файл wsf со следующим содержанием (на примере VBScript, JScript и PerlScript):
<?xml version="1.0" encoding="windows-1251"?>
<job id="MyTestJob">
<script language="VBScript">
<![CDATA[
Function WSHInputBox(Message, Title, Value)
WSHInputBox = InputBox(Message, Title, Value)
End Function
]]>
</script>
<script language="JScript">
<![CDATA[
//Ваш код на JS
var name = WSHInputBox("Enter your name:", "Query", "Pypkin");
WScript.Echo("Имя: " + name);
]]>
</script>
<script language="PerlScript">
<![CDATA[
use strict;
our $WScript;
use LWP::UserAgent;
sub do_request
{
my $lwp = new LWP::UserAgent;
my $response = $lwp->get($_[0]);
if($response->is_success)
{
return $response->headers->as_string;
}
else
{
return $response->error_as_HTML;
}
}
]]>
</script>
</job>
Слегка подзабытый сервер сценариев Windows Script Host имел очень полезные фишки. Одна из них это выполнение сценариев написанных на разных скриптовых языках.
WSH позволяет комбинировать все установленные в системе скриптовые языки в одном файле с расширением .wsf. Например, VBScript предоставляет функцию, отображающую окошко для ввода текста (InputBox), и она вам очень нужна, но скрипт свой вы пишете на JScript, который такой функцией не располагает. Решается проблема очень просто - создать файл wsf со следующим содержанием (на примере VBScript, JScript и PerlScript):
<?xml version="1.0" encoding="windows-1251"?>
<job id="MyTestJob">
<script language="VBScript">
<![CDATA[
Function WSHInputBox(Message, Title, Value)
WSHInputBox = InputBox(Message, Title, Value)
End Function
]]>
</script>
<script language="JScript">
<![CDATA[
//Ваш код на JS
var name = WSHInputBox("Enter your name:", "Query", "Pypkin");
WScript.Echo("Имя: " + name);
]]>
</script>
<script language="PerlScript">
<![CDATA[
use strict;
our $WScript;
use LWP::UserAgent;
sub do_request
{
my $lwp = new LWP::UserAgent;
my $response = $lwp->get($_[0]);
if($response->is_success)
{
return $response->headers->as_string;
}
else
{
return $response->error_as_HTML;
}
}
]]>
</script>
</job>
Friday, 15 December 2017
Ярлык закрепленного web-сайта.
Всем привет.
Вы еще на работе? Я тоже).
Такое дело - у меня появилась заковыка с ярлыками на рабочем столе. С ярлыками ссылками на web-сайты. Получил я ее буквально на ровном месте.
Если создавать ярлык с нуля на конкретный web-сайт то получим ярлык интернета (.url) со следующим содержанием:
[DEFAULT]
BASEURL=http://nyuk.narod.ru/
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://nyuk.narod.ru/
IDList=
HotKey=0
IconFile=C:\Windows\system32\SHELL32.dll
IconIndex=130
BASEURL=http://nyuk.narod.ru/
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://nyuk.narod.ru/
IDList=
HotKey=0
IconFile=C:\Windows\system32\SHELL32.dll
IconIndex=130
В нем все понятно, на самом ярлыке будет использована иконка из библиотеки SHELL32.dll с индексом 130. Ее можно изменить через "Сменить значок".
Но есть способ более быстрый - это создать на рабочем столе ярлык закрепленного сайта. Для этого надо открыть web-сайт в браузере и потащить за иконку сайта прямо из адресной строки web-браузера. На столе получим ярлык закрепленного сайта (.website):
Бесплатные инструменты расследования инцидентов информационной безопасности.
Всем привет.
Тема информационной безопасности всегда актуальна. По роду текущих занятий имею меньше отношение к этой теме чем раньше. Но приобретенный опыт помогает мне быстрее решать неожиданные проблемы. Большое значение имеют те инструменты которые всегда под рукой. Среди них бесплатные инструменты всегда могут быть полезны. Главное выбрать и протестировать их для себя заранее. Сегодняшний обзор вам в помощь.
Программные средства - лучшие друзья системного администратора, а использование подходящего инструмента поможет быстрее и продуктивнее работать. Расследование инцидентов - задача не из простых, ведь нужно собрать как можно больше информации, чтобы заручиться доказательствами и разработать план ликвидации последствий.
Тем не менее для столь важного дела существуют полезные, и в тоже время бесплатные, инструменты. Оригинал экспресс-обзора находится здесь.
1. Autopsy
Autopsy - программа с открытым исходным кодом и графическим интерфейсом для эффективного криминалистического исследования жестких дисков и смартфонов. Тысячи людей пользуются Autopsy, чтобы разобраться в том, что же действительно случилось с компьютером.
Специалисты крупных компаний и военные широко применяют Autopsy в работе. Ниже некоторые из функций Autopsy:
•анализ электронных писем;
•определение типа файла;
•воспроизведение мультимедиа;
•анализ реестра;
•восстановление фотографий с карты памяти;
•извлечение информации о геолокации и фотоаппарате из JPEG-файлов;
•извлечение данных о сетевой активности из браузера;
•отображение системных событий в графическом интерфейсе;
•хронологический анализ;
•извлечение данных из устройств на Android: SMS, журнал звонков, контакты, и т.д.
С помощью инструмента можно генерировать отчеты в форматах HTML и XLS.
2. Encrypted Disk Detector
Encrypted Disk Detector может помочь провести анализ зашифрованных жестких дисков. Программа работает с разделами, зашифрованными при помощи TrueCrypt, PGP, Bitlocker, Safeboot.
3. Wireshark
Wireshark — это инструмент захвата и анализа сетевых пакетов, который поможет наблюдать за происходящим в вашей сети. Wireshark пригодится при расследовании сетевого инцидента.
Thursday, 14 December 2017
Фильтрация вывода в PowerShell.
Утренняя пробежка.
Вы знаете как фильтровать вывод в Powershell? А в Linux или Windows? Ага, сразу перед глазами Grep. А в Windows Find. А еще лучше Findstr.
Тогда по аналогии в PowerShell будет так же. Я ищу что cтоит за алиасом gsn:
Get-Alias | findstr gsn
Вывод:
Alias gsn -> Get-PSSession
Alias gsnp -> Get-PSSnapin
Alias gsnp -> Get-PSSnapin
Если мы жить не можем без Grep то можно предварительно сделать так:
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd
И та же команда теперь получится как:
Get-Alias | grep gsn
Как еше отфильтровать вывод?
Можно ключом match:
(Get-Alias) -match 'gsn'
Можно командлетом Select-String:
Get-Alias | Select-String -Pattern gsn
Select-String весьма крут, он предоставляет следующие возможности:
• поиск по регулярным выражениям (поведение по-умолчанию),
• поиск по буквальному совпадению (переключатель -Simple),
• поиск только первого совпадения в файле, игнорируя все последующие (переключатель -List),
• или, наоборот, поиск всех совпадений, даже если в одной строке их несколько (переключатель -AllMatches),
• выполнять поиск строк, не совпадающих с шаблоном (переключатель -NotMatch) — аналог ключа -v утилиты grep,
• кроме непосредственно совпавшей строки, выводить несколько предыдущих и следующих строк (аргумент -Context) — очень похоже на то, как работает unified diff.
• поиск по регулярным выражениям (поведение по-умолчанию),
• поиск по буквальному совпадению (переключатель -Simple),
• поиск только первого совпадения в файле, игнорируя все последующие (переключатель -List),
• или, наоборот, поиск всех совпадений, даже если в одной строке их несколько (переключатель -AllMatches),
• выполнять поиск строк, не совпадающих с шаблоном (переключатель -NotMatch) — аналог ключа -v утилиты grep,
• кроме непосредственно совпавшей строки, выводить несколько предыдущих и следующих строк (аргумент -Context) — очень похоже на то, как работает unified diff.
Что очень важно для нашего пользователя, Select-String поддерживает возможность указания кодировки файла (параметр -Encoding). Но, список кодировок ограничен юникодными кодировками, а также ANSI (WINDOWS-1251 в наших ОС) и OEM (CP866).
Все, конец пробежки.
Wednesday, 13 December 2017
Способы защиты документа в MS Word.
Всем привет.
Что за ситуация с безопасностью в документах MS Word? К MS Excel мы уже привыкли что там можно многое закрыть паролем избирательно, а как же дела здесь?
Для этого в MS Word имеем три основные возможности, по нарастающей.
Итак, 1-ая это обозначить документ как последний, финальный вариант "Mark as Final". При открытии такого документа сверху появится напоминание что он, мол, финальный и "Read Only". Право, толку от установки атрибута "только для чтения" на сам файл документа иногда больше.
2-я возможность, это зашифровать документ с паролем "Encrypt with Password".
Как можно обойти? Хак такой же как с документами MS Excel.
3-я возможность, запрет на редактирование отдельных областей документа "Resrtrict Editing". Полезная фишка если вам надо чтобы кто-то заполнил только нужные места в вашем документе и не трогал остальные.
Как можно обойти? Копипастом открытого документа в новый файл.
Вот и все. Выбор есть хотя и богатым его не назовешь.
Успехов.
Tuesday, 12 December 2017
Использование масок переменной длины (VLSM).
Всем привет.
Мне тут намекают, что для нашего примера можно использовать маски переменной длины (VLSM). Тогда ничего у админа выпрашивать не придется.
Ну что же, давайте попробуем применить их к нашей ситуации. Забываем про классы сетей. Итак, опять задана сетка 192.168.136.0/24. Надо получить 5 подсетей и не менее 35-ти адресов на каждую подсеть.
Замечание. Следует помнить что с маской переменной длины можно множить подсети, но вот внезапно увеличить нужное количество хостов в одной подсети не получится.
Наглядный пример по замечанию - представим нашу сеть 192.168.136.0/24. Что я могу?
Во-первых, я могу разделить эту сеть на две подсети маской 255.255.255.128 (prefix /25). Мы получим две подсети по 126 хостов в каждой:
192.168.136.0/25
192.168.136.128/25
192.168.136.0/25
192.168.136.128/25
Затем вторую подсеть с адресом 192.168.136.128/25 я разбиваю еще на две подсети с помощью маски 255.255.255.192 (prefix /26). Получаем еще две подсети по 62 адреса в каждой:
192.168.136.128/26
192.168.136.192/26
192.168.136.128/26
192.168.136.192/26
Мой итог, три подсети где:
1) 192.168.136.0/25, на 126 хостов;
2) 192.168.136.128/26, на 62 хоста;
3) 192.168.136.192/26, на 62 хоста.
1) 192.168.136.0/25, на 126 хостов;
2) 192.168.136.128/26, на 62 хоста;
3) 192.168.136.192/26, на 62 хоста.
Т.е. я могу и дальше множить сети новой маской, но с 1-й сети никогда не получится новая подсеть где будет больше 126ти хостов, как ни со 2й или 3й не получится получить больше 62-х хостов. Это понятно?
Поэтому (см. вариант №1) если мы слепили 8 подсетей по 30 хостов в каждой, а нам надо минимум 32 хоста, то маска переменной длины тут НЕ ПОМОЖЕТ! Админ, помни про запас адресов! Если изначально разбить сетку без запаса, позже может быть очень тоскливо.
Monday, 11 December 2017
Способы проверки доступности удаленного TCP-порта.
Всем привет.
Каждому сетевому администратору периодически приходится проверять доступность службы на удаленном сервере. Это выполняется путем проверки ответа от удаленного порта. Традиционно такую проверку быстрее всего выполнить с помощью команды telnet. Например, для проверки доступности SMTP службы (по умолчанию ожидается ответ от 25-го порта) на почтовом сервере достаточно выполнить команду telnet mailserver 25.
Но начиная с Windows 7 клиент telnet выделен в отдельный компонент, который нужно устанавливать отдельно. В сети масса инкструкций на эту тему, но я право не понимаю зачем им следовать если можно просто подкинуть telnet.exe в папку Windows и пользоваться.
Еще один бесплатный способ проверки удаленного порта - это использование утилиты portqry.exe от Microsoft. Хотя сама Microsoft ее особо не рекламирует.
Простой пример проверки:
portqry -n mailserver -e 25
или
portqry -n 10.0.0.1 -e 25 -p TCP -i
Эта утилита имеет вариант с интерфейсом Port Query UI tool (portqueryui.exe). This is a tool to query open ports on remote or local machine. Рortqueryui.exe только надстройка, она использует для своей работы ту же portquery.exe.
И конечно наша любимая PowerShell тоже умеет делать это. Посмотрим, как выполнить аналогичное действие в PowerShell. Тут все просто.
Для начала вспомним что есть такой командлет как Test-Connection, который используется для отправки пакетов эхо-запроса ICMP (ping) одному или нескольким удаленным хостам.
Friday, 8 December 2017
Варианты перехвата ошибок в PowerShell.
В предыдущих двух постах были подробно изложены методы отлова критических и некритических ошибок при работе с PowerShell. Но я решил что будет несправедливым не отметить самые основные моменты, которые возникают в работе если что-то пошло не так. Т.е. переменные и обьекты в PowerShell которые содержат первичную информацию о работе нашего скрипта. Речь пойдет об объекте ErrorRecord, о переменной $Error, о мониторинге возникновения ошибки c помощью переменной $? и кодов возврата, а также упомянем командлет Set-PSDebug и точки прерывания. Поможет нам в этом замечательная книга Попова А. В. "Введение в Windows PowerShell" — СПб.: БХВ-Петербург, 2009.
Поехали.
1. Объект ErrorRecord и поток ошибок.
В PowerShell информация о возникающих ошибках записывается в поток ошибок, который по умолчанию отображается на экране, например:
PS C:\> dir "C:\Folder doesn't exist"
Get-ChildItem : Не удается найти путь "C:\Folder doesn't exist",
так как он не существует.
В строка:1 знак:4
+ dir <<<< "C:\Folder doesn't exist"
Поток ошибок можно перенаправить в текстовый файл с помощью специального оператора 2>, например:
PS C:\> dir "C:\Folder doesn't exist" 2>err.txt
Проверим теперь содержимое файла err.txt:
PS C:\> Get-Content err.txt
Get-ChildItem : Не удается найти путь "C:\Folder doesn't exist",
так как он не существует.
В строка:1 знак:4
+ dir <<<< "Folder doesn't exist" 2> err.txt
Как видите, в файл err.txt полностью записалось сообщение об ошибке, однако никакой дополнительной информации не появилось.
Где произошла ошибка смотрим так
PS C:\> $err.InvocationInfo
MyCommand : Get-ChildItem
ScriptLineNumber : 1
OffsetInLine : -2147483648
ScriptName :
Line : $err = dir "C:\Folder doesn't exist" 2>&1
PositionMessage :
В строка:1 знак:11
+ $err = dir <<<< "C:\Folder doesn't exist" 2>&1
InvocationName : dir
PipelineLength : 1
PipelinePosition : 1
Хотя этот вывод даст нам место скрипта(или непсредственного ввода)
где ошибку интепретирует сама PowerShell, истинное место проблемы надо будет
искать самим.
2. Специальная переменная $Error.
Thursday, 7 December 2017
PowerShell и MS SCCM.
Сегодня соединяем два мощных инструмента для сетевого администратора: PowerShell и MS SCCM.
Оказывается начиная с версии 3.0 PowerShell позволяет управлять ресурсами сети через MS SCCM. И я не преминул воспользоваться такой возможностью.
Для начала надо импортировать модуль из файла ConfigurationManager.psd1, который находится в папке консоли MS SCCM. Запускаем консоль PowerShell.
Переходим в папку консоли Microsoft Configuration Manager:
PS C :\> cd "C:\Program Files(x86)\Microsoft Configuration Manager\AdminConsole\bin"
Импортируем модуль для ConfigurationManаger:
PS C :\> Import-Module .\ConfigurationManager.psd1
Если все пройдет хорошо, то вы не получите никаких сообщений.
После этого мы имеем два способа подключения к сайту MS SCCM. Либо через консоль MS SCCM,
либо напрямую через PowerShell ISE.
В обоих случаях подгружается следующий авто-скрипт входа:
Wednesday, 6 December 2017
Using Gotoxy in Dev C++.
Hi all.
My son deals with IDE Dev C++. Why does he use this IDE? This is powered by his college policy in IT-class.
And yesterday he came to me with function Gotoxy(). It's absolutely not working. Hmm. I think this IDE doesn't support all features from Borland C++.
So, Gotoxy() is a standard C function defined in <conio.h>, but it will not work in ANSI C compilers such as Dev-C++. Why? Because gotoxy() is a Turbo-C++ specific function, which means it is not part of the standard.
However, if you insist on using console functions, you can define your own function by using member functions available in <windows.h>. To use gotoxy() in Dev-C++ we have to add #include <windows.h> and insert this snippet before the main() function:
//Defines gotoxy() for ANSI C compilers.
void gotoxy(short x, short y) {
COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void gotoxy(short x, short y) {
COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
Good luck.
Monday, 4 December 2017
Расчет данных подсети по IP-адресу.
Какой подсети принадлежит такой IP-адрес, какой IP-адрес для сети будет широковещательным, сколько IP-адресов из этого диапазона можно использовать для хостов и т.п. Такие вопросы часто задают на собеседовании по сетям. Причем все давно понимают, что в реальной жизни мало кто выполняет такие расчеты на бумажке. Все используют IP-калькуляторы. Но базисную IP-арифметику надо знать. Вот и я себе решил кое что напомнить. Чтобы чувствовать себя увереннее на тестах. Чаще в вопросах дан IP-адрес с префиксной маской, и исходя из него надо добыть другую информацию, наподобие той что я писал вначале.
Поэтому ниже приведу расчет всего что только можно извлечь из этого.
Пример 1.
Дано IP-адрес: 172.30.60.0/20
Найти:
1) Класс сети
2) Маску сети в обычной форме
3) Адрес подсети
4) Broadcast адрес
5) Количество подсетей
6) Количество хостов в подсети
7) Первый адрес хоста в подсети
8) Последний адрес хоста в подсети.
Понеслась.
Определяем класс сети:
Первый октет 172 в двоичной системе 10101100. Первые два бита слева как «10» определяют сеть класса В.
Пересчитываем маску:
• 32-20 = 12 бит
• 16-12 = 4, 8-4=4, 2 в 4й степени = 16
• 256-16 = 240
• Имеем 255.255.240.0
Определяем адрес подсети:
• Третий октет маски 240 в двоичной системе 11110000
• Третий октет хоста 60 в двоичной системе 00111100
• Их сложение по «И» дает нам 00110000 т.е. 48.
• Имеем 172.30.48.0
Считаем широковещательный адрес. Такой адрес имеет все «1» в адресе хоста.
Т.е. третий октет будет 00111111 как 63. Имеем в итоге 172.30.63.255.
Идем дальше.
Количество подсетей это степень двойки где степень это количество разрядов для подсети. В сети класса В третий октет маски 240 имеет 4 разряда, т.е. 2 в 4й ст будет 16.
Количество хостов это степень двойки где степень как 32 минус длина маски, и еще минус два хоста. У нас длина маски 20 разрядов, т.е. 32-20=12. 2 в 12й ст будет 4096, и минус 2 хоста имеем 4094.
Первый адрес хоста в этой подсети это 172.30.48.1, а последний это 172.30.63.254 соответственно.
Saturday, 2 December 2017
Локализация консоли администратора в MS SCCM.
Всем привет.
Мне частенько приходится читать англоязычные материалы по MS SCCM. Но вот каждое его обновление стремится вернуть ему русскоязычную консоль администратора идя навстречу локализации установленной Windows 7.
Как вернуть ей Английский язык?
Это делается просто.
Надо переименовать папку где размещается математика консоли MS SCCM
C:\Program Files\Microsoft Configuration Manager\AdminConsole\bin\ru
в другую, например такую
C:\Program Files\Microsoft Configuration Manager\AdminConsole\bin\ru.00
Это все. Теперь наш MS SCCM будет иметь англоязычную родную консоль.
Успехов.
Мне частенько приходится читать англоязычные материалы по MS SCCM. Но вот каждое его обновление стремится вернуть ему русскоязычную консоль администратора идя навстречу локализации установленной Windows 7.
Как вернуть ей Английский язык?
Это делается просто.
Надо переименовать папку где размещается математика консоли MS SCCM
C:\Program Files\Microsoft Configuration Manager\AdminConsole\bin\ru
в другую, например такую
C:\Program Files\Microsoft Configuration Manager\AdminConsole\bin\ru.00
Это все. Теперь наш MS SCCM будет иметь англоязычную родную консоль.
Успехов.
Friday, 1 December 2017
Запуск скрипта PowerShell в скрытом режиме.
Частенько по работе администратора нужно запустить скрипт PowerShell в скрытом режиме, незаметно для пользователя, который работает в текущем сеансе.
Способ первый.
Начиная со 2-й версии PowerShell при запуске можно использовать параметр -WindowStyle со значением Hidden. Это позволяет осуществить запуск в скрытом режиме, без открытия консоли. Предположим, что у меня в папке C:\Temp лежит скрипт hello.ps1, который надо скрытно выполнить при входе пользователя. Для этого используем следующую команду:
powershell.exe -nologo -noninteractive -windowStyle hidden -command "C:\Temp\hello.ps1"
Теоретически скрипт должен выполниться в фоне, незаметно для пользователя. Но на практике этот способ работает не всегда, в некоторых случаях во время выполнения скрипта окно PowerShell остается открытым. Поэтому смотрим следующий способ.
Способ второй.
Назад в прошлое. Скрыть запуск PowerShell можно, малость неожиданно, с помощью VBScript. Для этого создаем vbs-файл следующего содержания:
command = "powershell.exe -nologo -noninteractive -command C:\Temp\hello.ps1"
set shell = CreateObject("WScript.Shell")
shell.Run command,0, false
set shell = CreateObject("WScript.Shell")
shell.Run command,0, false
Параметр 0 в скрипте означает запуск в скрытом виде, false - не ждать окончания выполнения команды. Теперь для запуска PowerShell скрипта надо запустить этот vbs-файл и он тихо выполнится.
Subscribe to:
Posts (Atom)
Популярное
-
Как то получил я от Яндекс.вебмастера сообщение что мой сайт nyukers.ucoz.net содержит вредоносн ы й код. К сожалению, в сообщении...
-
Всем привет. В прошлом году я вам показывал фокус с защитой листа в MS Excel 2010. Но как оказалось в великом и могучем MS Excel сюр...
-
Всем привет. Такую ситуацию я наблюдал на виртуальных машинах VmWare , которые имеют IP-адрес реальной машины, а именно - Windows после зап...
-
Всем привет. Не секрет что б локирование ответов пинг в ОС может предотвратить атаки флуда ICMP пакетов, но в тоже время большинство сис...
-
Всем привет. В мониторинге принтеров с помощью Zabbix главное не столько чтобы принтер был на связи сколько знать сколько было бумаги...