Вы когда-нибудь скачивали сценарий PowerShell, запускали его и сталкивались с пресловутой ошибкой ниже? Если да, вам понадобится командлет Set-ExecutionPolicy и этот учебник!

В этом посте вы узнаете о политиках выполнения PowerShell и о том, как их управлять с помощью командлета Set-ExecutionPolicy
. К концу этого поста вы не только будете знать, как запускать сценарии, но и как использовать политики выполнения!
Этот учебник написан с учетом Windows PowerShell, и все демонстрации проведены с использованием Windows PowerShell. Политики выполнения не уникальны для Windows PowerShell, и они работают очень похоже в PowerShell 6+. Но если вы работаете с PowerShell 6+, вы можете обнаружить небольшие различия в поведении.
Что такое политика выполнения?
Если вы когда-либо сталкивались с описанной выше ошибкой, вы столкнулись с политикой выполнения. Политики выполнения PowerShell – это механизм безопасности, предназначенный для защиты вашей системы от запуска зловредных сценариев. Политики выполнения не предотвращают запуск кода PowerShell в консоли в качестве оболочки, но запуск сценариев.
Как говорит Microsoft, политика выполнения технически не является “безопасностным” мероприятием, а скорее представляет собой врата, которые можно открывать и закрывать. В конце концов, вы легко можете обойти установленную политику выполнения, как вы узнаете позже.
Политики выполнения основаны на доверии. Если вы доверяете скрипту, вероятно, он не является вредоносным. Политики выполнения обычно не предотвращают выполнение скриптов всех типов. Их основная цель (особенно при более строгой конфигурации) – убедиться, что скрипт, который вы запускаете, криптографически подписан сертификатом.
Области политики выполнения
Как вы узнали, политики выполнения ограничивают выполнение скриптов, но PowerShell может выполнять скрипты во множестве различных контекстов. PowerShell выполняет скрипты от имени вошедшего в систему пользователя или в глобальном контексте машины, через запланированные задачи, запускаемые от имени SYSTEM, или в рамках одной открытой консоли PowerShell.
Для учета всех этих контекстов в PowerShell существует пять различных контекстов или областей, в которых можно определить политику выполнения.
- MachinePolicy – Эта область ограничена одним компьютером. Она влияет на всех пользователей, которые входят на этот компьютер, и устанавливается объектом политики группы Active Directory. Когда она определена, она имеет приоритет над всеми другими областями.
- LocalMachine. Это значение по умолчанию, которое влияет на всех пользователей компьютера и хранится в подразделе реестра HKEY_LOCAL_MACHINE. Когда вы устанавливаете политику выполнения с помощью
Set-ExecutionPolicy
, это значение по умолчанию.
Политика выполнения для LocalMachine хранится в реестровом ключе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.
- UserPolicy – Область UserPolicy влияет только на одного пользователя на компьютере, и ее устанавливает объект групповой политики Active Directory. Вы не можете изменить эту политику с помощью
Set-ExecutionPolicy
. - CurrentUser. Область политики CurrentUser устанавливает политику выполнения только для текущего пользователя и хранится в разделе реестра HKEY_CURRENT_USER. Вы не можете изменить эту политику с помощью
Set-ExecutionPolicy
.
Политика выполнения для CurrentUser хранится в реестровом ключе HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.
- Process – Эта область определяет политику выполнения для отдельной сессии PowerShell для одного пользователя. Область политики выполнения Process является самой детализированной политикой выполнения, которую вы можете определить. В отличие от других политик выполнения, эта политика сохраняется в переменной среды под названием
PSExecutionPolicyPreference
, а не в реестре.
Типы политик выполнения
Исполнительные политики имеют различные “уровни безопасности”. Эти уровни определяют степень строгости исполнительной политики. Например, вы можете установить исполнительную политику, которая фактически ничего не делает; она отключена. С другой стороны, исполнительная политика может полностью запретить выполнение сценариев.
Давайте рассмотрим каждый из способов настройки уровня безопасности исполнительной политики от наименее строгого до наиболее ограничивающего.
Несанкционированное
Наименее строгая политика – это та, которая вообще не влияет; это Unrestricted. Исполнительные политики Unrestricted фактически отключены. Пользователи могут выполнять все сценарии независимо от доверия, когда исполнительная политика установлена в Unrestricted.
Обход
Как и тип Unrestricted, исполнительная политика, установленная в Bypass, ничего не блокирует.
Хотя Bypass и Unrestricted имеют схожий эффект, тип исполнительной политики Bypass технически не является типом вообще. Он полностью пропускает определенную исполнительную политику.
Неопределенное
Хотя это редко используется, вы можете практически удалить исполнительную политику, установив ее в Undefined. Когда вы устанавливаете исполнительную политику в Undefined, PowerShell полностью удаляет любые назначенные исполнительные политики из назначенной области.
На компьютерах, не работающих под управлением Windows, исполнительная политика всегда установлена на Unrestricted и не может быть изменена.
Когда все области установлены как Undefined, PowerShell фактически рассматривает все области как Restricted.
RemoteSigned
Как вы уже читали ранее, политики выполнения – это все о доверии, заработанном с помощью цифровой подписи на сценариях. PowerShell также учитывает, откуда получен этот сценарий. Был ли он создан на вашем локальном компьютере или кем-то случайным в Интернете?
Сценарии, созданные не на вашем локальном компьютере, не должны быть безусловно доверенными. Поэтому PowerShell предоставляет политику выполнения RemoteSigned. Политика выполнения RemoteSigned обеспечивает, что все сценарии написаны не на вашем локальном компьютере, должны быть криптографически подписаны.
Вы можете переопределить эту политику выполнения в некоторой степени для файлов, загруженных из Интернета, используя
Unblock-File
командлет. Получите более подробную информацию о таком поведении немного позже в разделе Как работает политика RemoteSigned.
Для Windows Server RemoteSigned назначается в качестве политики по умолчанию.
AllSigned
Если вы хотите обеспечить криптографическую подпись для всех сценариев PowerShell, установите политику выполнения на AllSigned. Как и RemoteSigned, эта политика выполнения идет дальше и требует, чтобы все сценарии были подписаны перед выполнением.
Даже если у вас установлена политика выполнения AllSigned, вы все равно можете обойти ее, как вы узнаете позже.
Restricted
Самая строгая политика выполнения – Restricted. Когда политика выполнения установлена как Restricted, никакие сценарии не могут выполняться, независимо от того, доверенные они или нет. Эта политика фактически полностью отключает выполнение сценариев.
В отличие от менее строгих типов, тип Restricted гарантирует, что файлы форматирования PowerShell и файлы конфигурации (PS1XML), файлы сценариев модулей (PSM1) и профили PowerShell не могут выполняться.
По умолчанию все клиенты Windows установлены на выполнение политики Restricted.
Технически Microsoft определяет седьмую политику выполнения с именем Default, но этот тип по сути является ещё одной меткой для RemoteSigned (Windows Server) и Restricted (Windows Clients).
Как работает политика RemoteSigned
Одна конкретная ситуация, которую стоит отметить, – это как работает политика выполнения RemoteSigned. Эта политика выполнения (как вы узнали) предотвращает запуск сценариев, созданных не на вашем локальном компьютере.
Но как PowerShell узнает, что сценарий был создан в другом месте? Потоки данных.
Понимание и запрос данных NTFS
Когда вы создаёте файл на файловой системе NTFS, NTFS применяет атрибут alternate data stream (ADS) к файлу. У ADS есть два атрибута файла: $Data и zone.Identifier. PowerShell использует атрибут zone.Identifier, чтобы определить, был ли создан сценарий PowerShell в другом месте.
В отличие от других атрибутов, таких как Compressed или Read Only, атрибуты ADS скрыты в Проводнике. Однако, используя PowerShell, вы можете проверить эти потоки данных.
Запустите командлет Get-Item
, используя путь к скрипту и параметр Stream
, как показано ниже. В этом примере Hello World.ps1 был написан на локальном компьютере. Обратите внимание, что единственный присвоенный атрибут свойства Stream
– это $DATA
. Здесь нет атрибута ADS.

Теперь выполните ту же команду для скрипта, загруженного из Интернета. Заметьте, что теперь Get-Item
возвращает другой объект с полностью другим Stream
с Zone.Identifier
.

Когда вы узнаете, что у файла есть атрибут ADS, вы можете использовать команду Get-Content
, чтобы узнать zone. Зона определяет, откуда пришел файл.
Get-Content
вернет значение ZoneId
, представляющее зону, из которой пришел файл.

Возможные значения зоны:
Execution Policy Precedence
Как уже упоминалось выше, существует множество различных политик выполнения одновременно. Все эти политики выполнения, когда они объединены, определяют параметры вашей текущей сессии. Когда у вас действуют несколько политик выполнения, важен порядок их применения.
Приоритет политики – это порядок, в котором PowerShell применяет различные политики, установленные на разных уровнях. Некоторые политики выполнения имеют более высокий приоритет, чем другие.
Когда вы запускаете Get-ExecutionPolicy -List
, вы увидите все текущие политики выполнения, упорядоченные от наименьшего приоритета к наивысшему. Например, поскольку MachinePolicy имеет более низкий приоритет, политики LocalMachine и CurrentUser переопределят его.

Работа с политиками выполнения
Поняв основы политик выполнения, давайте теперь рассмотрим, как с ними работать! Для работы с политиками выполнения PowerShell у вас есть две команды: Get-ExecutionPolicy
для выявления текущих политик и Set-ExecutionPolicy
для установки новых политик.
Получение текущих назначенных политик
Прежде чем начать изменять политики выполнения, вам нужно узнать, с чем вы работаете. Для этого у вас есть команда Get-ExecutionPolicy
. Эта команда перечисляет все текущие политики на компьютере.
Когда вы напрямую выполняете команду Get-ExecutionPolicy
в консоли PowerShell без параметров, она покажет политику выполнения, установленную для вашей текущей сессии PowerShell.

Чтобы увидеть политику выполнения, установленную для области, укажите параметр Scope
, используя имя области, для которой вы хотите увидеть результаты.

Чтобы просмотреть все области и их политики выполнения, используйте параметр List
, как показано ниже.

Изменение политик выполнения
Как только вы узнаете, какие политики выполнения в настоящее время назначены, вы также можете их изменить. Чтобы изменить политику на одном компьютере, у вас есть команда Set-ExecutionPolicy
в вашем распоряжении. Но если вы находитесь в организации, вам захочется изменить политики массово. Если это так, у вас всегда есть Групповая политика, если вы находитесь в домене Active Directory.
Использование Set-ExecutionPolicy
Давайте сначала рассмотрим, как изменить политики с помощью команды Set-ExecutionPolicy
. Для этого откройте PowerShell от имени администратора.
Теперь выполните команду Set-ExecutionPolicy
с единственным параметром (ExecutionPolicy
), указав название политики выполнения.
Затем PowerShell спросит, хотели бы вы изменить политику выполнения. Если да, введите Y или A и нажмите Enter.

Некоторые команды PowerShell должны выполнять несколько других задач для работы. Если в приведенном выше примере вы вводите Y
, PowerShell может запросить продолжение для каждого шага. Если вы нажмете A
, он продолжит для всех последующих шагов.
Выполнение Set-ExecutionPolicy
без запросов.
По умолчанию, при запуске команды Set-ExecutionPolicy
, вас спросят, хотите ли вы изменить политику выполнения. Вы можете пропустить это предупреждение, добавив параметр Force
к вашей команде. Использование параметра Force
подавит все запросы подтверждения.

Настройка политики выполнения PowerShell через реестр
Поскольку большинство политик выполнения хранятся в реестре (исключая Process), вы также можете изменить политики напрямую через реестр.
Для изменения политик выполнения через реестр:
- Откройте Редактор реестра Windows (regedit) или выбранный вами инструмент редактирования реестра.
2. Перейдите к ключу реестра области политики выполнения, которую вы хотите изменить.
LocalMachine – HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
CurrentUser – HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
3. Щелкните правой кнопкой мыши по ключу реестра и создайте новое строковое значение с именем ExecutionPolicy.
4. Дважды щелкните на только что созданное строковое значение ExecutionPolicy и введите желаемое имя политики выполнения (Restricted, RemoteSigned, AllSigned, Unrestricted, или Undefined).
5. Создайте еще одно строковое значение в том же ключе с именем Path. Строковое значение Path представляет собой путь к среде выполнения PowerShell. Убедитесь, что значение Path равно C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, указывающее на среду выполнения Windows PowerShell.

Политика выполнения CurrentUser переопределяет политику LocalMachine. Если у вас установлена политика CurrentUser в реестре и вы пытаетесь изменить политику выполнения с помощью Set-ExecutionPolicy
, который по умолчанию устанавливает политику в области LocalMachine, PowerShell вернет ошибку, показанную ниже.

Настройка политики выполнения PowerShell с помощью объекта политики группы
Если вы работаете в организации с Active Directory, вам не захочется обходить все ваши компьютеры с Windows и выполнять cmdlet Set-ExecutionPolicy
. Вместо этого вы можете управлять политиками массово с помощью объекта политики группы.
Для управления политиками выполнения через GPO:
Создайте объект политики группы
- Откройте приложение управления политикой группы на контроллере домена или на вашей рабочей станции, присоединенной к домену.

2. Разверните Домены —> <ваш лес Active Directory> —> Объекты политики группы.

3. Щелкните правой кнопкой мыши по Объекты политики группы и выберите Создать.
4. Назовите вашу ГПО. В этом учебнике ГПО называется Политика выполнения PowerShell.

5. Щелкните правой кнопкой мыши на только что созданной ГПО и выберите Правка.
6. Перейдите в раздел Конфигурация компьютера\Политики\Административные шаблоны\Компоненты Windows\Windows PowerShell.

7. Откройте параметр в правой панели окна, откройте параметр Включить выполнение сценариев.

8. В поле Включить выполнение сценариев выберите вариант Включено. Теперь можно выбрать любой из показанных ниже вариантов:
9. Теперь измените Политику выполнения на нужную вам политику.
- Разрешить только подписанные сценарии – Разрешает выполнение всех сценариев, когда они подписаны доверенным издателем.
- Разрешить локальные сценарии и сценарии, подписанные удаленно – Разрешает выполнение локальных сценариев, но сценарии, загружаемые из Интернета, должны быть подписаны доверенным издателем.
- Разрешить все сценарии – Разрешает выполнение всех сценариев.

Назначьте объект групповой политики
После создания ГПО пришло время назначить его целевым компьютерам. Для этого вы должны назначить ГПО организационному контейнеру Active Directory (OU).
Если вместо создания новой ГПО вы отредактировали существующую ГПО, то, вероятно, она уже назначена OU.
- В Управлении групповыми политиками перейдите в выбранный вами ОУ, перейдя в Домены —> <ваш лес Active Directory> —> <Ваш ОУ>.
2. Щелкните правой кнопкой мыши по ОУ и выберите Связать существующую GPO…

3. Выберите только что созданную GPO (Политика выполнения PowerShell) и нажмите OK.

Теперь вы должны увидеть, что GPO назначено для ОУ, как показано ниже.

На этом этапе вы можете либо дождаться заданного интервала обновления групповой политики, либо выполнить команду gpupdate на целевом компьютере, чтобы принудительно обновить его.
Блокировка изменений локальной политики
Как только GPO начинает действовать и изменять политику выполнения, локальные пользователи уже не могут изменить политику через локальную консоль PowerShell. Если они попытаются это сделать, они получат ошибку, как показано ниже.

Полное обходное выполнение политики
Как уже упоминалось ранее, политика выполнения не обязательно должна быть мерой безопасности. Почему? Потому что вы можете полностью обойти ее, если захотите, несколькими различными способами.
Использование параметра -ExecutionPolicy Bypass
В отличие от других политик выполнения, политика Bypass обычно не устанавливается в консоли PowerShell, а передается в движок powershell.exe, запускаемый от имени администратора.
Например, чтобы запустить сценарий с именем Hello World.ps1, полностью пропустив любую политику выполнения, вызовите powershell.exe, используйте параметр Bypass
и укажите путь к файлу, как показано ниже.

Чтение сценариев и выполнение исходного кода
Вы также можете обойти любую политику выполнения, сначала прочитав содержимое сценария, а затем передав его напрямую в движок PowerShell. При этом каждая команда выполняется индивидуально, а не как целый сценарий сразу.
Как видно ниже, политика выполнения установлена на Restricted, но считывая сценарий и передавая его в powershell.exe, он все равно работает.
Этот подход аналогичен открытию сценария в редакторе PowerShell, таком как PowerShell ISE или Visual Studio Code, выбору строки и нажатию F8.

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