Як увімкнути виконання сценаріїв PowerShell?


260

Коли я намагаюся виконати свій скрипт PowerShell, я отримую цю помилку:

Файл C: \ Common \ Scripts \ hello.ps1 не можна завантажити, оскільки виконання скриптів у цій системі вимкнено. Докладнішу інформацію див. У розділі "Довідка про_значення".
У рядку: 1 char: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Відповіді:


399
  1. Запустіть Windows PowerShell за допомогою параметра "Запустити як адміністратор". Лише члени групи адміністраторів на комп'ютері можуть змінювати політику виконання.

  2. Увімкніть запуск неподписаних сценаріїв, ввівши:

    set-executionpolicy remotesigned
    

Це дозволить запускати непідписані сценарії, які ви пишете на локальному комп’ютері та підписані сценарії з Інтернету.

Дивіться також Запуск сценаріїв у бібліотеці Microsoft TechNet.


3
Чи це змінить політику назавжди або мені доведеться це робити щоразу, коли перезавантажую комп'ютер?
Рей

1
@Ray Це змінить політику назавжди.
Павло Чучува

1
@Ray Дивіться документацію . За замовчуванням встановлює його для LocalMachine. Щоб встановити інші області ( CurrentUserабо Process), пройдіть -Scopeпрямо.
jpmc26

@PavelChuchuva я повинен додати цей рядок поверх свого сценарію, який ви мали на увазі
FabioSpaghetti

@FabioSpaghetti Не потрібно нічого додавати у ваші сценарії. Просто виконайте цю команду один раз, дотримуючись кроків.
Павло Чучува

74

Політика виконання за замовчуванням встановлена ​​як обмежена, ви можете побачити її, ввівши:

Get-ExecutionPolicy

Ви повинні ввести наступне, щоб перейти в необмежений режим:

Set-ExecutionPolicy unrestricted

Сподіваюсь, це допомагає


13
Підписання має сенс, якщо ви очікуєте, що користувач скопіює та вставить шкідливі сценарії з Інтернету. Якщо ви вважаєте, що користувач не дурний, то "дистанційний дизайн" не додає ніякої безпеки і ускладнює життя.
Гасс

@Guss: Перевіривши це, я виявив, що RemoteSigned більше не вимагає підпису локально згенерованих файлів .ps1, і він розглядає керування джерелом git як локальне джерело.
Джошуа

@Joshua - так, точно моя думка. Якщо RemoteSignedне блокує копіювання та вставлення, не блокує git чи інші методи завантаження, не IE, то для чого це добре? Скажіть це зі мною: "абсолютно нічого!". Я думаю, що вимагати підписання сценаріїв сертифікатом підпису коду в 100 доларів марно, нерозумно і заперечує все хороше, що гідна мова сценаріїв може зробити для Windows. Якщо говорити, якщо шлях вперед полягає в тому, щоб користувачі зрозуміли, що вони роблять для того, щоб використовувати скрипти PS, тоді ми можемо бути надто що-небудь ... Nahhhh, це ніколи не вийде ;-)
Guss

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

61

На моїй машині, яку я використовую для розробки сценаріїв, я буду використовувати необмежений, як зазначено вище. При розгортанні моїх скриптів на машині кінцевого користувача я просто зателефоную в shellhell за допомогою перемикача -executionpolicy:

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

2
Ви можете поєднати цей трюк з фокусом поліглота у файлі .CMD. Див stackoverflow.com/a/8597794/5314
Jay Bazuzi

Приємно! Я розгортаю sfx зроблені winrar rarlabs.com
MDMoore313

1
Цей трюк дозволив мені запустити сценарій powerhell від Git Bash (MINGW32 bash)
Каміль Шот

16

Стан поточного ExecutionPolicy ми можемо отримати за допомогою команди нижче:

Get-ExecutionPolicy;

За замовчуванням вона обмежена . Щоб дозволити виконання сценаріїв PowerShell, нам потрібно встановити цю ExecutionPolicy як обхідну чи необмежену .

Ми можемо встановити політику для поточного користувача як Bypassабо Unrestrictedза допомогою будь-якої з наведених нижче команд PowerShell:

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

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

Необмежена політика завантажує всі файли конфігурації та запускає всі сценарії. Якщо у вас запущений безпідписаний сценарій, завантажений з Інтернету, вам буде запропоновано дозвіл перед його запуском.

Тоді як у політиці Bypass нічого не блокується і під час виконання сценарію немає попереджень або підказок. Bypass ExecutionPolicy є більш спокійним, ніж необмежений.


5

Залежно від версії та конфігурації 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

З документації :

Обхід: Ніщо не заблоковано і немає жодних попереджень чи підказок.

Це, очевидно, небезпечно, будь ласка, зрозумійте ризики.


це був єдиний спосіб, коли мені вдалося змусити мій сценарій запуститись у ВІННОМУ середовищі з powershell 2.0. Дякую.
Wyatt8740

@ Wyatt8740: Тому що вино представляє всі диски як мережеві диски.
Джошуа

@Joshua Я поняття не мав. чи можете ви дати мені джерело для цього твердження? Я спробував випадковий google, але я, очевидно, дивлюся неправильно.
Wyatt8740

@ Wyatt8740: Джерело: загальне діалогове вікно Wine OpenFileName. Подивіться значки накопичувача.
Джошуа

@Joshua Я мав на увазі джерело вихідного коду; іконки, можливо, довільні. Але я б не думав про це; Я думаю, це хороше місце для початку (редагувати: не схоже, що вони є тут )
Wyatt8740,

2

Клавіша reg:
Редактор реєстру 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 bash, який працює у власному контексті користувача, він не запускається, даючи помилку "не підписаний цифровим шляхом". Відповідь слід зайти в редактор локальної групової політики -> Місцева комп'ютерна політика -> Адміністративні шаблони -> Компоненти Windows -> Windows PowerShell та двічі клацнути «Увімкнути виконання сценарію». Після цього дозвольте мені змінити його на "Увімкнено", а потім виконувати політику "Дозволити локальні скрипти та віддалені підписані сценарії" і змусити його працювати глобально, незалежно від контексту користувача.


0

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

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

Я лінивий, тому інше рішення - коли я запускаю Powershell в режимі адміністратора, аналогічно тому, що робить прийнята відповідь. але з додатковим параметром, який змінює значення в таблиці Реєстру. Як тільки це було зроблено. Інші екземпляри Powershell будуть використовувати RemoteSignedполітику за замовчуванням.

set-executionpolicy remotesigned -Scope CurrentUser


0

Налаштування політики (правильно) - найкращий вибір, але в моїх керованих системах я не маю можливості змінювати цю політику.

Для мене найпростіша проблема щодо зміни політики - відкрити скрипт у "PowerShell ISE" , виділити код (або частину коду) для виконання, а потім натиснути кнопку "Запустити вибір" (або використовувати F8 ярлик).

Це не найкраще рішення і мало робить для автоматизації завдань, але це дозволяє мені використовувати і корисність PowerShell, не працюючи на моєму відділі IS.


-2

Причина того, що ключ reg працює, полягає в тому, що він робить саме те, що виконують команди PS. Команди записують зміни до клавіш reg. Команди набагато швидше і простіше, ніж створення ключа reg або закопування в реєстр.


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