ExecutionPolicy в PowerShell

Введение

Функция безопасности для управления условиями запуска скрипта.

Предотвращение выполнения вредоносных скриптов.

Ограничение выполнения скриптов определенными сеансами.

Политики выполнения для локального компьютера и текущего пользователя хранятся в реестре.

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

На компьютере с Windows можно установить политику выполнения для локального компьютера, текущего пользователя или конкретного сеанса.

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

Применение политик происходит только на платформах Windows.

Существующие политики

All Signed Policy

Порядок проверки:

Process → CurrentUser → LocalMachine → Restricted

Везде где будет запускаться PowerShell я использую полную команду powershell для совместимости со старыми Windows, например, Windows 7.

Если у вас относительно новая Windows, вы можете использовать алиас pwsh

Get-ExecutionPolicy

Пример получения текущей ExecutionPolicy

Get-ExecutionPolicy

Restricted

С помощью -List можно получить более подробный список.

PS C:\Users\Andrei> Get-ExecutionPolicy -List

Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine RemoteSigned

Рассмотрим файл Test.ps1 со следущим содержанием

Write-Host "Visit www.heihei.website!" -f Green

.\Test.ps1

Visit www.heihei.website!

Если теперь из режима администратора изменить политику запуска для LocalMachine на Restricted то скрипт не запустится.

Set-ExecutionPolicy Restricted
Get-ExecutionPolicy -List

Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine Restricted

.\Test.ps1

.\Test.ps1: File C:\demo\Test.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.

Если все политики установлены в режим Undefined по умолчанию выставляется Restricted

Get-ExecutionPolicy -List

Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine Undefined

.\Test.ps1

.\Test.ps1: File C:\demo\Test.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.

Set-ExecutionPolicy

Можно назначить область действия по умолчанию или конкретную область действия.

Область действия по умолчанию — LocalMachine, которая распространяется на всех пользователей компьютера.

Политики выполнения можно использовать для одного сеанса PowerShell.

Get-ExecutionPolicy

Restricted

Set-ExecutionPolicy Unrestricted

Get-ExecutionPolicy

Unrestricted

По-умолчанию задается политика для LocalMachine

Scope: политика для определённой области

Политику выполнения можно явно задать для определённой области

Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
Set-ExecutionPolicy AllSigned -Scope CurrentUser
Get-ExecutionPolicy -List

Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser AllSigned LocalMachine RemoteSigned

Если при такой политике попробовать выполнить скрипт Test.ps1 появится ошибки вызванная тем, что файл не подписан.

.\Test.ps1

.\Test.ps1: File C:\demo\Test.ps1 cannot be loaded. The file C:\demo\Test.ps1 is not digitally signed. You cannot run this script on the current system. For more information about running scripts and setting execution policy, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.

В такой ситуации нужно убрать ограничение с области CurrentUser

Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser

.\Test.ps1

Visit www.heihei.website!

Задать ExecutionPolicy на удаленной машине

Invoke-Command ` -ComputerName Computer ` -ScriptBlock { Get-ExecutionPolicy } | Set-ExecutionPolicy

Process: политика для текущей сессии

Чтобы задать ExecutionPolicy только для текущей сессии нужно выполнить следующую команду

powershell -ExecutionPolicy RemoteSigned

Get-ExecutionPolicy

RemoteSigned

Теперь текущая политика это RemoteSigned, несмотря на то, что LocalMachine политика это Unrestricted а CurrentUser политика Undefined.

Это произошло потому, что запустив PowerShell с указанием политики, мы задали её в области Process

Get-ExecutionPolicy -List

Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process RemoteSigned CurrentUser Undefined LocalMachine Unrestricted

В этой ситуации, мы можем определить политику запуска как Restricted для CurrentUser и скрипт всё-равно выполнится.

Set-ExecutionPolicy -ExecutionPolicy Restriced -Scope CurrentUser
Get-ExecutionPolicy -List

Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process RemoteSigned CurrentUser Restricted LocalMachine Unrestricted

.\Test.ps1

Visit www.heihei.website!

Bypass

Чтобы разрешить выполнение определённого скрипта без изменения общей политики нужно использовать команду Bypass

powershell.exe -ExecutionPolicy Bypass -File "Z:\pwsh\setup.ps1"

Вместо "Z:\pwsh\setup.ps1" укажите ваш скрипт

Автор статьи: Андрей Олегович

Изображение баннера