Подтвердить что ты не робот

Почему мой локально созданный 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 не подписывался при запуске из сетевого ресурса?

4b9b3361

Ответ 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". Работает отлично, когда я трачу часы, пытаясь изменить политику.