Я использую Windows PowerShell 2.0 на 64-разрядной Windows 7 Professional. У меня есть script на моем рабочем столе, который вызывает следующую ошибку при попытке запустить его:
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
Я создал script себя в Notepad и использовал Sysinternals 'streams и диалог Properties
, чтобы подтвердить, что script не обрабатывается как из Интернета. Если я скопирую script в общий сетевой ресурс на сервере домена, то это разрешено выполнять. Если я запустил Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
, то локальному script все еще не разрешено выполнять, что имеет смысл, поскольку политика выполнения в области MachinePolicy
имеет приоритет.
Как указано в about_Execution_Policies
, политика RemoteSigned
означает:
-
Скрипты могут выполняться.
-
Требуется цифровая подпись от доверенного издателя на скриптах и файлах конфигурации, загружаемых из Интернета (включая программы электронной почты и обмена мгновенными сообщениями).
-
Не требует цифровых подписей на скриптах, которые вы запустили, и которые вы написали на локальном компьютере (не загружаемом из Интернета).
-
Риски, запускающие неподписанные скрипты из источников, отличных от Интернета, и подписанные, но вредоносные скрипты.
My script не подписан, но так как он создан и выполняется локально, он должен удовлетворять третьей отметке выше. Так почему же это не разрешено? Почему PowerShell жалуется, что мой script "не имеет цифровой подписи", когда это требование должно применяться только к файлам из Интернета? И почему он не заботится о том, чтобы script не подписывался при запуске из сетевого ресурса?