Почему мой локально созданный сценарий не разрешается запускать в соответствии с политикой выполнения RemoteSigned? - PullRequest
45 голосов
/ 16 марта 2012

Я использую Windows PowerShell 2.0 на 64-битной Windows 7 Professional .У меня на рабочем столе есть скрипт, который вызывает следующую ошибку при попытке его запустить:

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

Я сам создал сценарий в Блокнот , ииспользовал утилиту Sysinternals ' streams и диалоговое окно файла Properties, чтобы подтвердить, что сценарий не обрабатывается как поступивший из Интернета.Если я скопирую сценарий в общую сетевую папку на доменном сервере, он будет выполнен.Если я запускаю Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine, то локальный сценарий по-прежнему не может выполняться, что имеет смысл, поскольку политика выполнения в области действия MachinePolicy будет иметь приоритет.

Как указано в about_Execution_Policies, политика RemoteSigned означает:

  • Могут выполняться сценарии.

  • Требуется цифровая подпись от надежного издателя для сценариев и конфигурациифайлы, которые загружаются из Интернета (включая программы электронной почты и обмена мгновенными сообщениями).

  • Не требует цифровых подписей на сценариях, которые вы запустили и которые вы написали на локальном компьютере(не загружается из Интернета).

  • Риск запуска неподписанных сценариев из источников, отличных от Интернета, и подписанных, но вредоносных сценариев.

Мой сценарий не подписан, но, поскольку он создается и выполняется локально, он должен соответствовать третьему пункту выше.Так почему же ему не разрешено бежать?Почему PowerShell жалуется, что мой сценарий «не имеет цифровой подписи», когда это требование должно применяться только к файлам из Интернета?И почему он больше не заботится о том, чтобы скрипт не был подписан при запуске из общей сетевой папки?

Ответы [ 10 ]

82 голосов
/ 27 ноября 2012

Файл заблокирован? У меня была та же проблема, и я смог ее решить, щелкнув правой кнопкой мыши файл .PS1, Свойства и выбрав Разблокировать.

46 голосов
/ 16 марта 2012

Несколько вещей для проверки:

Можно ли перейти на неограниченный доступ?

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
7 голосов
/ 08 февраля 2013

Я наконец отследил это до .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 to MyComputer, но с CAS устарела с .NET 4.0 (на котором основан PowerShell 3.0), я думаю, сейчас это спорный вопрос.

5 голосов
/ 24 мая 2013

Если файл копируется из сетевого расположения, то есть с другого компьютера, Windows может заблокировать этот файл.Щелкните правой кнопкой мыши по файлу, нажмите кнопку разблокировки и посмотрите, работает ли он.

1 голос
/ 29 мая 2013

Это проблема IDE. Измените настройку в графическом интерфейсе PowerShell. Перейдите на вкладку Инструменты и выберите Параметры, а затем Параметры отладки . Затем установите флажок Отключить требование подписи скриптов . Готово.

0 голосов
/ 26 ноября 2018

Я обнаружил при запуске файла PS1 для подключенного диска в Dropbox, что я всегда получаю эту ошибку.При открытии свойств для PS1 отсутствует «Разблокировать».

Единственное, что мне подходит, это

powershell.exe -executionpolicy bypass -file. \ Script.ps1

0 голосов
/ 27 июня 2018

Запустите менее 2 команд в окне PowerShell

  1. Set-ExecutionPolicy неограниченно

  2. Unblock-File -Path D: \ PowerShell \ Script.ps1

0 голосов
/ 16 ноября 2016

Что для меня работает, так это щелчок правой кнопкой мыши на файле .ps1, а затем свойства. Нажмите кнопку «РАЗБЛОКИРОВАТЬ». Прекрасно работает для меня после нескольких часов попыток изменить политику.

0 голосов
/ 23 мая 2016

Попробуйте запустить графический интерфейс Powershell от имени администратора.

0 голосов
/ 07 августа 2014

У меня возникла та же проблема, и я исправил ее, изменив программу по умолчанию для открытия файлов .ps1 в PowerShell. Было установлено Блокнот .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...