Уроки Powershell – создаем первый скрипт

ScriptПервое что хочется сделать при изучении PowerShell, уверен у каждого, запустить какой нибудь мега-скрипт который покажет всю силу и полезность…

Не всегда стоит с этого начинать так как следуя по пути «надо сразу и сейчас» или «копипастнул и не взлетело» вы рискуете получить неправильное представление о powershell, возможно даже не оценив всех преимуществ вы рискуете отказаться от весьма полезного инструмента.

На первом уроке мы произвели небольшую разведку и проверили что консоль powershell мало чем отличается от стандартной командной строки, но за счет новых возможностей приобрела массу нужного и весьма полезного функционала.

На втором уроке мы «пробежались» по методикам получения справки прямо из консоли.

Сегодня мы создаем первый скрипт и в процессе разберемся со следующими моментами:

  1. Создаем PowerShell скрипты.
  2. Подписывание скриптов.
  3. Редактирование скриптов.
  4. Создание запланированных заданий.

На правах рекламы — рекомендую для ознакомления книгу Андрея Попова «Введение в PowerShell».

Создание скриптов

Скрипт на powershell является обычным текстовым файлом с расширением «.ps1» поэтому правой кнопкой мыши нажимаем «Создать» — «Текстовый документ», вводим имя файла, присваиваем ему расширение PS1, нажимаем Enter.
Примечание: По умолчанию, из соображений безопасности, при двойном клике он не запускается а открывается в текстовом редакторе. Проверьте снята ли у вас галка «Скрывать расширения у зарегистрированных файлов».
ps-03-02

Если указанная выше опция не установлена то создание скриптов доступно прямо из окна проводника (вы можете менять расширение на нужное).

Если указанная опция включена то вам придется менять расширение файла любым доступным методом, например из командной строки или из файлового менеджера.

Практика

Создайте в папке C:\TEMP скрипт 1.ps1 со следующим содержимым
Write-Host "Hello!"
Запустите powershell (Win+R, вводим powershell.exe и нажимаем enter), перейдите с папку командой cd C:\TEMP и попробуйте запустить скрипт командой .\1.ps1
В результате 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
Существует шесть уровней политики ExecutionPolicy:
Restricted
Это конфигурация PowerShell по умолчанию. Этот вариант означает, что никакие скрипты не могут быть запущены. Единственное, что можно делать в PowerShell при такой настройке — это выполнять одиночные команды.
AllSigned
Эта настройка позволяет выполнять скрипты. Скрипт должен быть подписан сертификатом от доверенного источника. Перед выполнением подписанного скрипта будет выводится предупреждение.
RemoteSigned
Эта настройка позволяет выполнять скрипты, но требует, чтобы все скрипты и файлы конфигурации, загруженные из Интернета, были подписаны сертификатом от доверенного источника. Скриптам, выполняющимся на локальном компьютере, подпись не требуется. Предупреждений перед запуском скриптов не выводится.
Unrestricted
Такая настройка используется чеще всего но она потенциально опасна и крайне не рекомендована. Такая настройка позволяет запускать неподписанные скрипты, включая загруженые из Интернета.
Bypass
Ничто не блокируется и никаких предупреждений не выводится.
Undefined 
Удаляет присвоенную в настоящий момент политику.
В случае необходимости уровень разрешений запуска изменяется командой:

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-file.ps1
## 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 7 и Windows Server 2008 R2 есть встроенный инструмент под названием Интегрированная Среда Сценариев Windows PowerShell (ISE), которую можно назвать официальным GUI для написания скриптов на powershell. Функционал ISE весьма широк — цветовая разметка синтаксиса, заполнение вкладок, визуальная отладка, совместимость с Юникодом и хорошая контекстная справка.
Установка ISE требует инсталляции .Net 3.5 Service Pack 1 о чем вам сообщают при выборе компонентов.
Для серверной системы проблем с редактированием скриптов так же нет, только требуется доустановить нужный компонент.
PowerShell ISE

Для запуска 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
  • Задаем имя и интервал повторения.
  • Задаем учетную запись, от имени которой будет выполняться задача.

Информация об авторе

no
image
Сергей Мариничев.
Вы можете присоединиться ко мне в Facebook или в Twitter.

Если Вам понравилась статья, то вы можете подписаться на RSS.
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.

Получать обновления на email

Вы можете оставить комментарий.

24 Комментариев »

 
  • 1# Vadim Sterkin (25 комм.):

    В разделе «Установка уровня политики ExecutionPolicy» съело слэши у раздела реестра.

    Хотелось бы увидеть в одном из уроков рассказ о переменных среды. Это первое, что съело мне мозг в PS 🙂

      Цитировать

  • 3# Kazun (93 комм.):

    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)

      Цитировать

    • 4# Сергей Мариничев (1147 комм.):

      По п.1 не соглашусь.
      Малость приболел и до Windows системы не добраться, но тем не менее http://technet.microsoft.com/en-us/library/dd347628.aspx
      Да. Уровней выполнения не 4, но стоит ли указывать Bypass, Default и Undefined?
      Из соображений любви к точности да, но в моей случае это излишне.

      По п.2 спасибо. Откровенно говоря не знал т.к. рабочими местами уже лет 5 не интересуюсь.

        Цитировать

  • 5# Kazun (93 комм.):

    В Windows Server 2008 нет встроенного инструмента PowerShell ISe,в Windows Server 2008 R2 он есть.Так же стоит указать,что обязательным требованием является — установленный .Net 3.5 Service Pack 1.

      Цитировать

  • 7# Kazun (93 комм.):

    Конечно по п.1 можно быть не согласным,но политик ,как было 6 ,а не 4,так и осталось,а ваша статья,говорит об обратном.Нужны они или не нужны — это другой вопрос,но врать в статье,которую будут читать новички в мире PowerShell,да и тем кому хочется деталей — не хорошо.

      Цитировать

    • 8# Сергей Мариничев (1147 комм.):

      Ну, врать это сильно сказано…
      Если бы я сказал что powershell это аналог bash или что то в этом роде то это было бы ложью, но в данном случае это недостаток информации.

      Спасибо за здоровую критику, буду исправляться 🙂

        Цитировать

  • 9# Kazun (93 комм.):

    Поправьте — «Существует четыре уровня политики ExecutionPolicy. Эти четыре уровня и требования включают в себя:»

      Цитировать

  • 11# Alien (1 комм.):

    о,вот я и нашла,что почитать ночью. Автору отдельно уважение за то,что поправки принял. А то я бы с мобилы не пошла куда-то перепроверять. Хотя обычно читаю только оф.источники именно из-за таких моментов. Добавлю в закладки.

      Цитировать

  • 12# mikolyarus (1 комм.):

    а можно под каждым уроком добавлять ссылку на следующий урок, чтобы был некий логический порядок? я только начинаю осваивать powershell и несколько неудобно скакать по темам в поисках того что я еще не читал. спасибо.

      Цитировать

  • 14# Даниил (2 комм.):

    Вопрос: Накидал скрипт… он у меня подтягивает x86 COM компоненту, а так как у меня Win7 x64 то скрипт стартует powershell’ом x64 и валится ошибка при создании COM объекта… можно ли в скрипте указать какой либо параметр чтобы он стартовался powershell x86?

      Цитировать

    • 15# Сергей Мариничев (1147 комм.):

      Подозреваю что нужен запуск именно 32-битной версии powershell

      Попробуйте запускать напрямую. Вот пути для 32 бит и для 64 бит:
      32-bit PowerShell C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
      64-bit PowerShell C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

        Цитировать

  • 16# Даниил (2 комм.):

    Да это-то я понимаю… Интересует возможность в самом сценарии указать параметр чтоб система сама знала скольки разрядным powershell исполнять данный сценарий? Или так и придется прикручивать к x32 сценариям start.cmd со строкой: C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe .\skript.ps1? и цмыкать мышой уже его?

      Цитировать

    • 17# Сергей Мариничев (1147 комм.):

      Ну как бы надо определится с задачами.
      Если это запланированное задание то в параметры забиваем нужное.
      Если надо запускать ps на 32 бита то проще сделать ярлык.

        Цитировать

  • 18# Alexandr Elizarov (1 комм.):

    Спасибо большое за пост. Подскажите я подписал скрипт, как теперь компьютеры на которых я буду его запускать, определит что если скрипт подписан мной то его можно запустить?

      Цитировать

 

Добавить комментарий

XHTML: Вы можете использовать тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>