вторник, 27 ноября 2012 г.

Развертывание решений SharePoint с помощью PowerShell (часть 3)

Теперь пришло время поговорить о том, как же оживлять написанные нами скрипты.
Сегодня мы создаем первый скрипт и в процессе разберемся со следующими моментами:
  1. Создаем PowerShell скрипты.
  2. Подписывание скриптов.
  3. Редактирование скриптов.
  4. Создание запланированных заданий.
1. Создание скриптов
Скрипт на powershell является обычным текстовым файлом с расширением “.ps1” поэтому правой кнопкой мыши нажимаем “Создать” – “Текстовый документ”, вводим имя файла, присваиваем ему расширение PS1, нажимаем Enter.
Примечание: По умолчанию, из соображений безопасности, при двойном клике он не запускается а открывается в текстовом редакторе. Проверьте снята ли у вас галка “Скрывать расширения у зарегистрированных файлов”.

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

Практика

Создайте в папке 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.

2. Подписывание скриптов

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

Для запуска 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.

4. Создание запланированных заданий

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

Комментариев нет:

Отправить комментарий