Уроки Powershell – создаем первый скрипт
Первое что хочется сделать при изучении PowerShell, уверен у каждого, запустить какой нибудь мега-скрипт который покажет всю силу и полезность…
Не всегда стоит с этого начинать так как следуя по пути «надо сразу и сейчас» или «копипастнул и не взлетело» вы рискуете получить неправильное представление о powershell, возможно даже не оценив всех преимуществ вы рискуете отказаться от весьма полезного инструмента.
На первом уроке мы произвели небольшую разведку и проверили что консоль powershell мало чем отличается от стандартной командной строки, но за счет новых возможностей приобрела массу нужного и весьма полезного функционала.
На втором уроке мы «пробежались» по методикам получения справки прямо из консоли.
Сегодня мы создаем первый скрипт и в процессе разберемся со следующими моментами:
- Создаем PowerShell скрипты.
- Подписывание скриптов.
- Редактирование скриптов.
- Создание запланированных заданий.
На правах рекламы – рекомендую для ознакомления книгу Андрея Попова «Введение в PowerShell».
Создание скриптов

Если указанная выше опция не установлена то создание скриптов доступно прямо из окна проводника (вы можете менять расширение на нужное).
Практика
PS C:\temp> .\1.ps1 File C:\temp\1.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see «get-help about_signing» for more details. At line:1 char:8 + .\1.ps1 <<<< + CategoryInfo : NotSpecified: (:) [], PSSecurityException + FullyQualifiedErrorId : RuntimeException
Подобное поведение связано с тем что в настройках по умолчанию, считается что только команды могут выполняться интерактивно, а выполнение скриптов запрещено.
Естественно, в случае необходимости уровень выполнения политики (по умолчанию установлен Restricted) можно изменить.
Установка уровня политики ExecutionPolicy
Данное действие можно смело назвать процедурой настройки powershell с целью изменения текущего уровня безопасности который задается параметром «ExecutionPolicy», который можно изменить в реестре.
Он расположен по следующему пути:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
Однако, гораздо проще воспользоваться встроенной в powershell командой:
Get-ExecutionPolicy
PS C:\temp> Set-ExecutionPolicy RemoteSigned
Execution Policy Change The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the about_Execution_Policies help topic. Do you want to change the execution policy? [Y] Yes [N] No [S] Suspend [?] Help (default is «Y»): y
В зависимости от специфики выполняемых задач, в случаях, когда выполняются преимущественно сценарии собственного написания я бы рекомендовал использовать RemoteSigned. В случае когда выполняются сценарии, полученные из внешних источников стоит использовать AllSigned.
Подписывание скриптов
Для подписывания скрипта нам понадобится программа makecert.exe она входит в состав Microsoft .NET Framework SDK или Microsoft Windows Platform SDK.
Скачиваем пакет, устанавливаем.
Открываем командную строку (Win+r – cmd.exe) и вводим:
cd "C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\"
Создаем нужные сертификаты.
makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer
В результате должны получится два файла root.cer и root.pvk.
После этого проверим, удачно ли всё прошло.
PS C:> Get-ChildItem cert:\CurrentUser\My -codesign
Необходимые сертификаты созданы, остается подписать наш скрипт.
Для этого возьмём из справочного (get-help about_signing) руководства готовый пример кода.
## Sign a file
param([string] $file=$(throw "Please specify a filename."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert
В качестве переменной $file указываем имя нашего скрипта. Если при подписывании скрипта возвращается ошибка UnknownError то сохраните скрипт в кодировке UTF-8.
Результатом нашей работы получился файл следующего вида:
Write-Host «Hello!»
# SIG # Begin signature block
# MIIOPAYJKoZIhvcNAQcCoIIOLTCCDikCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUukjlMS+jNOxKqyd+oixh1rVp
…..
# Jj+zcmnLYpEMAPjaP8MFurZIgWroOUNFPKLQMKWHau1kmxPnKNrroAD/zG/0dIjg
# W04RHGBT3csXoEcwCA6oOSmyptp6rLtRn9AjR9epWj4SGgBrdiGZIp2vWZkOzGGa
# SIG # End signature block
Попробуем его запустить…
Нас спросят о том что нужно ли этому издателю доверять. Да! Кто бы сомневался… мы себе доверяем и разрешаем все.
PS C:\TEMP\> .\1.ps1 Do you want to run software from this untrusted publisher? The file C:\TEMP\1.ps1 is published by CN=PowerShell User. This publisher is not trusted on your system. Only run scripts from trusted publishers. [V] Never run [D] Do not run [R] Run once [A] Always run [?] Help (default is "D"):A Hello!
В дальнейшем мы можем запускать скрипты, подписанные созданным издателем. Однако, если мы выложим свой подписанный файл в открытый доступ или отправим его товарищам, то при включённой политике AllSigned он получит такое предупреждение:
PS C:\TEMP\> .\1.ps1 The file C:\TEMP\> .\1.ps1 cannot be loaded. The signature of the certificate can not be verified.
Так как для удаленного хоста он подписан неизвестно кем и доверия к нему нет никакого. Поэтому коллегам придется его посмотреть и при необходимости подписать самим.
В случае если в вашей организации уже есть развернутый доменный Центр Сертификации то ваша задача значительно облегчается до следующих пунктов:
- Получаем доменный сертификат для подписывания (Code Sign)
- Выполняем следующий скрипт:
$cert = @(dir cert:\CurrentUser\My -codesigning)[0] Set-AuthenticodeSignature $file $cert
Где $file – путь к скрипту и $cert – объект сертификата.
Редактирование скриптов

Для запуска Windows PowerShell ISE традиционным способом необходимо выбрать «Start»->»Accessories»->»Windows PowerShell», и нажать Windows PowerShell ISE. Я предпочитаю более простой метод – в командной строке набираем powershell_ise.exe и все.
Для Windows XP powershell_ise вызывается несколько иначе – «Start» -> «Programs» – > «Accessories»->»Windows PowerShell», и нажать Windows PowerShell ISE.
Если рассматривать сторонние редакторы я могу смело рекомендовать вам PowerGUI от Quest Software.
Создание запланированных заданий
Большинство скриптов используются для автоматизации задач администратора и естественно запускать их руками не то что бы лень, скорее это просто неправильно…
Поэтому необходимо такие задания запланировать. Для этого необходимо соответствующим образом настроить запуск вашего скрипта.
Приведу пример для Windows Server 2003:
- Cоздаем новую задачу, условно назовем ее «Example Task».
- Выбираем исполняемый файл: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- Задаем имя и интервал повторения.
- Задаем учетную запись, от имени которой будет выполняться задача.
- Ставим галочку «Оpen advanced properties…» и нажимаем Finish.
- В поле «Run» дописываем параметры запуска: -noprofile -command C:\Scripts\TestScript.ps1
Естественно есть и второй вариант, его можно использовать но в ряде случаев это нежелательно из соображений безопасности, например содержимое такого файла можно подменить для того что бы выполнить нужные действия контексте другого пользователя.
- Создаем cmd-файл для запуска PS-скрипта:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -command C:\Scripts\TestScript.ps1
- Задаем имя и интервал повторения.
- Задаем учетную запись, от имени которой будет выполняться задача.
Похожие статьи
Информация об авторе
|
|
Сергей Мариничев. Вы можете присоединиться ко мне в Facebook или в Twitter. |
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.
Вы можете оставить комментарий.

В разделе «Установка уровня политики ExecutionPolicy» съело слэши у раздела реестра.
Хотелось бы увидеть в одном из уроков рассказ о переменных среды. Это первое, что съело мне мозг в PS
Vadim SterkinЦитировать
Спасибо за отзыв.
Переменные среды уже запланированы, но малость позже.
Следующая заметка про параметры запуска и пр.
Сергей МариничевЦитировать
1) Политик 6 ,(подробнее get-help about_execution_policies).
2) Про ISE ,тоже вранье,есть и для Windows Xp и для Windows 2003 (http://msdn.microsoft.com/en-us/library/dd367962(v=vs.85).aspx)
KazunЦитировать
По п.1 не соглашусь.
Малость приболел и до Windows системы не добраться, но тем не менее http://technet.microsoft.com/en-us/library/dd347628.aspx
Да. Уровней выполнения не 4, но стоит ли указывать Bypass, Default и Undefined?
Из соображений любви к точности да, но в моей случае это излишне.
По п.2 спасибо. Откровенно говоря не знал т.к. рабочими местами уже лет 5 не интересуюсь.
Сергей МариничевЦитировать
В Windows Server 2008 нет встроенного инструмента PowerShell ISe,в Windows Server 2008 R2 он есть.Так же стоит указать,что обязательным требованием является – установленный .Net 3.5 Service Pack 1.
KazunЦитировать
Исправился.
Спасибо.
Сергей МариничевЦитировать
Конечно по п.1 можно быть не согласным,но политик ,как было 6 ,а не 4,так и осталось,а ваша статья,говорит об обратном.Нужны они или не нужны – это другой вопрос,но врать в статье,которую будут читать новички в мире PowerShell,да и тем кому хочется деталей – не хорошо.
KazunЦитировать
Ну, врать это сильно сказано…
Если бы я сказал что powershell это аналог bash или что то в этом роде то это было бы ложью, но в данном случае это недостаток информации.
Спасибо за здоровую критику, буду исправляться
Сергей МариничевЦитировать
Поправьте – «Существует четыре уровня политики ExecutionPolicy. Эти четыре уровня и требования включают в себя:»
KazunЦитировать
Исправил.
Сергей МариничевЦитировать
о,вот я и нашла,что почитать ночью. Автору отдельно уважение за то,что поправки принял. А то я бы с мобилы не пошла куда-то перепроверять. Хотя обычно читаю только оф.источники именно из-за таких моментов. Добавлю в закладки.
AlienЦитировать