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


257

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

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


1
Что вы узнали из "get-help about_signing"?
JohnC

Ответы:


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

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

    set-executionpolicy remotesigned
    

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

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


52
+1 для удаленных подписчиков вместо неограниченных. Вы можете запускать свои локальные сценарии, не подвергая себя опасности отовсюду.
DarrellNorton

7
Спасибо - этот пост помог мне. Однако у меня все еще были проблемы, потому что я не запускал PowerShell "как администратор" под win8
sergeantKK

3
Изменит ли это политику навсегда или мне придется делать это каждый раз при перезагрузке компьютера?
Ray

1
@Ray Это изменит политику навсегда.
Павел Чучува

1
Есть ли способ включить выполнение конкретного сценария powershell? Так что, возможно, я просто хочу разрешить hello.ps1из OP или Microsoft.PowerShell_profile.ps1 на ящик пользователя? (Я думаю, что это, возможно, подпадает под общепризнанный OP-вопрос (ха, который я теперь вижу, тоже ваш!). Если вы чувствуете, что это новый вопрос, я могу его задать.)
ruffin

73

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

Get-ExecutionPolicy

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

Set-ExecutionPolicy unrestricted

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


22
-1. это слишком открыто, чтобы просто выполнить. RemoteSigned лучше.
TomTom

13
Требующая подпись имеет смысл, если вы ожидаете, что пользователь будет копировать и вставлять вредоносные скрипты из Интернета. Если вы предполагаете, что пользователь не глуп, то «удаленное подписывание» не добавляет безопасности и усложняет жизнь.
Guss

@Guss: При тестировании этого я обнаружил, что RemoteSigned больше не требует, чтобы локально сгенерированные файлы .ps1 были подписаны, и он рассматривает управление исходным кодом git как локальный источник.
Джошуа

@ Джошуа - да, моя точка зрения точно. Если RemoteSignedне блокирует копирование и вставку, не блокирует git или другие методы загрузки, отличные от IE, тогда для чего это нужно? Скажи это со мной: «абсолютно ничего!». Я думаю, что требовать подписи сценариев с сертификатом подписи кода за 100 долларов - это бесполезно, глупо и сводит на нет все то хорошее, что может сделать приличный язык сценариев для Windows. При этом, если путь вперед состоит в том, чтобы заставить пользователей понять, что они делают, чтобы использовать сценарии PS, то мы можем быть слишком заняты ... Нееее, это никогда не сработает ;-)
Guss

@Guss: У меня уже есть хороший язык сценариев для Windows. Cygwin отлично работает на Windows 10; буквально намного лучше, чем это было в любой предыдущей версии Windows. Я только когда-либо хочу запустить записки, которые кто-то уже написал.
Джошуа

61

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

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

2
Возможно, вы захотите объединить этот прием с приемом полиглота в файле .CMD. См stackoverflow.com/a/8597794/5314
Jay Bazuzi

Приятно! Я развертывал sfx, сделанные winrar rarlabs.com
MDMoore313

1
Этот трюк позволил мне запустить скрипт powershell из Git Bash (MINGW32 bash)
Камил Сзот

16

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

Get-ExecutionPolicy;

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

Мы можем установить политику для текущего пользователя как 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

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

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

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


это был единственный способ заставить мой скрипт работать в среде WINE с powershell 2.0. Спасибо.
Wyatt8740

@ Wyatt8740: Потому что вино представляет все диски как сетевые диски.
Иисус Навин

@ Джошуа, я понятия не имел. Можете ли вы дать мне источник для этого заявления? Я попробовал случайный Google, но я, очевидно, выгляжу неправильно.
Wyatt8740

@ Wyatt8740: Источник: стандартное диалоговое окно Wine OpenFileName. Посмотрите значки дисков.
Иисус Навин

@ Joshua Я имел в виду исходный код; иконки могут быть произвольными. Но я бы не подумал об этом; Я думаю, это хорошее место для начала (редактировать: не похоже, что они здесь .)
Wyatt8740

2

Рег ключ с:
Windows Registry Editor версии 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


0

Установка политики (правильно) - лучший выбор, но в моих управляемых системах у меня нет возможности изменить эту политику.

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

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


-2

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


1
Это просто неправильно: ключи, упомянутые в других ответах, изменяют политику выполнения powershells, которая затем позволяет запускать скрипт powershell.
Патрик Р.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.