Windows: Подписать PowerShell скрипт

Вообще все это я затеял, потому что на компьютере сижу под пользователем БЕЗ админских прав, а на учетке админа установлен пароль. Поэтому при входе в сеанс мне уже стало лень набирать пароль для Process Explorer, cmd, Управление компьютером и т.п. Я решил все это запускать из под PowerShell консоли, запущенной под админом.

Сначала я пытался просто запустить скрипт, который находился на моем рабочем столе. Но сделав двойной клик на нем, я получил сообщение об ошибке:

File test.ps1 cannot be loaded because its execution is blocked 
by software restriction policies.

Я подумал, что это политика AppLocker и явно разрешил выполнение скрипта, но ошибка осталась.
Оказывается у PowerShell своя политика, которая настраивается отдельно, т.е. мне нужно либо её отключить, либо подписать скрипт.
Я выбрал подписать скрипт:
1. Качаем GRMSDK_EN_DVD.iso
2. Монтируем его в виртуальный привод (у меня это буква F:)
3. Распаковываем во временную папку (или сразу в C:\Program Files):

F:\Setup\WinSDKTools>msiexec /a WinSDKTools_x86.msi /qb TARGETDIR=d:\Temp

4. Копируем его в C:\Program Files
5. Переходим в эту папку:

cd C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\x64

6. Создаем корневой сертификат, используя в качестве удостоверяющего центра локальный компьютер:

makecert -n "CN=PowerShell User" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine

7. Появится запрос на ввод пароля для Private Key
8. Потом появится запрос на ввод этого пароля еще раз, вводим его.
9. Далее создаем персональный сертификат пользователя PowerShell. Им будем подписывать скрипты, заверяя его корневым сертификатом, созданным в пункте 6:

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

10. Появится очередное окно для ввода пароля, вводим пароль
11. Можно запустить PowerShell и проверить, создался ли сертификат:

Get-ChildItem cert:\CurrentUser\My -codesign
    Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
DCB69092451B7BCBE884E2AF89645CB33081FAD1  CN=PowerShell User
В настоящее время можно создать сертификат с помощью PowerShell:

$authenticode = New-SelfSignedCertificate -Subject "CN=PowerShell User" -CertStoreLocation Cert:\CurrentUser\My -Type CodeSigningCert

Правда в этом случае после подписания скрипта и его исполнения будет выдаваться предупреждение такого характера:

Status                 : UnknownError
StatusMessage          : A certificate chain processed, but terminated in a root certificate which is not trusted by
                         the trust provider

В этом случае лучше персональный сертификат экспортировать и импортировать в хранилище на локальной машине в Trusted Root Certification Authorities.
Тогда код для подписания скрипта будет использовать другой путь:

$authenticode = New-SelfSignedCertificate -Subject "CN=PowerShell User" -CertStoreLocation Cert:\LocalMachine\root -Type CodeSigningCert

Система может ругаться на то, что скрипт подписан издателем, который не находится в группе Доверенных:

Do you want to run software from this untrusted publisher?
File script.ps1 is published by CN=PowerShell User and is not trusted on your system. Only run scripts from trusted publishers.

В этом случае можно через консоль CERTLM.MSC экспортировать свой сертификат из хранилища «Trusted Root Certification Authorities», затем импортировать его в «Trusted Publishers».

 

12. Теперь файлы root.pvk и root.cer можно удалить из папки C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\x64. Информация о сертификатах теперь хранится в «C:\Documents and Settings\[имя пользователя]\Application Data\Microsoft\SystemCertificates\My\»
13. Пока скрипт нельзя запускать:

.\workspace.ps1
File C:\Users\Denis\Desktop\workspace.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:16
+ .\workspace.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

14. Теперь можно подписать скрипт:

Set-AuthenticodeSignature ".\workspace.ps1"  @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]

    Directory: C:\Users\Denis\Desktop


SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
DCB69092451B7BCBE884E2AF89645CB33081FAD1  Valid                                  workspace.ps1

15. В подписанный файл скрипта добавляются строчки вида:

# SIG # Begin signature block
# MIIEMwYJKoZIhvcNAQcCoIIEJDCCBCACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# пропущено...
# PGDYvCAVMstvVp6i1KlpNjLkXprN/Hs=
# SIG # End signature block

16. Запустив скрипт на этот раз нужно будет нажать клавишу A , это позволит в следующий запускать скрипт без подтверждения.
17. Для удобства я скопировал скрипт в папку System32.
*. На Windows 10 пришлось включить политики запуска подписанных скриптов (через PowerShell):

Set-ExecutionPolicy AllSigned
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 at http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): a

Сейчас тоже может появится ошибка, например такая:

File C:\Users\Denis\Desktop\workspace.ps1 cannot be loaded. A certificate chain processed,
but terminated in a root certificate which is not trusted by the trust provider.
At line:1 char:1
+ .\workspace.ps1
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
В этом случае нужно добавить сертификат в корневое хранилище. Для этого в Проводнике выбрать этот файл, нажать правую кнопку мыши и на вкладке Digital Signatures выбрать подпись, затем нажать кнопку DetailesView CertificateInstall Certificate

 

Если при создании сертификата появляется ошибка:

Error: File already exists for the subject ('root.pvk')
Error: Can't create the key of the subject ('root.pvk')
Failed

Нужно удалить файл сертификата root.pvk

Error: Can't access the key of the subject ('root.pvk')
Failed

Нужно было указать тот же пароль, что при создании сертификата.

Мой скрипт для запуска процессов с админскими правами:

Start-Process "C:\Program Files\Sysinternals\Process Explorer\procexp64.exe" -ArgumentList -t
Start-Process "C:\Windows\system32\cmd.exe"
Start-Process "C:\Program Files (x86)\Far Manager\Far.exe" -WindowStyle Maximized
Start-Process compmgmt
Start-Process eventvwr

Здесь Process Explorer запускается свернутым в область уведомлений, а окно Far Manager наоборот развернутым на весь экран.

Ссылка на статью. В той статье также рассказывается, как экспортировать сертификаты на новый компьютер.