PowerShell каже, що «виконання скриптів у цій системі відключено».


1760

Я намагаюся запустити файл, який викликає сценарій cmd.exe, і я отримую нижче помилку:

Management_Install.ps1 не може бути завантажено, оскільки виконання скриптів у цій системі вимкнено.

Я бігав

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

і коли я біжу Get-ExecutionPolicyвід, Я Unrestrictedповертаюся.

PS C:\Users\Administrator\> Get-ExecutionPolicy
Unrestricted

C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> powershell .\Management_Install.ps1 1

WARNING: Running x86 PowerShell...

Файл C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1не можна завантажити, оскільки виконання скриптів у цій системі вимкнено. Будь ласка, перегляньте " get-help about_signing" для отримання детальної інформації.

По черзі: 1 чар: 25

  • .\Management_Install.ps1 <<<< 1

    • CategoryInfo: Не визначено: (:) [], PSSecurityException

    • FullyQualifiedErrorId: RuntimeException

C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> PAUSE

Press any key to continue . . .

Система Windows Server 2008R2.

Що я роблю неправильно?


3
Не дивіться, я ввійшов як адміністратор, а також запустив "Адміністратор" і отримав такий же результат, як вище ...
Conor

2
Зрозуміло, що помилка була введеною в оману, проблема була в моєму скрипті повноважень, дякую!
Conor

Варто зазначити, що Політика виконання має декілька областей, а запуск PowerShell різними способами може отримати різні політики. Щоб переглянути список політик, запустіть Get-ExecutionPolicy -List.
Битон Бекон

Відповіді:


2240

Якщо ви використовуєте Windows Server 2008 R2, то існують версії PowerShell x64 та x86, для яких обох потрібно встановити політику виконання. Ви встановили політику виконання обох хостів?

Як адміністратор , ви можете встановити політику виконання, ввівши це у вікно PowerShell:

Set-ExecutionPolicy RemoteSigned

Докладніші відомості див. У розділі Використання набору команд Set-ExecutionPolicy Cmdlet .

Закінчивши, ви можете повернути політику до її значення за замовчуванням за допомогою:

Set-ExecutionPolicy Restricted

141
Set-ExecutionPolicy RestrictedЗдається, це скасує, якщо ви хочете повернути дозволи до таких, як вони були: technet.microsoft.com/en-us/library/ee176961.aspx . Тимчасовий метод обходу @Jack Edmondsвиглядає для мене більш безпечним:powershell -ExecutionPolicy ByPass -File script.ps1
SharpC

33
Для більш безпечної політики застосуйте її до фактичного користувача: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Nuno Aniceto

Set-ExecutionPolicy RemoteSigned не може бути першим рядком у вашому сценарії. Якщо він є, виділіть його та запустіть вибраний лише ПОЧАК, перш ніж запустити решту сценарію.
ozzy432836

Я натрапив на таке запитання на сайті SF, «політика виконання Powershell в SQL Server» запитав 10 Жовтня '14. Відповіді там включені , Get-ExecutionPolicy -Listякі допомогли мені побачити різні сфери застосування. ЦМД Get-ExecutionPolicyне вказує все області дії. В Import-Module SQLPSданий час працює з політика змінилася таким чином : {Undefined- Process,MachinePolicy,UserPolicy,}; {RemoteSigned- CurrentUser, LocalMachine}.
SherlockSpreadsheets

Якщо я це зробити, чи зміна триватиме лише протягом тривалості поточної PowerShell? Або він більший за це?
Вільям Йокуш

709

Ви можете обійти цю політику для одного файлу, додавши -ExecutionPolicy Bypassпри запуску PowerShell

powershell -ExecutionPolicy Bypass -File script.ps1

3
Це також дуже зручно, якщо ви користуєтесь обліковим записом без адміністратора. Я зробив ярлик %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPassна панелі завдань.
zek19

3
Зауважте, що Microsoft Technet стилізує його як "Bypass", а не "ByPass". Дивіться: technet.microsoft.com/nl-nl/library/hh849812.aspx
Jelle Geerts

1
Це не працює для мене, я отримую такий самий дозвіл, як ніби я його закликав нормально. Зателефонувавши на PS1 з .bat, все type script.ps1 | powershell -ж таки працює.
Some_Guy

8
Метою Політики щодо виконання є запобігання подвійному клацанню клавіші миші .ps1та випадковому запуску того, чого вони не мали намір. Це сталося б із .batфайлами
Колонь Каньйон

Ви заощаджуєте мій день, дякую за відповідь.
Арпіт Патель

162

У мене була аналогічна проблема, і я зазначив, що за замовчуванням cmdна Windows Server 2012 працює x64.

Для Windows 7 , Windows 8 , Windows 10 , Windows Server 2008 R2 або Windows Server 2012 виконайте такі команди як адміністратор :

x86 (32 біт)
Відкрити C:\Windows\SysWOW64\cmd.exe
Виконати командуpowershell Set-ExecutionPolicy RemoteSigned

x64 (64 біт)
Відкрити C:\Windows\system32\cmd.exe
Виконати командуpowershell Set-ExecutionPolicy RemoteSigned

Перевірити режим можна за допомогою

  • У CMD: echo %PROCESSOR_ARCHITECTURE%
  • У Powershell: [Environment]::Is64BitProcess

Посилання:
MSDN - Політика виконання Windows PowerShell
Windows - пояснення каталогу 32 - біт проти 64 біт


132

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

З сторінки TechNet про політику щодо виконання :

Політики виконання Windows PowerShell дозволяють визначати умови, за яких Windows PowerShell завантажує конфігураційні файли та запускає сценарії.

Переваги , які, як перераховуються PowerShell - Основи політики виконання підпису коду і , є:

  • Контроль виконання - контроль рівня довіри до виконання сценаріїв.
  • Command Highjack - запобігання введенню команд на мій шлях.
  • Ідентичність - це сценарій, створений та підписаний розробником, якому я довіряю, та / або підписаний сертифікатом від сертифікаційного органу, якому я довіряю.
  • Цілісність - скрипти не можуть бути змінені зловмисним програмним забезпеченням або зловмисниками.

Щоб перевірити поточну політику виконання, можна запустити Get-ExecutionPolicy. Але ти, мабуть, тут, тому що хочеш це змінити.

Для цього ви запустите Set-ExecutionPolicyкомандлет.

У вас буде два основні рішення, які слід прийняти під час оновлення політики виконання.

Тип політики виконання:

  • Restricted - У системі не може бути виконано жодного локального, віддаленого або завантаженого сценарію.
  • AllSigned - Усі запущені сценарії вимагають цифрового підпису.
  • RemoteSigned - Усі віддалені сценарії (UNC) або завантажені сценарії потрібно підписати.
  • Unrestricted - Підпис для будь-якого типу сценарію не потрібно.

Сфера застосування нових змін

  • LocalMachine - Політика виконання стосується всіх користувачів комп'ютера.
  • CurrentUser - Політика виконання стосується лише поточного користувача.
  • Process - Політика виконання стосується лише поточного процесу Windows PowerShell.

† = За замовчуванням

Наприклад : якщо ви хочете змінити політику на RemoteSigned лише для CurrentUser, виконайте таку команду:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Примітка . Щоб змінити політику виконання, потрібно запустити PowerShell як адміністратор . Якщо ви перебуваєте у звичайному режимі та намагаєтесь змінити політику виконання, ви отримаєте таку помилку:

Доступ до ключа реєстру "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell" заборонено. Щоб змінити політику виконання для області за замовчуванням (LocalMachine), запустіть Windows PowerShell з опцією "Запустити як адміністратор".

Якщо ви хочете посилити внутрішні обмеження щодо власних скриптів, які не завантажені з Інтернету (або принаймні не містять метаданих UNC), ви можете змусити політику виконувати лише підписані скрипти. Щоб підписати власні сценарії, ви можете дотримуватися вказівок зі статті Скотта Хензельмана про підписання сценаріїв PowerShell .

Примітка : Більшість людей, ймовірно, отримують цю помилку щоразу, коли вони відкривають Powershell, оскільки перше, що PS намагається зробити при запуску, - це виконати сценарій профілю вашого користувача, який налаштовує ваше середовище, як би вам це не подобалося.

Зазвичай файл знаходиться в:

%UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1

Точне місцезнаходження ви можете знайти, запустивши змінну powerhell

$profile

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


8
Мені здається, що важливо зауважити, що хоча політика виконання є заходом безпеки, це не той, який призначений для того, щоб користувачі не могли виконувати код PowerShell. Політика виконання - це те, що призначене для захисту ваших сценаріїв та визначення того, хто їх написав, змінив чи затвердив, і це все. Тривіально обійти політику виконання з чимось таким простим, як Get-Content .\MyFile.ps1 | powershell.exe -NoProfile -.
бекон

1
Зважаючи на існування, -ExecutionPolicy ByPassпроте, яка мета цієї політики взагалі? Це просто для того, щоб користувачі випадково не відкривали консоль Powerhell та запускали шкідливий сценарій? Не міг би зловмисник просто використати виконуваний або пакетний сценарій, якщо хотів це обійти? Навіть прочитавши коментар @BaconBits, я не зовсім впевнений, який сценарій має на меті запобігти цій політиці ...
Ajedi32

2
@ Ajedi32 Скажіть, у мене є завдання, яке виконує сценарій у мережі. Коли я викликаю свій скрипт, я хочу, щоб мій процес перевірив, чи сценарій підписаний. Я хочу, щоб мій код ще раз перевірив, що сценарій, який я буду запускати, - це код, якому я довіряю запустити. Мені все одно, чи можете ви запустити мій код. Зупинка, яка є роботою прав доступу. Я просто хочу завадити тобі змусити мене запускати код, який я не писав. Права доступу означають, що операційна система не дозволяє вам змінювати мій код під час входу. Політика підписання та виконання коду означає, що мій сценарій не був змінений, коли я його запускаю.
Шматочки бекону

40

У Windows 7:

Перейдіть до меню "Пуск" і знайдіть "Windows PowerShell ISE".

Клацніть правою кнопкою миші версію x86 і виберіть "Запустити як адміністратор".

У верхній частині наклейте Set-ExecutionPolicy RemoteSigned; запустіть сценарій. Виберіть "Так".

Повторіть ці кроки і для 64-бітної версії Powershell ISE (версія не x86).

Я просто уточнюю кроки, на які натякнув @Chad Miller. Дякую Чаде!


39

Також запуск цієї команди перед скриптом також вирішує проблему:

set-executionpolicy unrestricted

27
-1 - Дотримуйтесь принципу найменшого дозволу. Принаймні встановіть політику, RemoteSignedперш ніж знімати всі обмеження щодо політики безпеки. Якщо це не працює, то переоцініть, які ваші больові точки і чому це не працює. Ви можете встановити unrestrictedв крайньому випадку, але це не повинно бути вашим вихідним пунктом.
KyleMit

3
Дякуємо, що вказали і на цей варіант. Беручи до уваги потреби в безпеці для виробничих цілей, у часи, коли попит на можливість швидкого прототипування настільки високий, усі політики та безпека дійсно заважають виконувати завдання.
tishma

1
Щодо коментарів щодо прототипування коментарів, я боюся, що саме тому шалений код потрапляє у виробництво. Звичайно, це лише тривіальний приклад, але якщо ви не можете вирішити щось, це дрібниця під час розвитку, це хвилювання для виходу. Крім того, для замовлення коду і, якщо ви можете, знати цільове середовище - ми встановлюємо більшість наших внутрішніх систем як Remotesigned.
Trix

33

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

Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

або

Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted"

Про це можна прочитати у довідці.

Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full

Для мене добре працювали в Windows 8, навіть коли Set-ExecutionPolicy Unrestrictedадміністратор не здавався достатньо обмеженим, щоб насправді допомогти.
патрон

1
Я вважаю, що у вас може виникнути GPO або щось інше, що перезаписує ваші налаштування рівня "LocalMachine" ExecutionPolicy. Ви не можете перезаписати те, що існує доменна політика за допомогою команди Set-ExecutionPolicy. Однак, встановивши рівень доступу "CurrentUser", ви і тільки ви матимете вказану Політику виконання. Це відбувається тому, що комп'ютер переглядає політику CurrentUser для виконання, перш ніж перегляне налаштування LocalMachine.
Micah 'Powershell Ninja'

1
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Без обмежень" - це єдине рішення, яке працювало для мене. Дякую
Paulj

32

RemoteSigned: всі створені вами сценарії будуть запущені, а всі скрипти, завантажені з Інтернету, повинні бути підписані довіреним видавцем.

Гаразд, змініть політику, просто ввівши:

Set-ExecutionPolicy RemoteSigned

Як рекомендується в інших публікаціях: розумніше включити "-Scope CurrentUser" для більш безпечної політики, коли це має сенс.
clusterdude

32

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

Get-ExecutionPolicy;

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

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

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

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

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

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


4
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force; Швидкий і брудний спосіб AKA сказати VS2015, щоб перестати скаржитися і запустити мій кривавий сценарій. Дякую. рятівник.
Іон

1
Кінцеві крапки з комою на кінцях ваших команд зайві.
Bill_Stewart

23

Я використовую Windows 10 і не зміг запустити жодну команду. Єдиною командою, яка дала мені деякі підказки, була така:

[x64]

  1. Відкрийте C: \ Windows \ SysWOW64 \ cmd.exe [як адміністратор]
  2. Виконайте команду> powershell Set-ExecutionPolicy Unrestricted

Але це не спрацювало. Це було обмежено. Можливо, нові політики безпеки для Windows10. У мене була така помилка:

Set-ExecutionPolicy: Windows PowerShell успішно оновив політику виконання, але налаштування перекрито політикою, визначеною у більш конкретній області застосування. Завдяки переопрацюванню, ваша оболонка збереже свою діючу ефективну політику виконання ...

Тому я знайшов інший спосіб ( рішення ):

  1. Відкрити команду / консоль запуску ( Win+ R)
  2. Тип: gpedit.msc ( Редактор групової політики )
  3. Перейдіть до локальної комп'ютерної політики -> Конфігурація комп'ютера -> Адміністративні шаблони -> Компоненти Windows -> Windows Powershell .
  4. Увімкнути " Увімкнути виконання сценарію "
  5. Встановіть політику за потребою. Я встановив моє значення " Дозволити всі сценарії ".

Тепер відкрийте PowerShell і насолоджуйтесь;)


Це автономна установка чи ви підключені до робочої групи чи домену?
ПАМ’ЯТЬ

Навіщо відкривати cmd, щоб це зробити? Просто відкрийте ISE (як адміністратор) та наберітьSet-ExecutionPolicy RemoteSigned
Колонь Каньйон

OMG це, нарешті, виправило мою коробку win10, @kolob set-
Executionpolicy

Ви не повинні використовувати Unrestricted. Краще застосувати практикуRemoteSigned
каньйон

@ xer0x це має бути до тих пір, поки ви не будете керувати повноваженнями адміністратора
Колоб Каньйон

10

Встановлення політики виконання залежить від середовища. Якщо ви намагаєтесь виконати скрипт із запущеного x86 ISE, вам потрібно використовувати x86 PowerShell для встановлення політики виконання. Так само, якщо ви працюєте з 64-розрядним ISE, вам потрібно встановити політику за допомогою 64-розрядного PowerShell.


10

Win+ Rі введіть команду copy paste і натисніть OK:

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

І виконати свій сценарій.

Потім відновіть зміни, як-от:

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "AllSigned"

10

Ви також можете обійти це, скориставшись такою командою:

PS > powershell Get-Content .\test.ps1 | Invoke-Expression

Ви також можете прочитати цю статтю Скотта Сазерленда, яка пояснює 15 різних способів обійти PowerShell, Set-ExecutionPolicyякщо у вас немає прав адміністратора:

15 способів обійти політику виконання PowerShell


Це, мабуть, одне з найбільш переконливих посібників щодо усунення та розуміння цього обмеження.
Освальдо Меркадо

5
  1. Відкрийте PowerShell як адміністратор і запустіть Set-ExecutionPolicy -Scope CurrentUser
  2. Надайте RemoteSigned і натисніть Enter
  3. Запустіть Set-ExecutionPolicy -Scope CurrentUser
  4. Надайте необмежене і натисніть Enter


3

У редакторі PowerShell ISE я виявив, що в наступному рядку запущені перші дозволені сценарії.

Set-ExecutionPolicy RemoteSigned -Scope Process

2

У PowerShell 2.0 політику виконання було встановлено за замовчуванням відключеним.

Відтоді команда PowerShell зробила багато вдосконалень, і вони впевнені, що користувачі не будуть дуже ламати речі під час виконання сценаріїв. Тож від PowerShell 4.0 він включений за замовчуванням.

У вашому випадку введіть Set-ExecutionPolicy RemoteSignedз консолі PowerShell і скажіть "так".


2

У мене була така ж проблема і сьогодні. 64-розрядна політика виконання була необмеженою, а 32-розрядна - обмежена.

Ось як змінити лише 32-бітну політику віддалено:

Invoke-Command -ComputerName $servername -ConfigurationName Microsoft.PowerShell32 -scriptblock {Set-ExecutionPolicy unrestricted}

2

Перейдіть до шляху реєстру HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShellта встановіть ExecutionPolicyна RemoteSigned.


1
1. Відкрийте PowerShell як адміністратор і запустіть Set-ExecutionPolicy -Scope CurrentUser 2. Надайте RemoteSigned і натисніть Enter 3. Запустіть Set-ExecutionPolicy -Scope CurrentUser 4. Надайте необмежену та натисніть Enter
Ramanujam Allam

2

Я отримую ще одне попередження, коли намагаюся бігти Set-ExecutionPolicy RemoteSigned

Я вирішив за допомогою цих команд

Set-ExecutionPolicy "RemoteSigned" -Scope Process -Confirm:$false

Set-ExecutionPolicy "RemoteSigned" -Scope CurrentUser -Confirm:$false

1

Якщо ви тут через те, що працюєте з Ruby або Chef та використовуєте `` виконання системи, виконайте наступне:

`powershell.exe -ExecutionPolicy Unrestricted -command [Environment]::GetFolderPath(\'mydocuments\')`

Ця команда призначена для отримання папки "MyDocuments".

-ExecutionPolicy Unrestricted робить трюк.

Я сподіваюся, що це корисно для когось іншого.


Чи повинно бути прикладне `` насправді там?
Пітер Мортенсен

1

Кілька відповідей вказують на політику виконання. Однак деякі речі також вимагають "runas administrator". Це найбезпечніше, оскільки не існує постійної зміни в політиці виконання та може отримати попереднє обмеження адміністратора. Використовуйте з schedtask, щоб почати пакет із:

    runas.exe /savecred /user:administrator powershell -ExecutionPolicy ByPass -File script.ps1

як від Джека Едмонда вгорі, так і до Пітера Мортенсена / Дхани від поста Як запустити додаток як "запустити як адміністратор" з командного рядка?


1

Мені здалося, що ця лінія найкраще працювала на одному з моїх серверів Windows Server 2008 R2. Кілька інших не мали проблем без цього рядка в моїх сценаріях PowerShell:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process

1

Відкрийте консоль Powershell як адміністратора, а потім встановіть політику виконання

Set-ExecutionPolicy -ExecutionPolicy Remotesigned 

0

Ви можете скористатися спеціальним способом, щоб обійти його:

Get-Content "PS1scriptfullpath.ps1" | Powershell-NoProfile -

Він передає вміст скрипта powershell на powershell.exe і виконує його, минаючи політику виконання.


0

Це вирішило моє питання

Відкрийте PowerShellкоманду Windows та запустіть нижче запит, щоб змінитиExecutionPolicy

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

якщо він вимагає підтвердження змін, натисніть «Y» і натисніть клавішу Enter.



0
  1. Відкрити повноваження як адміністрація
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

використовувати цю команду



-2

Відкрийте вікно PowerShell як адміністратор . Це спрацює.


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