Поскольку на этот вопрос продолжают поступать ответы, которые либо опровергаются основной частью вопроса, либо не касаются реальной проблемы, прочтите это простое резюме того, что вам нужно знать:
- Это не вопрос «Почему моя установка PowerShell по умолчанию не запускает сценарии?» вопрос.
- Это не вопрос «Почему моя установка PowerShell не запускает сценарии, загруженные из Интернета?» вопрос.
- Вопрос в том, почему
RemoteSigned
политика выполнения предотвращает выполнение скрипта, хотя этого не должно.RemoteSigned
- единственная политика выполнения, которую я хочу использовать. Я знаю, что доступны другие, менее строгие правила. Если бы эти политики были приемлемыми заменами, я бы просто использовал их, и этот вопрос не существовал бы.- Политика выполнения уже установлена на
RemoteSigned
. Изменение сRemoteSigned
наRemoteSigned
не является решением.- Файл сценария создается и хранится локально.
- Файл скрипта не заблокирован. Файл сценария никогда не блокировался (см. Предыдущий пункт).
- Файл сценария не может быть разблокирован, потому что разблокировать нечего (см. Предыдущий пункт).
- Файл сценария выполняется (пытается быть запущен) администратором.
Windows PowerShell
- единственное задействованное приложение. Ни,Windows PowerShell ISE
ниCommand Prompt
другие инструменты или редакторы не имеют значения.- Причина проблемы уже установлена (см. Принятый ответ). По прошествии почти 8 лет, я думаю, все другие очевидные объяснения, применимы они или нет, тоже были опубликованы. Если вы думаете иначе , то , пожалуйста , прочитайте вопрос и существующие ответы в полном объеме , прежде чем добавлять ваши.
Я использую Windows PowerShell 2.0 на 64-битной Windows 7 Professional. У меня есть скрипт, Desktop
который вызывает следующую ошибку, когда я пытаюсь его запустить:
File C:\Users\UserName\Desktop\Script.ps1 cannot be loaded. The file C:\Users\UserName\Desktop\Script.ps1 is not digitally signed. The script will not execute on the system. Please see "get-help about_signing" for more details..
At line:1 char:54
+ C:\Users\UserName\Desktop\TestGetWindowsUpdateLog.ps1 <<<<
+ CategoryInfo : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException
Я одновременно и администратор домена, и локальный администратор, и если я запускаю Get-ExecutionPolicy -List
, то вижу, что Group Policy Object
созданный мной для настройки PowerShell правильно применяет RemoteSigned
политику выполнения на уровне компьютера:
Scope ExecutionPolicy
----- ---------------
MachinePolicy RemoteSigned
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
Я создал скрипт самостоятельно в Notepad
, и использовал Sysinternals " streams
полезность и файл Properties
диалога , чтобы подтвердить , что сценарий не рассматривается как прийдя из Интернета. Если я скопирую сценарий в общий сетевой ресурс на сервере домена, он будет выполнен. Если я запускаю, Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
локальный сценарий по-прежнему не может выполняться, что имеет смысл, поскольку политика выполнения в области MachinePolicy
видимости будет иметь приоритет.
Как задокументировано about_Execution_Policies
( текущая ; на момент возникновения вопроса ), RemoteSigned
политика означает:
Скрипты можно запускать.
Требуется цифровая подпись от доверенного издателя для сценариев и файлов конфигурации, загружаемых из Интернета (включая программы электронной почты и обмена мгновенными сообщениями).
Не требует цифровой подписи для сценариев, которые вы запускали и написали на локальном компьютере (не загружены из Интернета).
Риск выполнения неподписанных сценариев из источников, отличных от Интернета, и подписанных, но вредоносных сценариев.
Мой скрипт не подписан, но поскольку он создается и выполняется локально, он должен удовлетворять третьему пункту выше. Следовательно...
- Почему моему скрипту не разрешено запускаться?
- Почему PowerShell жалуется, что мой сценарий «не имеет цифровой подписи», когда это требование должно применяться только к файлам из Интернета?
- Почему PowerShell больше не заботится о том, чтобы скрипт не подписывался при запуске из общего сетевого ресурса?