PowerShell сообщает, что «в этой системе отключено выполнение сценариев».

1765

Я пытаюсь запустить файл, который вызывает сценарий 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: NotSpecified: (:) [], PSSecurityException

    • FullyQualifiedErrorId: RuntimeException

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

Press any key to continue . . .

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

Что я делаю неправильно?

Конор
источник
3
Не смотри, приятель, я вошел в систему как администратор, а также выполнил запуск под именем "Администратор" и получил тот же результат, что и выше ...
Конор
2
Добрался до сути, ошибка вводила в заблуждение, проблема была в моем скрипте powershell, спасибо!
Конор
Стоит отметить, что политика выполнения имеет несколько областей применения, а запуск PowerShell различными способами может привести к различным политикам. Чтобы просмотреть список политик, запустите Get-ExecutionPolicy -List.
Беконные биты

Ответы:

2244

Если вы используете Windows Server 2008 R2, то существует версия PowerShell для x64 и x86, для каждой из которых должна быть установлена ​​политика выполнения. Вы установили политику выполнения на обоих хостах?

Как администратор , вы можете установить политику выполнения, набрав это в окне PowerShell:

Set-ExecutionPolicy RemoteSigned

Для получения дополнительной информации см. Использование командлета Set-ExecutionPolicy .

Когда вы закончите, вы можете установить политику обратно к ее значению по умолчанию с помощью:

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 не может быть первой строкой в ​​вашем скрипте. Если это так, выделите его и запустите selected только INITIALLY перед запуском остальной части вашего скрипта.
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 стилизует его как «Обход», а не «Обход». См .: technet.microsoft.com/nl-nl/library/hh849812.aspx
Джелле Гертс,
1
Это не работает для меня, я получаю то же разрешение, что и при обычном вызове. Тем type script.ps1 | powershell -не менее, вызов ps1 из .bat при действии работает.
Some_Guy
8
Цель политики выполнения состоит в том, чтобы не дать людям дважды щелкнуть .ps1и случайно запустить то, что они не хотели. Это произойдет с .batфайлами
Колоб Каньон
Вы экономите мой день, спасибо за ответ.
Арпит Патель
163

У меня была похожая проблема, и я заметил, что по умолчанию 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

х64 (64 бит)
Открыть C:\Windows\system32\cmd.exe
Запустить командуpowershell Set-ExecutionPolicy RemoteSigned

Вы можете проверить режим, используя

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

Ссылки:
MSDN - Windows PowerShell политики выполнения
Windows - 32-битная или 64-битная директория объяснения

Ральф Виллгосс
источник
133

Большинство существующих ответов объясняют как , но очень немногие объясняют почему . И прежде чем вы начнете выполнять код от незнакомцев в Интернете, особенно код, который отключает меры безопасности, вы должны точно понимать, что вы делаете. Итак, вот немного подробнее по этой проблеме.

Со страницы 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 As Adminstrator . Если вы находитесь в обычном режиме и пытаетесь изменить политику выполнения, вы получите следующую ошибку:

Доступ к разделу реестра «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

Вы можете найти точное местоположение, запустив переменную powershell

$profile

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

KyleMit
источник
8
Мне кажется, важно отметить, что хотя политика выполнения является мерой безопасности, она не предназначена для предотвращения выполнения пользователями кода PowerShell. Политика выполнения - это то, что предназначено для защиты ваших сценариев и определения того, кто их написал, изменил или утвердил, и все. Обойти политику выполнения с помощью чего-то простого Get-Content .\MyFile.ps1 | powershell.exe -NoProfile -.
Бекон Бит
1
Учитывая существование, -ExecutionPolicy ByPassоднако, какова цель этой политики в любом случае? Это просто для того, чтобы пользователи не могли случайно открыть консоль PowerShell и запустить вредоносный скрипт? Разве злоумышленник не может просто использовать исполняемый файл или пакетный скрипт, если он хочет обойти это? Даже после прочтения комментария @BaconBits я не совсем уверен, какой сценарий предназначен для предотвращения этой политики ...
Ajedi32
2
@ Ajedi32 Скажем, у меня есть задача, которая запускает сценарий на сетевом ресурсе. Когда я вызываю свой сценарий, я хочу, чтобы мой процесс проверил, что сценарий подписан. Я хочу, чтобы мой код дважды проверял, что скрипт, который я собираюсь запустить, является кодом, которому я доверяю. Мне все равно, если вы можете запустить мой код. Остановка - это работа прав доступа. Я просто хочу помешать вам заставить меня запускать код, который я не писал. Права доступа означают, что операционная система не позволяет вам изменять мой код при входе в систему. Подписание кода и политика выполнения означают, что мой скрипт не был изменен, когда я запускаю его.
Бекон Биты
40

В Windows 7:

Перейдите в меню «Пуск» и выполните поиск «Windows PowerShell ISE».

Щелкните правой кнопкой мыши версию x86 и выберите «Запуск от имени администратора».

В верхней части вставьте Set-ExecutionPolicy RemoteSigned; запустить скрипт Выберите «Да».

Повторите эти шаги для 64-разрядной версии Powershell ISE (не для версии x86).

Я просто проясняю шаги, на которые намекнул @Chad Miller. Спасибо Чад!

Райан
источник
39

Также выполнение этой команды перед сценарием также решает проблему:

set-executionpolicy unrestricted
Manik Sikka
источник
27
-1 - следуй принципу наименьшего разрешения. Как минимум, установите политикуRemoteSigned прежде чем снимать все ограничения в вашей политике безопасности. Если это не сработает, тогда переоцените свои болевые точки и почему это не работает. Вы можете установить unrestrictedв качестве последнего средства, но это не должно быть вашей отправной точкой.
KyleMit
3
Спасибо за указание на эту опцию тоже. При всем уважении к требованиям безопасности в производственных целях, в то время, когда спрос на быстрое создание прототипов настолько высок, все политики и безопасность действительно мешают выполнению задач.
тишма
1
Что касается комментариев по поводу прототипирования, я боюсь, что именно поэтому дрянной код попадает в производство. Конечно, это просто тривиальный пример, но если вы не можете решить что-то тривиальное во время разработки, это беспокоит выпуск. Кроме того, для кода на заказ, и, если вы можете, знать целевую среду - мы устанавливаем большинство наших внутренних систем как Remotesigned.
Трикс
34

Если вы находитесь в среде, где вы не являетесь администратором, вы можете установить Политику выполнения только для вас, и для этого не потребуется администратор.

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

или

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

Вы можете прочитать все об этом в справочной записи.

Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full
Мика "Powershell Ninja"
источник
Отлично работал для меня в Windows 8, даже когда Set-ExecutionPolicy Unrestrictedадминистратор не казался достаточно «неограниченным», чтобы реально помочь.
Патридж
1
Я полагаю, что вы, возможно, испытываете объект групповой политики или что-то еще, перезаписывая настройку уровня «LocalMachine» для ExecutionPolicy. Вы не можете перезаписать, что политика домена имеет место с командой Set-ExecutionPolicy. Однако, устанавливая уровень доступа «CurrentUser», вы и только вы будете иметь указанную Политику выполнения. Это связано с тем, что компьютер просматривает политику выполнения CurrentUser, прежде чем проверяет параметр LocalMachine.
Мика 'Powershell Ninja'
1
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted" - единственное решение, которое сработало для меня. Спасибо
Paulj
32

RemoteSigned: все созданные вами сценарии будут запущены, и все сценарии, загруженные из Интернета, должны быть подписаны доверенным издателем.

ОК, измените политику, просто набрав:

Set-ExecutionPolicy RemoteSigned
Jaime
источник
Как рекомендуется в других статьях: разумно включать «-Scope CurrentUser» для более безопасной политики, когда это имеет смысл.
clusterdude
32

Мы можем получить статус current 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более расслаблен, чем Unrestricted.

Пратик Патил
источник
4
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force; AKA быстрый и грязный способ сказать VS2015 прекратить жаловаться и запустить мой кровавый сценарий. Спасибо. спасатель.
Eon
1
Конечные точки с запятой на концах ваших команд излишни.
Bill_Stewart
23

Я использую Windows 10 и не смог запустить какую-либо команду. Единственная команда, которая дала мне некоторые подсказки, была такая:

[64]

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

Но это не сработало. Это было ограничено. Вероятно, новые политики безопасности для Windows10. У меня была эта ошибка:

Set-ExecutionPolicy: Windows PowerShell успешно обновил политику выполнения, но параметр переопределяется политикой, определенной в более конкретной области. Из-за переопределения ваша оболочка сохранит свою текущую эффективную политику выполнения ...

Поэтому я нашел другой способ ( решение ):

  1. Открыть Run Command / Console ( Win+ R)
  2. Тип: gpedit.msc ( редактор групповой политики )
  3. Перейдите к Политике локального компьютера -> Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Windows Powershell .
  4. Включить « Включить выполнение скрипта» »
  5. Установите политику по мере необходимости. Я установил мой « Разрешить все сценарии ».

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

hugocabral
источник
Это автономная установка, или вы подключены к рабочей группе или домену?
MEMark
Зачем открывать cmd для этого? Просто откройте ISE (как администратор) и введитеSet-ExecutionPolicy RemoteSigned
Колоб Каньон
О, Боже, это, наконец, исправило мою коробку win10, @kolob set-
executepolicy
Вы не должны использовать Unrestricted. Лучше практиковатьсяRemoteSigned
Каньон
@ xer0x это должно быть столько времени, сколько вы запускаете powershell от имени администратора
Kolob Canyon
10

Настройка политики выполнения зависит от среды. Если вы пытаетесь выполнить сценарий из работающего x86 ISE, вам нужно использовать x86 PowerShell для установки политики выполнения. Аналогично, если вы используете 64-битный ISE, вы должны установить политику с 64-битным PowerShell.

ScriptAholic
источник
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. Предоставьте Unrestricted и нажмите Enter
Рамануджам Аллам
источник
5

Вы можете попробовать это и выбрать опцию «Все»

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
Таки Раза Хан
источник
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}
rko281
источник
2

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

Sunish surendran.k
источник
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 делает трюк.

Я надеюсь, что это полезно для кого-то еще.

JGutierrezC
источник
Должно ли вмещающее "действительно быть там?"
Питер Мортенсен
1

Несколько ответов указывают на политику выполнения. Однако для некоторых вещей требуется также «администратор рун». Это наиболее безопасно, поскольку нет никаких постоянных изменений в политике выполнения, и может быть преодолено ограничение администратора. Используйте с 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
WIlliamT
источник
1

Откройте консоль Powershell от имени администратора и установите политику выполнения

Set-ExecutionPolicy -ExecutionPolicy Remotesigned 
lokeshbandharapu
источник
0

Вы можете использовать специальный способ обойти это:

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

Он передает содержимое сценария powershell в powershell.exe и выполняет его в обход политики выполнения.

Васиф хасан
источник
0

Это решило мою проблему

Откройте Windows PowerShellCommand и выполните запрос ниже, чтобы изменитьExecutionPolicy

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

если он запрашивает подтверждение изменений, нажмите «Y» и нажмите ввод.

Арвинд Чоурасия
источник
0

Запустить Set-ExecutionPolicy RemoteSignedкоманду

MAXXI
источник
0
  1. Откройте PowerShell как администрация
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

используйте эту команду

МД ШАЙОН
источник
-1

Откройте cmd вместо powershell. Это помогло мне ...

Jelmer Jellema
источник
-2

Откройте окно PowerShell от имени администратора . Это будет работать.

Suganthan Raj
источник
Это не работает. Однако запуск PowerShell Set-ExecutionPolicy RemoteSigned сработал.
Тронк