211

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

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

9 ответов9

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

  2. Включите запуск неподписанных скриптов, введя:

    set-executionpolicy remotesigned
    

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

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

64

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

Get-ExecutionPolicy

Вы должны ввести следующее, чтобы перейти в неограниченный режим:

Set-ExecutionPolicy unrestricted

Надеюсь это поможет

53

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

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

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

Get-ExecutionPolicy;

По умолчанию это ограничено. Чтобы разрешить выполнение сценариев PowerShell, нам нужно установить для этого параметра ExecutionPolicy либо Обход, либо Неограниченный.

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

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

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

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

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

4

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

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this
script can potentially harm your computer. If you trust this script, use the 
Unblock-File cmdlet to allow the script to run without this warning message. 
Do you want to run?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D")

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

Set-ExecutionPolicy Bypass

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

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

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

1

Рег ключ с:
Редактор реестра Windows, версия 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell] "EnableScripts" = dword:00000001 "ExecutionPolicy" = "Обход"

а также:

Windows Registry Editor Version 5.00

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

действительно работает тоже.

1

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

0

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

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

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

set-executionpolicy remotesigned -Scope CurrentUser

-2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .