Почему мой локально созданный script не разрешен для запуска в рамках политики выполнения RemoteSigned?
Я использую 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 не подписывался при запуске из сетевого ресурса?
Ответы
Ответ 1
Я, наконец, проследил это до .NET Code Access Security. У меня есть внутренние встроенные двоичные модули, которые хранятся и исполняются из общего сетевого ресурса. Чтобы загрузить .NET 2.0/PowerShell 2.0, я добавил правило URL-адреса в группу кода Intranet
, чтобы доверять этому каталогу:
PS C:\Users\UserName> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -listgroups
Microsoft (R) .NET Framework CasPol 2.0.50727.5420
Copyright (c) Microsoft Corporation. All rights reserved.
Security is ON
Execution checking is ON
Policy change prompt is ON
Level = Machine
Code Groups:
1. All code: Nothing
1.1. Zone - MyComputer: FullTrust
1.1.1. StrongName - ...: FullTrust
1.1.2. StrongName - ...: FullTrust
1.2. Zone - Intranet: LocalIntranet
1.2.1. All code: Same site Web
1.2.2. All code: Same directory FileIO - 'Read, PathDiscovery'
1.2.3. Url - file://Server/Share/Directory/WindowsPowerShell/Modules/*: FullTrust
1.3. Zone - Internet: Internet
1.3.1. All code: Same site Web
1.4. Zone - Untrusted: Nothing
1.5. Zone - Trusted: Internet
1.5.1. All code: Same site Web
Обратите внимание, что в зависимости от того, какие версии .NET установлены и есть ли 32- или 64-разрядная Windows, caspol.exe
может существовать в следующих местах, каждый со своей собственной конфигурацией безопасности (security.config
):
-
$Env:SystemRoot\Microsoft.NET\Framework\v2.0.50727\
-
$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\
-
$Env:SystemRoot\Microsoft.NET\Framework\v4.0.30319\
-
$Env:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\
После удаления группы 1.2.3
(оставляя меня с настройкой по умолчанию для CAS) локальные скрипты теперь работают снова. Прошло некоторое время с тех пор, как я возился с CAS, и я не уверен, почему мое правило, похоже, мешает тем, кто предоставляет FullTrust
, MyComputer
, но поскольку CAS устарел от .NET 4.0 (на котором основан PowerShell 3.0), я думаю, теперь это спорный вопрос.
Ответ 2
Заблокирован ли файл? У меня была такая же проблема, и я смог ее разрешить, щелкнув файл .PS1, "Свойства" и выбрав "Разблокировать".
Ответ 3
Некоторые вещи для проверки:
Можете ли вы перейти на неограниченный?
Set-ExecutionPolicy Unrestricted
Установлена ли групповая политика?
-
Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell
-
User Configuration\Administrative Templates\Windows Components\Windows PowerShell
Также, как вы вызываете Script.ps1?
Позволяет ли это выполнить?
powershell.exe -executionpolicy bypass -file .\Script.ps1
Ответ 4
Если файл скопирован из сетевого расположения, то есть другого компьютера, Windows может заблокировать этот файл. Щелкните правой кнопкой мыши на файле и нажмите кнопку разблокирования и посмотрите, работает ли он.
Ответ 5
Это проблема с IDE. Измените настройку в графическом интерфейсе PowerShell. Перейдите на вкладку "Инструменты" и выберите "Параметры", а затем "Параметры отладки". Затем установите флажок Отключить требование для подписания скриптов. Готово.
Ответ 6
У меня была такая же проблема, и я исправил ее, изменив программу по умолчанию, чтобы открыть файлы .ps1 в PowerShell. Он был установлен в Notepad.
Ответ 7
Попробуйте запустить GUI Powershell в качестве администратора
Ответ 8
Для меня все работает правой кнопкой мыши по файлу .ps1, а затем по свойствам. Нажмите кнопку "UNBLOCK". Работает отлично, когда я трачу часы, пытаясь изменить политику.