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-файл и он тихо выполнится.
Wednesday, 29 November 2017
Профилирование в PowerShell.
Во время работы с PowerShell все псевдонимы, функции и переменные на самом деле добавляются только в ваш текущий сеанс PowerShell.
При завершении сеанса или закрытии Windows PowerShell сделанные изменения утрачивают силу. Для сохранения изменений можно создать профиль Windows PowerShell и добавить в него нужные псевдонимы, функции и переменные. Профиль загружается при каждом запуске Windows PowerShell. Чтобы можно было загрузить профиль, действующая политика выполнения Windows PowerShell должна допускать загрузку конфигурационных файлов. Если она не позволяет загружать конфигурационные файлы, попытка загрузить профиль не удастся и оболочка Windows PowerShell отобразит сообщение об ошибке.
Основные сведения о профилях в PowerShell.
Оболочка Windows PowerShell позволяет пользователю иметь четыре разных профиля. Ниже они указаны в том порядке, в котором они загружаются.
Если в конкретной ситуации могут быть использованы несколько профилей, предпочтение отдается более узконаправленному:
1) %windir%\system32\WindowsPowerShell\v1.0\profile.ps1
Действие этого профиля распространяется на всех пользователей и все оболочки
2) %windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1
Действие этого профиля распространяется на всех пользователей, но только на одну оболочку - Microsoft.PowerShell
3) %UserProfile%\My Documents\WindowsPowerShell\profile.ps1
Действие этого профиля распространяется только на текущего пользователя и на все оболочки
4) %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Действие этого профиля распространяется только на текущего пользователя и только на оболочку Microsoft.PowerShell.
Saturday, 25 November 2017
Using PowerShell behind a Proxy.
Hi everybody.
Today I would like to point that PowerShell after version 3 has some useful commandlets concerning Web.
As simple task, you try to load some resource from the web in PowerShell, e.g., with one of the following two commandlets:
PS> Invoke-WebRequest http://example.org
PS> Update-Help
However, you get an “access denied” or “no network connection” error message there may be a web proxy in your company blocking your way, demanding authentication.
What needs to be done?
You have to configure PowerShell’s proxy settings. Some commandlets like Invoke-WebRequest offer options that let you set the proxy for just one command:
PS> Invoke-WebRequest -Proxy http://proxy.example.net:8080 -ProxyUseDefaultCredentials http://example.org
For commandlets that don’t have such options (like Update-Help), or if you’d rather set the proxy for the whole PowerShell session, issue the following command:
PS> (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
All commands after that will implicitly use the system proxy, so you can issue commands like the above Invoke-WebRequest http://example.org or Update-Help and they will “just work”.
There some examples are the following by Proxy:
#1:
$secPasswd=ConvertTo-SecureString "Password" -AsPlainText -Force
$myCreds=New-Object System.Management.Automation.PSCredential -ArgumentList "Domain\name",$secPasswd
$Site="http://nyuk.narod.ru"
$Test=Invoke-WebRequest -URI $Site -Proxy "http://myproxy.skyfleet.com:8080" -ProxyCredential $mycreds
$Test.Links
#2:
PS C:\Users\Admin> $w = Invoke-WebRequest -Proxy http://myproxy.skyfleet.com:8080 -ProxyUseDefaultCredentials http://nyuk.narod.ru
PS C:\Users\Admin> $w.links | fl innerText, href
innerText :
href : http://www.peresvetmed.ru
innerText :
href : http://flasher911.narod.ru/demo5/
innerText :
href : http://www.medinfo.dp.ua
innerText :
href : http://nyukers.ucoz.net
innerText : MedixWare 2000 Ultrasound®:
href : index4.html
innerText : Nyukers® Network Suite - швейцарский нож для админа!
href : http://nyuk.narod.ru/soft.html
...
and so on.
#3:
# Create the Web Client object
$Client = New-Object -TypeName System.Net.WebClient
# Tell it to use our default creds for the proxy
$Client.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
# Now we try to run our command, in this case, downloading a web page.
$Client.DownloadString("http://nyuk.narod.ru")
#4:
$Client = New-Object -TypeName System.Net.WebClient
$proxy = New-Object -TypeName System.Net.WebProxy
$proxy.Address = [uri]"http://myproxy.skyfleet.com:8080"
$proxy.Credentials = (new-object System.Net.NetworkCredential("Username", "Password", "Domain"))
$Client.Proxy = $proxy
$Client.DownloadString(http://nyuk.narod.ru)
#5: (for session login have to type online)
$c = Get-Credential
$web = New-Object System.Net.WebClient
$web.Proxy.Credentials = $c
update-help -force
See you later.
Today I would like to point that PowerShell after version 3 has some useful commandlets concerning Web.
As simple task, you try to load some resource from the web in PowerShell, e.g., with one of the following two commandlets:
PS> Invoke-WebRequest http://example.org
PS> Update-Help
However, you get an “access denied” or “no network connection” error message there may be a web proxy in your company blocking your way, demanding authentication.
What needs to be done?
You have to configure PowerShell’s proxy settings. Some commandlets like Invoke-WebRequest offer options that let you set the proxy for just one command:
PS> Invoke-WebRequest -Proxy http://proxy.example.net:8080 -ProxyUseDefaultCredentials http://example.org
For commandlets that don’t have such options (like Update-Help), or if you’d rather set the proxy for the whole PowerShell session, issue the following command:
PS> (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
All commands after that will implicitly use the system proxy, so you can issue commands like the above Invoke-WebRequest http://example.org or Update-Help and they will “just work”.
There some examples are the following by Proxy:
#1:
$secPasswd=ConvertTo-SecureString "Password" -AsPlainText -Force
$myCreds=New-Object System.Management.Automation.PSCredential -ArgumentList "Domain\name",$secPasswd
$Site="http://nyuk.narod.ru"
$Test=Invoke-WebRequest -URI $Site -Proxy "http://myproxy.skyfleet.com:8080" -ProxyCredential $mycreds
$Test.Links
#2:
PS C:\Users\Admin> $w = Invoke-WebRequest -Proxy http://myproxy.skyfleet.com:8080 -ProxyUseDefaultCredentials http://nyuk.narod.ru
PS C:\Users\Admin> $w.links | fl innerText, href
innerText :
href : http://www.peresvetmed.ru
innerText :
href : http://flasher911.narod.ru/demo5/
innerText :
href : http://www.medinfo.dp.ua
innerText :
href : http://nyukers.ucoz.net
innerText : MedixWare 2000 Ultrasound®:
href : index4.html
innerText : Nyukers® Network Suite - швейцарский нож для админа!
href : http://nyuk.narod.ru/soft.html
...
and so on.
#3:
# Create the Web Client object
$Client = New-Object -TypeName System.Net.WebClient
# Tell it to use our default creds for the proxy
$Client.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
# Now we try to run our command, in this case, downloading a web page.
$Client.DownloadString("http://nyuk.narod.ru")
#4:
$Client = New-Object -TypeName System.Net.WebClient
$proxy = New-Object -TypeName System.Net.WebProxy
$proxy.Address = [uri]"http://myproxy.skyfleet.com:8080"
$proxy.Credentials = (new-object System.Net.NetworkCredential("Username", "Password", "Domain"))
$Client.Proxy = $proxy
$Client.DownloadString(http://nyuk.narod.ru)
#5: (for session login have to type online)
$c = Get-Credential
$web = New-Object System.Net.WebClient
$web.Proxy.Credentials = $c
update-help -force
See you later.
Friday, 24 November 2017
Обработка прерывающих ошибок в PowerShell.
Обработка прерывающих ошибок (exceptions).
Примечание. Таким же образом можно обрабатывать и непрерывающие ошибки. Изменение параметра ErrorAction на Stop прервет выполнение команды и произведет исключение, которое можно уловить.
Для наглядности сгенерируем ошибку, попытавшись прочитать файл, на который у нас нет прав. А теперь обратимся к переменной $Error и выведем данные об исключении. Как видите, данное исключение имеет тип UnauthorizedAccessException и относится к базовому типу System.SystemException.
PS C:\Users\MyName> $Error[0].Exception.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True UnauthorizedAccessException System.SystemException
Для обработки исключений в PowerShell есть несколько способов, которые мы сегодня и рассмотрим.
Try/Catch/Finally
Конструкция Try/Catch/Finally предназначена для обработки исключений, возникающих в процессе выполнения скрипта. В блоке Try располагается исполняемый код, в котором должны отслеживаться ошибки. При возникновении в блоке Try прерывающей ошибки оболочка PowerShell ищет соответствующий блок Catch для обработки этой ошибки, и если он найден, то выполняет находящиеся в нем инструкции. Блок Catch может включать в себя любые команды, необходимые для обработки возникнувшей ошибки и\или восстановления дальнейшей работы скрипта.
Блок Finally располагается обычно в конце скрипта. Команды, находящиеся в нем, выполняются в любом случае, независимо от возникновения ошибок. Была ли ошибка перехвачена и обработана блоком Catch или при выполнении скрипта ошибок не возникало вообще, блок Finally будет выполнен. Присутствие этого блока в скрипте необязательно, основная его задача — высвобождение ресурсов (закрытие процессов, очистка памяти и т.п.).
В качестве примера в блок Try поместим код, который читает файлы из указанной директории. При возникновении проблем блок Catch выводит сообщение об ошибке, после чего отрабатывает блок Finally и работа скрипта завершается:
try {
Get-Content -Path "C:\Files\*" -ErrorAction Stop
}
catch {
Write-Host "Some error was found."
}
finally {
Write-Host "Finish."
}
"Some error was found."
"Finish."
Wednesday, 22 November 2017
Обработка непрерывающих ошибок в PowerShell.
Совсем недавно меня спросили как можно обработать ошибку выполнения в PowerShell. Вопрос был про Errors Handling. И вопрос звучал на анлийском. Что-то я помнил, но смутно, так как плотно обработчики ошибок писать не доводилось. Поэтому пошел в сеть, нашел отличный материал по теме, и весь его протестировал. Материал богатый поэтому разбиваю его на две части. Уверен что вам тоже будет полезно.
Для начала определимся, что такое обработка ошибок вообще. В общем случае ошибка - это поведение программы или скрипта, отличное от запланированного. Совсем избежать ошибок не очень возможно, поэтому надо предвидеть, где они могут возникнуть и писать код так, чтобы при возникновении ошибки можно было перехватить ее, проанализировать и определить дальнейшее поведение скрипта. Именно это обычно и подразумевается под обработкой ошибок.
В PowerShell ошибки делятся на два типа: прерывающие (Terminating) и непрерывающие (Non-Terminating). Как следует из названия, непрерывающие ошибки позволяют продолжить выполнение команды, тогда как при возникновении прерывающей ошибки дальнейшее продолжение выполнения команды невозможно. К примеру, у нас есть файл со списком служб, которые необходимо перезапустить следующей командой:
Get-Content -Path C:\Files\services.txt | Restart-Service
Get-Content -Path C:\Files\services.txt | Restart-Service
Предположим, что перезапуск одной из перечисленных служб по какой либо причине невозможен. Тем не менее можно продолжать выполнение задачи, поскольку остальные службы доступны и их можно перезапустить. Это пример непрерывающей ошибки.
А теперь представьте, что у нас нет прав на открытие этого файла, и соответственно прочитать список служб мы не можем. В этой ситуации продолжение работы невозможно, т.е. это прерывающая ошибка.
PowerShell позволяет обрабатывать оба эти типа ошибок. Большинство ошибок в PowerShell непрерывающие, и сегодня речь пойдет о том, как их обрабатывать.
Обработка непрерывающих ошибок
Для получения ошибки возьмем службу с ″оригинальным″ названием Service. Поскольку службы этой на сервере нет, то обращение к ней стабильно будет генерировать ошибку. Запросим данные о нескольких службах командой:
Get-Service service,spooler
Get-Service service,spooler
PS D:\Courses!!!\Done!\PowerShell\scripts> Get-Service service,spooler
Get-Service : Не удается найти службу с именем службы "service".
строка:1 знак:1
+ Get-Service service,spooler + CategoryInfo : ObjectNotFound: (service:String) [Get-Service], ServiceCommandException + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand
Status Name DisplayName
------ ---- -----------
Running spooler Диспетчер печати
Get-Service : Не удается найти службу с именем службы "service".
строка:1 знак:1
+ Get-Service service,spooler + CategoryInfo : ObjectNotFound: (service:String) [Get-Service], ServiceCommandException + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand
Status Name DisplayName
------ ---- -----------
Running spooler Диспетчер печати
Как видно из примера, PowerShell не нашел службу Service, о чем выдал ошибку и затем продолжил выполнение команды. Давайте разберемся, почему команда повела себя именно так и как это поведение изменить.
Monday, 20 November 2017
Версиoнность PowerShell.
Так уже получилось что работая над ошибками в PowerShell я случайно проморгал апгрейд версии самого инструмента.
По традиции у меня была 2-я версия на моей Windows 7. Но установкой сервиспака (SP1) она в один миг поднялась до 3-й! Конечно в моем профиле PowerShell всегда в начале стоит вызов $PSVersionTable.PSVersion. Но само сообщение про текущую так примелькалось, что я его уже и не читал.)
Как обнаружил?
А наше вкусное расширение PowerTab начало вдруг выдавать ошибку вызова функции Function:TabExpansion при импорте самого модуля. Оказалось что 3-й версии PowerShell эта функция заменена на TabExpansion2.
Поэтому надо в файле PowerTab.psm1 строку
$OldTabExpansion = Get-Content Function:TabExpansion
заменить на,
$OldTabExpansion = Get-Content Function:TabExpansion2
т.е. просто добавьте 2 в конец строки.
Sunday, 19 November 2017
Перевод маски IP-адреса из префиксной формы в обычную.
Всем привет.
Сетевому администратору часто приходится пересчитывать маску IP-адреса из обычной формы (255.255.255.192) в префиксную (/26), и наоборот. Дело в том что префискуню форму маски легче читать или записывать, а обычную форму приходится непосредственно указывать в конфигурации сетевого интерфейса.
Конечно, онлайн-калькуляторов полно, но надо уметь это делать и вручную. Тем более что про такой пересчет любят спрашивать в тестах на собеседовании.
Как это делается?
Задача первая - перевод из префиксной формы в обычную.
Пример 1: имеем адрес 192.168.10.1/22. Префикс 22.
- Вычитаем биты 32-22=10
- если битов более 8-ми то вычитаем из низ байт 10-8=2. Это степень двойки, которая нам дает 4
- получаем октет маски в обычной форме 256-4=252
- пишем маску как 255.255.252.0. Последний октет равен 0 так как в п.2 мы вычли один байт.
Пример 2: имеем адрес 192.168.10.1/30. Префикс 30.
- Вычитаем биты 32-30=2
- Это степень двойки, которая нам дает 4
- получаем октет маски в обычной форме 256-4=252
- пишем маску как 255.255.255.252.
Friday, 17 November 2017
Голосовой глюк в Windows 7.
Всем привет.
Перечитывая за своей Windows 7 электронную книгу мне захотелось выпить кофейку. Но ведь Windows точно умеет читать голосом. Почему бы этим не воспользоваться? И глаза отдохнут. Еще с версии Windows ХР экранный диктор (narrator.exe) голосом Анны мог читать все что было на экране по английски. А русский текст диктор просто пропускал.
Из сети для Windows 7 было найдено простое решение. Про простоту нас заверяет каждый второй автор, видимо особо не затруднившись проверить это у себя.
Итак, нам известно что преобразование текста в речь (Text-To-Speech или TTS) производится с помощью речевых модулей (TTS Engine), которые должны устанавливаться отдельно. После установки такого модуля в системе появляется один или несколько так называемых голосов (TTS Voices). Для преобразования текста в речь рекомендуют использовать бесплатную Microsoft Speech Platform SDK 11, которая поддерживает 26 языков, включая русский.
Для ее установки на 32-битную Windows 7 необходимо:
1. Скачать 32-разрядную (x86) версию платформы (файл x86_SpeechPlatformRuntime\ SpeechPlatformRuntime.msi) с сайта Майкрософт.
2. Кроме того, необходимо установить необходимые голоса, скачав их с сайта Майкрософт. Русский женский голос Elena файл MSSpeech_TTS_ru-RU_Elena.msi.
Wednesday, 15 November 2017
Бизнес-аспект почтового спама.
На днях вычищая свой корпоративный почтовый ящик обнаружил интересное сообщение в котором автор потрудился заверить меня что это точно был не "Спам".
В начале по тексту, как обычно, было рекламное предложение, а вот и сама концовка:
Полученное Вами электронное сообщение не является «Спамом» по следующим причинам:
1. Бизнес-аспект
Данное электронное сообщение является коммерческим предложением и адресовано на полученный из открытых источников электронный адрес <nul>. Под открытым источником подразумеваются деловые справочники, такие как «Желтые страницы Украины», «Бизнес-досье», «УкрБизнес» и д.р. Добавление Вами контактной информации в эти издания предполагало нахождение новых партнеров посредством телефонной, почтовой или e-mail связи.
Данное электронное сообщение является коммерческим предложением и адресовано на полученный из открытых источников электронный адрес <nul>. Под открытым источником подразумеваются деловые справочники, такие как «Желтые страницы Украины», «Бизнес-досье», «УкрБизнес» и д.р. Добавление Вами контактной информации в эти издания предполагало нахождение новых партнеров посредством телефонной, почтовой или e-mail связи.
2. Законодательный аспект
Полученное Вами электронной сообщение не является «Спамом», так как полностью отвечает требованиям Постановления КМУ No. 720 от 09.08.2005 г. и ст. 33 Закона Украины «О телекоммуникациях», не попадает под ст. 363-1 УК Украины.
Полученное Вами электронной сообщение не является «Спамом», так как полностью отвечает требованиям Постановления КМУ No. 720 от 09.08.2005 г. и ст. 33 Закона Украины «О телекоммуникациях», не попадает под ст. 363-1 УК Украины.
3. Технический аспект
Полученное Вами электронное письмо содержит все необходимые специальные технические заголовки, рекомендованные крупнейшими мировыми почтовыми системами Google Mail, Yahoo Mail и Live/Hotmail (SPF, Precedence, List-Unsubscribe, DKIM/DomainKey, Sender-ID), а также отвечает спецификациям RFC 2822, RFC 2369 и RFC 2919.
Полученное Вами электронное письмо содержит все необходимые специальные технические заголовки, рекомендованные крупнейшими мировыми почтовыми системами Google Mail, Yahoo Mail и Live/Hotmail (SPF, Precedence, List-Unsubscribe, DKIM/DomainKey, Sender-ID), а также отвечает спецификациям RFC 2822, RFC 2369 и RFC 2919.
4. Аспект Сетевого этикета
Письмо было отослано со специально созданного ящика, адрес которого в явном виде присутствует в заголовках письма, т.е. адрес отправителя — реальный, а не подставляемый, как в случае «Спама». Письмо также не содержит вирусов, фишинга и никаких других мошеннических уловок.
Письмо было отослано со специально созданного ящика, адрес которого в явном виде присутствует в заголовках письма, т.е. адрес отправителя — реальный, а не подставляемый, как в случае «Спама». Письмо также не содержит вирусов, фишинга и никаких других мошеннических уловок.
Автор письма постарался, сразу видно. Я могу заглянуть в ст.363-1, могу проверить служебные заголовки сообщения согласно спецификаций RFC и даже согласиться с сетевым этикетом. Но есть одно Но - я как частное лицо не размещал свой электронный адрес (адрес получателя в сообщении) в открытых источниках! Если вы уже так волнуетесь за свою информацию извольте добавить и адрес открытого источника в котором был "найден" мой электронный адрес в параграф Бизнес-аспекта. Я проверю, и тогда поговорим.
А пока это Спам, как ни старайся.)
Всего хорошего.
Английские связки при собеседовании.
Написание резюме на английском языке рано или поздно приведет вас к первому интервью. Тоже на Английском.) Разумеется кто знает разговорный Английский на уровне выше среднего не испытывает особых трудностей , главное быть в теме самого интервью если оно техническое. Тем же кто только начинает проходить подобные собеседования хочу предложить основные связки вашего диалога которые обязательно присутствуют в любом подобном разговоре, хоть по скайпу, хоть по телефону.
- It's very nice to meet you
- Thank you very much for opportunity to meet you
Ставить точку в ответе или подталкивать к следующему вопросу надо только если вы чувствуете, что от вас еще молча что-то ожидают услышать.
Next question:
- Have I answered your question?
- I think I answered your question.
- I suppose I answered your question.
- So, should we go to the next question?
- I suppose, that's all. I think (mean, guess), that's all.
Переспрашивать следует в случае если вы вообще ничего не поняли. Если вы не поняли вопрос повторно то подключайте интуицию, переспрашивать второй раз будет некомильфо.
Repeat question:
- Excuse me, I didn't really (quite) understand last question. Can you repeat that, please?
- Could you say it in different way?
- I beg your pardon, tell me it once again?
Обычно заполнители пауз могут не понадобиться, время (слот) на интервью ограничено и вам паузы просто так не подарят.
Pause filling:
- I mean,
- Let me see,
- If you follow me,
- If you see what I mean
Благодарности следуют, обычно, за блоком ваших вопросов к интервьюверу. Вам обязательно надо их задавать!
Finish:
- Thank you for your time with my interview.
- It was nice talking with you.
- Thank you very much.
- When should(could) I do callback?
Перечень часто задаваемых вопросов на собседовании с ответами можете почерпнуть здесь. Также рекомендую к прочтению хорошую статью "Как успешно пройти собеседование на английском".
Monday, 13 November 2017
Как настроить книгу Excel, используемую по умолчанию.
И снова здравствуйте.
Известно что каждая вновь созданная рабочая книга в Excel открывается с установками, принятыми по умолчанию.
Но что делать, если вас не устраивают какие-либо стандартные установки книги?
Меня, например, часто напрягает ситуация когда вновь вводимое число становится датой. И вернуть его в исходное состояние нет никакой штатной возможности, кроме как поменять формат ячейки и ПОВТОРНО ввести это же число.
Или вам нужно чтобы книга содержала всего один лист. Или, может быть, необходимо изменить шрифт, заданный по умолчанию, либо его размер. А может, вы хотите скрыть линии сетки, которую содержат листы. Или вам нужно, чтобы стандартный верхний колонтитул всегда выводился при печати. Изменить такого рода настройки можно в диалоговом окне Параметры Excel. Однако другие изменения требуют использования самого шаблона.
Изменение заданных по умолчанию значений в диалоговом окне Параметры Excel.
В разделе Общие диалогового окна Параметры Excel есть всего четыре параметра, управляющие настройками для новых книг. Тут вы можете указать шрифт текста, размер шрифта, режим и количество листов. Эти изменения применяются только к новым книгам, уже созданных книг они не коснутся. Увы все.
Thursday, 9 November 2017
Новая книга "My Excel: tips & tricks”
Занимаясь с очередным онлайн-курсом из серии “Mastering Excel” я вдруг обнаружил что у меня накопился интересный материал для небольшой книжки. Так как сами заметки в блоге были разбросаны по годам то было принято решение оформить это все в одном месте.
Так через пару часов родилась книжка “My Excel: tips & tricks”. И я поспешил ее выставить вам для тщательного ознакомления. Все реальные случаи из моей практики. Описанные приемы в основном касаются версии Excel 2016, но часть из них стартовала и с 2010-го. Увы, 2013-й проскочил мимо меня.
Заранее прошу прощения если в работе использовал парочку не своих рисунков без явного указания URL источника.
Приятного чтения.
Как обычно свободный доступ для всех в моей Библиотеке.
Одним PDF-файлом для скачивания выложу чуть позже.
Wednesday, 8 November 2017
Совместимость между VBA, VBScript и Powershell.
Как оказалось наш Excel это мега-инструмент для администратора!
В код VBA в Excel можно легко вставлять блоки VBS кода и все будет успешно работать.
Вот вам пример простенькой смеси из VBА и VBS кода, MyVBScript() определяеят версию ОС, 7ка или нет, и пишет результат в активную ячейку.
On Error Resume Next
Set objCollection = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("SELECT Name FROM Win32_OperatingSystem")
For Each objItem In objCollection
strOS = objItem.Name
Next
'MsgBox strOS
ActiveCell.Select
If InStr(1, strOS, " Vista ", vbTextCompare) > 0 Or InStr(strOS, " 7 ") > 0 Then
ActiveCell.FormulaR1C1 = "Windows 7"
Else
ActiveCell.FormulaR1C1 = "It isn't Win7"
End If
End Sub
Здорово, не правда ли?
Но возьмем пример попрактичнее. Администратору надо было вручную поменять пароль главного админа на всех хостах в локальной сети. Но администратор был в меру ленив и решил использовать любимый Excel!
Subscribe to:
Posts (Atom)
Популярное
-
Как то получил я от Яндекс.вебмастера сообщение что мой сайт nyukers.ucoz.net содержит вредоносн ы й код. К сожалению, в сообщении...
-
Всем привет. В прошлом году я вам показывал фокус с защитой листа в MS Excel 2010. Но как оказалось в великом и могучем MS Excel сюр...
-
Всем привет. Такую ситуацию я наблюдал на виртуальных машинах VmWare , которые имеют IP-адрес реальной машины, а именно - Windows после зап...
-
Всем привет. Не секрет что б локирование ответов пинг в ОС может предотвратить атаки флуда ICMP пакетов, но в тоже время большинство сис...
-
Всем привет. В мониторинге принтеров с помощью Zabbix главное не столько чтобы принтер был на связи сколько знать сколько было бумаги...