Как включить выполнение скриптов PowerShell?

Вопрос или проблема

Когда я пытаюсь выполнить свой скрипт PowerShell, я получаю эту ошибку:

Файл C:\Common\Scripts\hello.ps1 не может быть загружен, поскольку выполнение скриптов отключено на этой системе. Пожалуйста, см. “get-help about_signing” для получения дополнительной информации.
На строке:1 символ:13
+ .\hello.ps1 <<<<
+ CategoryInfo : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException

  1. Запустите Windows PowerShell с опцией «Запуск от имени администратора». Только члены группы Администраторов на компьютере могут изменять политику выполнения.

  2. Разрешите выполнение неподписанных скриптов, введя:

    set-executionpolicy remotesigned
    

Это позволит выполнять неподписанные скрипты, которые вы пишете на своем локальном компьютере, и подписанные скрипты из Интернета. Это изменит политику на постоянной основе.

См. также Запуск скриптов в библиотеке Microsoft TechNet.

Политика выполнения по умолчанию установлена на restricted, вы можете увидеть ее, запустив Get-ExecutionPolicy:

Get-ExecutionPolicy

Запустите Set-ExecutionPolicy следующим образом, чтобы переключиться в режим unrestricted:

Set-ExecutionPolicy unrestricted

На моем компьютере, который я использую для разработки скриптов, я буду использовать -unrestricted, как указано выше. Однако при развертывании моих скриптов на пользовательских машинах я просто вызову PowerShell с параметром -executionpolicy:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1

Мы можем получить статус текущей политики выполнения с помощью следующей команды:

Get-ExecutionPolicy;

По умолчанию это Restricted. Чтобы разрешить выполнение скриптов PowerShell, нам нужно установить эту политику либо как Bypass, либо как Unrestricted.

Мы можем установить политику для текущего пользователя как Bypass или Unrestricted с помощью любой из следующих команд PowerShell:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;

Unrestricted политика загружает все файлы конфигурации и выполняет все скрипты. Если вы запустите неподписанный скрипт, загруженный из Интернета, вас попросят подтвердить разрешение на его выполнение.

В то время как в политике Bypass ничего не блокируется и нет предупреждений или запросов во время выполнения скрипта. Политика Bypass более расслабленная, чем Unrestricted.

В зависимости от версии Windows и конфигурации, вы можете получить следующее предупреждение, даже в режиме Unrestricted:

Предупреждение безопасности
Запускайте только те скрипты, которым вы доверяете. Хотя скрипты из интернета могут быть полезными, этот
скрипт может потенциально навредить вашему компьютеру. Если вы доверяете этому скрипту, используйте 
команду Unblock-File, чтобы разрешить запуск скрипта без этого предупреждающего сообщения. 
Вы хотите запустить?
[D] Не запускать  [R] Запустить один раз  [S] Приостановить  [?] Помощь (по умолчанию "D")

Решение – использовать политику “bypass”, включаемую следующей командой:

Set-ExecutionPolicy Bypass

Из документации:

Bypass: Ничего не блокируется и нет предупреждений или запросов.

Это, очевидно, небезопасно, пожалуйста, осознайте риски, связанные с этим.

Файл .reg с:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Bypass"

и:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Unrestricted"

тоже работает.

По какой-то причине команда PowerShell не включила локальное выполнение глобально, а только для контекста локального пользователя. Если я пробовал запустить скрипт PowerShell из-под подсказки bash в CygWin, например, который работает под своим собственным контекстом пользователя, он не выполнялся, выводя ошибку “не подписан в цифровом виде”. Ответ был в том, чтобы зайти в Редактор локальной групповой политики -> Локальная компьютерная политика -> Административные шаблоны -> Компоненты Windows -> Windows PowerShell и дважды щелкнуть на ‘Включить выполнение скриптов’. Затем я изменил его на ‘Включено’, и политику выполнения на “Разрешить локальные скрипты и удаленные подписанные скрипты”, что позволило работать глобально независимо от контекста пользователя.

Правильная настройка политики является лучшим выбором, но на моих управляемых системах я не могу изменить эту политику.

Для меня самым простым обходным решением изменения политики является открытие скрипта в
“PowerShell ISE”, выделение кода (или части кода) для выполнения и затем нажатие кнопки “Запустить выделение” (или использование комбинации F8).

Это не лучшее решение и мало помогает в автоматизации задач, но дает мне возможность и утилиту PowerShell, не противореча моему департаменту информационных технологий.

Принятый ответ верен, но изменение политики доступно только для текущей запущенной инстанции PowerShell, это означает, что после закрытия инстанции PowerShell политика будет сброшена. Если пользователь откроет другую инстанцию PowerShell, по умолчанию будет применена политика Restricted

Для меня необходимо использовать консоль VisualStudio Code и g++ из Cygwin для сборки проектов. Консоль использует PowerShell, с политикой по умолчанию ничего нельзя сделать. Одно из решений – изменять политику каждый раз, когда консоль открывается в визуальной консоли VisualStudio Code, возможно, с помощью скрипта изменения политики.

Я ленив, поэтому другое решение – когда я запускаю PowerShell в режиме администратора, аналогично тому, как это делает принятый ответ, но с дополнительным параметром, который изменяет значения в таблице реестра. После этого другие инстанции PowerShell будут использовать политику RemoteSigned по умолчанию.

set-executionpolicy remotesigned -Scope CurrentUser

Если вы загрузили .ps1 из интернета, щелкните правой кнопкой мыши на свойствах, чтобы разблокировать файл, просто нажмите на эту кнопку.

Я не знаю, пробовал ли кто-то это внимательно или нет, но даже в последних обновлениях Windows 10 (и, возможно, 11, но не пробовал), если вы запустите эти строки в точно заданном порядке, вы сможете легко установить ExecutionPolicy по своему усмотрению.

Откройте Powershell с правами администратора (Запуск от имени администратора) и запустите эти строки по очереди, но все 3 в точно заданном порядке:

powershell "Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned -Force"
powershell "Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force"
powershell "Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned -Force"

И после этого не только текущее окно PowerShell, но и вновь открытые окна PowerShell любым пользователем смогут выполнять .ps1 скрипты.

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

  1. Откройте Пуск.

  2. Найдите PowerShell, щелкните правой кнопкой мыши на верхнем результате и выберите опцию “Запуск от имени администратора”.

  3. Введите следующую команду, чтобы разрешить выполнение скриптов, и нажмите Enter:

    Set-ExecutionPolicy RemoteSigned
    
  4. Введите A и нажмите Enter (если применимо).

  5. Введите следующую команду для выполнения скрипта и нажмите Enter:

    & "C:\PATH\TO\SCRIPT\first_script.ps1"
    

    В вышеуказанной команде обязательно замените “PATH\TO\SCRIPT” на местоположение вашего скрипта.

После завершения шагов скрипт выполнится, и если он был правильно составлен, вы должны увидеть его вывод без проблем.

Просто одно замечание:

Не используйте PowerShell ISE, чтобы выполнить команду set-executionpolicy remotesigned как скрипт. В моем случае это не работает.

Запустите его в расширенном PowerShell – Пожалуйста, следуйте пошаговой рекомендации, предоставленной Павлом Чучуевой.

На моей локальной машине я решил эту проблему, установив политику выполнения в Bypass.

  1. Запустите Windows PowerShell с опцией «Запуск от имени администратора». Только члены группы Администраторов на компьютере могут изменять политику выполнения.

  2. Разрешите выполнение неподписанных скриптов, введя:

    set-executionpolicy Bypass
    

    (введите A и нажмите Enter, чтобы принять все вопросы).

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

.

Ответ или решение

Исполнение скриптов PowerShell по умолчанию заблокировано в целях безопасности, поэтому для выполнения скриптов необходимо изменить политику исполнения. При попытке запуска скрипта, вы можете столкнуться с ошибкой: "Выполнение сценариев отключено на этой системе". Это происходит из-за ограниченной политики исполнения, которая является настройкой по умолчанию на большинстве систем. В этой статье мы разберемся, как решить эту проблему, предоставив подробное руководство.

Теория

Политика исполнения PowerShell улучшает безопасность, определяя, какие типы скриптов могут выполняться на вашей системе. В Windows предусмотрено несколько уровней политики исполнения:

  1. Restricted: Предотвращает выполнение любых скриптов. Это значение по умолчанию.
  2. AllSigned: Разрешает выполнение только подписанных скриптов. Все скрипты, включая локальные, должны быть подписаны доверенным издателем.
  3. RemoteSigned: Разрешает выполнение локальных скриптов без подписи, но требует подписи для удаленных скриптов (например, загруженных из Интернета).
  4. Unrestricted: Позволяет выполнение всех скриптов, предупреждает перед выполнением загруженных из Интернета.
  5. Bypass: Ничто не блокируется, нет предупреждений или запросов на разрешение.

Пример

Чтобы изменить политику исполнения, необходимо использовать командлет Set-ExecutionPolicy. Вот шаги, которые нужно выполнить:

  1. Запуск PowerShell от имени администратора:

    • Откройте меню «Пуск» и введите «PowerShell».
    • Щелкните правой кнопкой на результат и выберите «Запуск от имени администратора».
  2. Проверка текущей политики выполнения:

    • Команда: Get-ExecutionPolicy
    • Это покажет, какая политика исполнения установлена в данный момент.
  3. Изменение политики исполнения:

    • Команда для изменения политики на RemoteSigned:
      Set-ExecutionPolicy RemoteSigned
    • Введите A, чтобы согласиться со всеми запросами (если необходимо).

Если ваша цель состоит в том, чтобы запускать только локальные скрипты, то RemoteSigned будет хорошим выбором, обеспечивающим баланс между безопасностью и удобством. Для более открытых сред можно использовать Unrestricted или Bypass, понимая, что это увеличивает риски безопасности.

Применение

Следующим шагом будет обеспечение постоянства изменений в политике, чтобы они применялись при каждом запуске PowerShell. Вот как это можно сделать:

  • Для текущего сеанса:
    Используйте параметр -Scope Process, чтобы изменение применялось только к текущей сессии PowerShell:

    Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
  • Для текущего пользователя:
    Чтобы изменение политики исполнения применялось ко всем сеансам для текущего пользователя, используйте:

    Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
  • Для локальной машины:
    Это применит изменение ко всем пользователям на машине, что наиболее радикально и может требовать привилегий администратора:

    Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned

Дополнительные советы

  • Использование параметров командной строки для обхода политики:
    Вы можете запускать конкретные скрипты, обходя политику исполнения вручную с ключом -ExecutionPolicy Bypass:

    powershell.exe -executionpolicy bypass -file .\script.ps1
  • Разблокировка файлов:
    Если вы скачали скрипт из Интернета, щелкните правой кнопкой мыши на .ps1 файл, выберите «Свойства» и нажмите кнопку «Разблокировать» на вкладке «Общие».

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

Оцените материал
Добавить комментарий

Капча загружается...