В операционной системе Windows 10 имеется мощный инструмент для управления и выполнения различных задач — это PowerShell. Эта консоль предназначена для администраторов, поскольку она позволяет им контролировать всю операционную систему с помощью сценариев (script). PowerShell используется многими фоновыми приложениями для внесения изменений в систему и это ставит под угрозу безопасность нашего ПК.
Сценарий (script) — простая программа написана в коде, который работает линейно на нашем компьютере. Мы можем создавать и выполнять собственные сценарии для автоматизации задач, или приложения могут выполнять их для выполнения определенных конфигураций и задач. По умолчанию Windows 10 не запрещает ни приложениям, ни нам запускать сценарии в системе, если они подписаны или являются "своими". Проблема возникает, когда мы запускаем свой скрипт, и нам выдает ошибку "Выполнение сценариев отключено в этой системе". Это многоуровневая мера безопасности в PowerShell, которая предотвращает запуск вредоносных сценариев и может нанести вред системе. Давайте разберем, как изменить политики безопасности для PowerShell.
Политики выполнения скриптов в PowerShell
Если вы увидели ошибку "Выполнение сценариев отключено в этой системе", то можем проверить конфигурацию политик для запуска сценариев, которые настроены в Windows 10. Откройте PowerShell от имени администратора и:
- Get-ExecutionPolicy -List
Мы можем видеть несколько уровней разрешений политик для запуска сценариев.
Чтобы изменить политику запуска скрипта, вы должны знать различные уровни привилегий, которые мы можем назначить каждому из областей.
- Restricted: заблокировано выполнение любых скриптов, но разрешается работа интерактивных команд.
- RemoteSigned: загруженные скрипты должны быть подписаны доверенным издателем. Локальные скрипты работают без подписи
- AllSigned: разрешает выполнение любого подписанного скрипта, как локального, так и удаленного (загруженного).
- Unrestricted: без ограничений. Вы можете запустить все сценарии, даже те, которые не подписаны.
Когда вы знаете условия и ограничения скриптов, то можете изменить их. К примеру, чтобы исправить ошибку "Выполнение сценариев отключено в этой системе" достаточно ввести один апплет. Откройте PowerShell от имени админа и:
- Set-ExecutionPolicy Unrestricted -Scope CurrentUser — запуск без ограничения для пользователя.
- Set-ExecutionPolicyRestricted -Scope CurrentUser вернуть назад, если будет нужно.
Разрешает без ограничений выполнять сценарии для локального пользователя. Ключ -Scope определяет, к чему применяется изменение политики. Когда вы вводите "CurrentUser", то применяется только к текущему пользователю, а когда вы вводите "LocalMachine", он применяется ко всей системе.
Если выше способ не помог вам запустить свой скрипт и ошибка "Выполнение сценариев отключено в этой системе" появляется, то можно снять полностью ограничения. Вы должны понимать, что это большой риск и ваш скрипт должен быть безопасен на 101%. Откройте PowerShell от имени админа и:
- Set-ExecutionPolicy Unrestricted — разрешить выполнение скриптов без ограничений.
- Set-ExecutionPolicy Restricted — вернуть назад по умолчанию.
Итак, я решил протестировать работу скриптов powershell на Windows Server 2003. Имеем следующий файл находящийся в корне диска C: с именем audit.ps1.
Пытаюсь его запустить в консоли.
C:WINDOWSsystem32windowspowershellv1powershell.exe
Следует изменить настройки безопасности для Windows PowerShell. Для этой цели используются два командлета: getexecutionpolicy и set-executionpolicy. С помощью get-executionpolicy вы получаете существующие настройки. Существует четыре уровня безопасности:
Restricted (Запрещено, по умолчанию) Сценарии не запускаются.
Allsigned (Все подписанные) Запускаются только подписанные сценарии.
RemoteSigned (Удаленные подписанные) Разрешен запуск локальных сценариев, прочие сценарии должны быть подписаны.
Unrestricted (Без ограничений) Запускаются все сценарии.
Для изменения этих настроек системный администратор должен вызвать, например,
Запуск PowerShell скрипта
Данная заметка посвящена описанию настройки необходимых параметров для запуска PowerShell скриптов. Чаще при первом запуске .ps1 скриптов вы видите следующие ошибки:
Файл невозможно загрузить. Файл не имеет цифровой подписи. Скрипт не будет выполнен в системе. Чтобы получить дополнительные сведения, введите команду «Get-Help about_signing».
The file cannot be loaded. The file is not digitally signed. The script will not execute on the system. Please see «Get-Help about_Signing» for more details.
Запустить программу от ненадежного издателя? Файл опубликован CN=
. Этот издатель не помечен как надежный в данной системе. Выполнять следует только скрипты надежных издателей.
[V] Никогда не выполнять [D] Не выполнять [R] Выполнить один раз [A] Всегда выполнять [?] Справка (по умолчанию «D»):
Do you want to run software from this untrusted publisher? The file is published by CN=
. 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»):
Данные ошибки и сообщения вызваны настройками политики выполнения Windows PowerShell. При этом не стоит думать, что эти параметры действительно повышают безопасность ОС, ведь код все равно отработает, если его скопировать в к консоль PowerShell. Таким образом, настройки безопасности можно отключить — они защищают только от случайных действий. Поэтому обычно данную проблему решают командой:
Применить данную команду рекомендуется в консоли PowerShell запущенной от имени администратора. Данная команда разрешит выполнять, на данном компьютере, не подписанные скрипты и скрипты из Интернета.
Конечно, такой подход не применим в корпоративной среде, поэтом разберемся более подробно с данной ситуацией. Посмотреть текущие настройки политики во всех областях применения можно выполнив командлет Get-Executionpolicy с параметром list.
Результат выполнения командлета:
Scope | ExecutionPolicy |
—— | ————— |
MachinePolicy | Unrestricted |
UserPolicy | Undefined |
Process | RemoteSigned |
CurrentUser | AllSigned |
LocalMachine | Restricted |
Данная политика может принимать 6 значений:
Restricted (Политика выполняется по умолчанию. Например если во всех областях применения стоит значение Undefined)
— Допускает отдельные команды, но скрипты выполнять нельзя.
— Препятствует выполнению всех файлов скриптов, включая файлы форматирования и конфигурации (PS1XML), файлы скриптов модулей (PSM1) и профили Windows PowerShell (PS1).
AllSigned
— Выполнение скриптов разрешено.
— Требует, чтобы все скрипты и файлы конфигурации были подписаны надежным издателем, в том числе скрипты, подготовленные на локальном компьютере.
— Перед выполнением скриптов издателей, для которых еще не определено, являются ли они надежными, выводятся предупреждения.
— Имеется риск выполнения неподписанных скриптов из источников, отличных от Интернета, а также подписанных, но вредоносных скриптов.
RemoteSigned
— Выполнение скриптов разрешено.
— Требует наличия цифровой подписи надежного издателя у скриптов и файлов конфигурации, загружаемых из Интернета (включая электронную почту и программы мгновенного обмена сообщениями).
— Не требует наличия цифровых подписей у скриптов, выполняемых и написанных на локальном компьютере (не загруженных из Интернета).
— Имеется риск выполнения подписанных, но вредоносных скриптов.
Unrestricted
— Могут выполняться неподписанные скрипты. (Имеется риск выполнения вредоносных скриптов.)
— Предупреждает пользователя перед выполнением скриптов и файлов конфигурации, загруженных из Интернета.
Bypass
— Ничего не блокируется, и никакие предупреждения и запросы не появляются.
— Эта политика выполнения предназначена для конфигураций, в которых скрипт Windows PowerShell встроен в более крупное приложение, или для конфигураций, в которых Windows PowerShell является платформой для программы, у которой имеется собственная модель обеспечения безопасности.
Undefined
— В текущей области не задана политика выполнения.
— Если политика выполнения во всех областях имеет значение Undefined, действует политика выполнения Restricted, которая является политикой выполнения по умолчанию.
Существует пять областей применения данной политики и параметров:
MachinePolicy и UserPolicy задаются политиками AD или локальными политиками данного компьютера.
Process — область применения текущая ссесия. В справке говорится, что её значение хранится в переменной $PSExecutionPolicyPreference однако получить/изменить значение данной политики через переменную не удалось. Измения сделанные на эту область применения ни как не повлияют на другие сессии.
CurrentUser — область применения текущей пользователь. Её значение хранится в разделе реестра HKEY_CURRENT_USER («HKEY_CURRENT_USERSoftwareMicrosoftPowerShell1ShellIdsMicrosoft.PowerShellExecutionPolicy»).
LocalMachine — область применения на всех пользователей текущего компьютера. Она хранится в разделе реестра HKEY_LOCAL_MACHINE(«HKEY_LOCAL_MACHINESOFTWAREMicrosoftPowerShell1ShellIdsScriptedDiagnosticsExecutionPolicy»).
У команды get-executionpolicy есть параметр -Scope. С помощью данного параметра можно выбрать область применения для которого отобразиться значение политики.
Get-ExecutionPolicy -scope Process
Результат выполнения командлета: RemoteSigned
При этом Области применения имеют приоритет высшим обладает MachinePolicy, потом UserPolicy, Process, CurrentUser и самый низкий приоритет у LocalMachine.
Поэтому в примере:
Scope | ExecutionPolicy |
—— | ————— |
MachinePolicy | Unrestricted |
UserPolicy | Undefined |
Process | RemoteSigned |
CurrentUser | AllSigned |
LocalMachine | Restricted |
В текущей ссесии результирующая политика будет иметь значение Unrestricted.
Для того что бы узнать значение политики выполнения скриптов для данной сесии, надо применить командлет Get-ExecutionPolicy без параметров.
Что бы изменять значение политик выполнения скриптов PowerShell, существует коммандлет Set-ExecutionPolicy.
Данный командлет имеет следующие параметры:
-ExecutionPolicy
Указывает значение политики. Может иметь следующие значения: Restricted, AllSigned, RemoteSigned, Unrestricted, Bypass, Undefined. Данный параметр обязательный для указания. Если не указан, во время выполнения комадлет попросит указать значения.
Вывод:
Укажите значения для следующих параметров:
ExecutionPolicy:
-Scope
Определяет область применения данной политики. Может иметь следующие значения: LocalMachine ,Process, CurrentUser. Если параметр области применения не указан, по умолчанию указывается значение LocalMachine.
-Force
С этим параметром командлет не будет требовать подтверждения со стороны пользователя. Например:
Командлет ничего не выведет на экран и применит значение политики.
-Confirm
Если же вам наоборот мало одного подтверждения. Можно указать параметр Confirm и у вас будет ещё один, дополнительный, запрос на подтверждение ваших действий:
Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции «Set-ExecutionPolicy» над целевым объектом «Unrestricted».
[Y] Да — Y [A] Да для всех — A [N] Нет — N [L] Нет для всех — L [S] Приостановить — S [?] Справка (значением по умолчанию является «Y»):
Изменение политики выполнения
Политика выполнения защищает компьютер от ненадежных сценариев. Изменение политики выполнения может поставить под угрозу безопасность системы, как описано в разделе справки, вызываемом командой about_Execution_Policies. Вы хотите изменить политику выполнения?
[Y] Да — Y [N] Нет — N [S] Приостановить — S [?] Справка (значением по умолчанию является «Y»):
-WhatIf
С параметром WhatIf командлет не выполняется. А выводит на консоль свои предполагаемые действия без данного параметра.
WhatIf: Выполнение операции «Set-ExecutionPolicy» над целевым объектом «Unrestricted».
Изменение параметров политики, при запуске консоли.
Так же можно задать значение области применения Process при запуске консоли PowerShell c помощью параметра executionpolicy. Пример:
Scope | ExecutionPolicy |
—— | ————— |
MachinePolicy | Unrestricted |
UserPolicy | Undefined |
Process | RemoteSigned |
CurrentUser | AllSigned |
LocalMachine | Restricted |
Изменение параметров политики запуска скриптов, с помощью групповых политик.
В груповой политике, параметр контролирующая запуск скриптов находиться по пути:
для MachinePolicy:
Computer Configuration/Policies/Administrative Templates/Windows Components/Windows PowerShell
Конфигурация компьютера/Административные шаблоны/Компоненты Windows/Windows PowerShell
для UserPolicy:
User Configuration/Policies/Administrative Templates/Windows Components/Windows PowerShell
Конфигурация пользователя/Административные шаблоны/Компоненты Windows/Windows PowerShell
Параметр Execution Policy может принимать 3 значения:
ЗНАЧЕНИЕ ПАРАМЕТРА EXECUTION POLICY В ГРУППОВОЙ ПОЛИТИКИ | ЗНАЧЕНИЕ ПАРАМЕТРА ОТОБРАЖАЮЩЕЕСЯ В GET-EXECUTIONPOLICY |
---|---|
Разрешить все скрипты. (Allow all scripts) |
Unrestricted |
Разрешить локальные скрипты и удаленные подписанные скрипты. (Allow local scripts and remote signed scripts) |
RemoteSigned |
Разрешить только подписанные скрипты. (Allow all scripts) |
AllSigned |
Нашли ошибку в тексте? Выделите фрагмент текста и нажмите Ctrl+Enter