Когда я пытаюсь выполнить свой сценарий PowerShell, я получаю эту ошибку:
Файл C:\Common\Scripts\hello.ps1 не может быть загружен, потому что выполнение сценариев отключено в этой системе. Пожалуйста, смотрите "get-help about_signing" для более подробной информации.
В строке: 1 символ: 13
+.\hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException
Запустите Windows PowerShell с параметром «Запуск от имени администратора». Только члены группы «Администраторы» на компьютере могут изменять политику выполнения.
Включите запуск неподписанных скриптов, введя:
set-executionpolicy remotesigned
Это позволит запускать неподписанные сценарии, которые вы пишете на локальном компьютере, и подписанные сценарии из Интернета.
Смотрите также Запуск сценариев в библиотеке Microsoft TechNet.
Политика выполнения по умолчанию ограничена, вы можете увидеть ее, набрав:
Get-ExecutionPolicy
Вы должны ввести следующее, чтобы перейти в неограниченный режим:
Set-ExecutionPolicy unrestricted
Надеюсь это поможет
На моей машине, которую я использую для разработки сценариев, я буду использовать -unresricted, как указано выше. Однако при развертывании моих сценариев на компьютере конечного пользователя я просто вызову powershell с ключом -executionpolicy:
powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1
Мы можем получить статус текущего ExecutionPolicy с помощью команды ниже:
Get-ExecutionPolicy;
По умолчанию это Restricted . Чтобы разрешить выполнение сценариев PowerShell, нам нужно установить эту ExecutionPolicy как Bypass или Unrestricted .
Мы можем установить политику для текущего пользователя как Bypass
или Unrestricted
, используя любую из следующих команд PowerShell:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;
Неограниченно policy загружает все файлы конфигурации и запускает все сценарии. Если вы запускаете неподписанный скрипт, который был загружен из Интернета, вам будет предложено разрешение перед его запуском.
В то время как в Bypass policy ничего не блокируется, и во время выполнения скрипта нет предупреждений или подсказок. Обход ExecutionPolicy более расслаблен, чем неограничен.
В зависимости от версии и конфигурации 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
Из документации :
Обход: ничего не заблокировано и нет предупреждений или подсказок.
Это явно небезопасно, пожалуйста, поймите риски.
Рег ключ с:
Редактор реестра 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"
действительно работает тоже.
По какой-то причине командлет PowerShell не разрешил локальное выполнение глобально, только для локального пользовательского контекста. Если бы я попытался запустить скрипт Powershell из командной строки CygWin bash, например, которая запускается в своем собственном пользовательском контексте, он не запустился бы, выдав ошибку «не подписано цифровой подписью». Ответ заключался в том, чтобы перейти в редактор локальной групповой политики -> Политика локального компьютера -> Административные шаблоны -> Компоненты Windows -> Windows PowerShell и дважды щелкнуть «Включить выполнение сценария». Это затем позволило мне изменить его на «Включено», а затем политику выполнения «Разрешить локальные сценарии и удаленные подписанные сценарии» и заставить его работать глобально, независимо от контекста пользователя.
Принятый ответ правильный, но изменение политики доступно только для текущего запущенного экземпляра Powershell, то есть после закрытия экземпляра Powershell. Политика будет сброшена. Если пользователь повторно открывает другой экземпляр Powershell, будет применена политика по умолчанию, которая Restricted
Для меня мне нужно использовать консоль VisualStudio Code и g ++ из cygwin для сборки вещей. Консоль использует Powershell, с политикой по умолчанию ничего нельзя сделать. Одним из решений является изменение политики каждый раз, когда консоль запускается в консоли кода VisualStudio, возможно, это скрипт изменения политики.
Я ленив, поэтому другое решение - когда я запускаю Powershell в режиме администратора, аналогично тому, что делает принятый ответ. но с дополнительным параметром, который изменяет значения в таблице реестра. Как только это было сделано. Другие экземпляры Powershell по умолчанию будут использовать политику RemoteSigned
.
set-executionpolicy remotesigned -Scope CurrentUser