#Requires –Version 2.0

Наверное у многих возникало желание делать в начале своего скрипта проверку например версии PowerShell. Ведь если вы используете новые возможности 2.0, а файл будет запущен под 1.0, то часть команд сработает, а другая нет, что в результате может привести как минимум к ошибкам, а как максимум – к большим проблемам.

Вообще написать проверку версии несложно. У PowerShell 2.0 есть специальная переменная, $PSVersionTable в которой содержится вся необходимая информация о версии:

[PS <1> C:\root] $psversiontable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.4918
BuildVersion                   6.1.7100.0
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.0

Ну а версию 1.0 легко опознать по отсутствию этой переменной 🙂 В результате получаем такую функцию:

function Get-Version {if ($PSVersionTable){$PSversionTable.PSVersion.ToString()} else {"1.0"}}

Но на самом деле всё это – лишние движения. Всё можно сделать гораздо проще.

Если ваш скрипт требует версии 2.0, вам достаточно в его начале поместить следующую строку:

#Requires -Version 2.0

PowerShell поймёт эту директиву, и при попытке запуска сценария в оболочке с версией ниже указанной, выдаст ошибку:

PS C:\Temp> . C:\Temp\test.ps1
The script 'test.ps1' cannot be run because it contained a "#requires" statement at 
line 1 for Windows PowerShell version 2.0 which is incompatible with the installed 
Windows PowerShell version of 1.0.
At line:1 char:2
+ .  <<<< C:\Temp\test.ps1

Вполне понятно, и не сложно.

Ниже, полный список критериев которые позволяет указать деректива Requires:

#requires -shellid 
#requires -version 
#requires -pssnapin  [-version ]

Например чтобы разрешить запуск сценария лишь в оболочке с подгруженной оснасткой AD Cmdlets, достаточно сделать так:

#Requires -PSSnapin Quest.ActiveRoles.ADManagement

Можно даже указать конкретную версию оснастки добавив ключ –Version. Причем если вы это сделаете, скрипт будет выполнятся именно с этой версией. Даже если установлена более поздняя – будет выдана ошибка.

Опубликовано в 2.0, PowerShell. Метки: , , . 2 комментария »

Улучшенные сообщения о сканировании портов от ISA Server 2004-2006

Итак, обещанный сценарий, с комментариями 🙂 О том как его использовать, можно прочитать здесь.

Читать далее…

Опубликовано в ISA. Метки: , , , . 3 комментария »

Улучшенные сообщения о сканировании портов от ISA Server 2004-2006

Не знаю как вам, а мне уже давно надоело получать от своего ISA Server’а оповещения о сканировании портов в виде совершенно неинформативного сообщения такого вида:

ISA Server detected a port scan attack from Internet Protocol (IP) address 77.41.105.127. A well-known port is any port in the range of 1-2048.

Что это за IP адрес, чей он? Может быть это гугл пытается проиндексировать что то хитрым способом, а может это китайские скрипт киддис веером пытаются отсканировать пол интернета в поисках подходящей уязвимости? Были ли уже сканирования с этого IP или этого блока ранее? Когда? Может быть Вася Пупкин, пользуясь динамическими адресами местного провайдера пытается запутать следы?

С другой стороны и игнорировать такую информацию тоже не хочется. Интересно знать заранее если кто-то интересуется моей сетью и конфигурацией файрволла 🙂

Поэтому я всё таки собрался, и написал относительно простенький скриптик на PowerShell, благодаря которому я теперь получаю вот такие вот, полезные сообщения 🙂

Читать далее…

Опубликовано в ISA. Метки: , , , . Комментарии к записи Улучшенные сообщения о сканировании портов от ISA Server 2004-2006 отключены

Ужастик :) Определение свободного места на дисках общих папок

Сейчас в чате всплыла задачка – как бы посмотреть свободное место на дисках соответствующих общим папкам. Причем метод через WMI показался слишком медленным, решать задачу средствами .Net было лень (так как навскидку не помню нужных классов, пришлось бы искать в msdn), ну а использование шустрейшего WinAPI требовало слишком много строк 🙂 Поэтому я решил пойти ужасно не красивым, зато действенным способом – разобрать текстовый вывод старых .exe утилит использующих API 🙂 Парсер для двух утилит с совершенно разным форматом вывода удалось набросать достаточно быстро 🙂 Причем выводит он уже не просто текст, а полноценные объекты, в лучших традициях PowerShell:

net share |where{$_ -match '^(\S+)\s+([a-z]:)\\'}|            
select @{name="Share";expression={$matches[1]}},             
    @{n="Disk";e={$matches[2]}},             
    @{n="FreeBytes";e={(fsutil volume diskfree $matches[2])[0] -replace '^.+: '}}
Опубликовано в Command line parsing. Метки: , , . 2 комментария »

Еще один русскоязычный блог о PowerShell

Опубликовано в News. Метки: , , . Комментарии к записи Еще один русскоязычный блог о PowerShell отключены