Почему моему локально созданному сценарию не разрешено запускаться в соответствии с политикой выполнения RemoteSigned?

98

Поскольку на этот вопрос продолжают поступать ответы, которые либо опровергаются основной частью вопроса, либо не касаются реальной проблемы, прочтите это простое резюме того, что вам нужно знать:

  • Это не вопрос «Почему моя установка 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 больше не заботится о том, чтобы скрипт не подписывался при запуске из общего сетевого ресурса?
БЕКОН
источник
1
@Downvoter: объясни, почему?
BACON

Ответы:

125

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

O-Dogg
источник
1
Как я объяснил, сценарий создается непосредственно на моем жестком диске (не загружается откуда-либо), и я подтвердил, что нет альтернативных потоков, идентифицирующих его как исходящие из другой зоны (например, Internet Explorer и другие веб-браузеры). Если я запускаю, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;я все равно получаю сообщение об ошибке, что сценарий не имеет цифровой подписи и не выполняется. Если я открываю диалоговое окно «Свойства» для вновь созданного файла, разблокировать нечего.
BACON
48
Что вы имеете в виду ~ " Свойства и выбор" Разблокировать "?
Игорь Ганапольский 04
1
@IgorGanapolsky они имеют в виду в проводнике, найдите ps1файл, щелкните его правой кнопкой мыши, чтобы открыть контекстное меню, и выберите Properties, на первой вкладке в нижней части будет указано, что файл заблокирован, и вы можете установить флажок, чтобы разблокировать его.
Lankymart
1
Обратите внимание, что если вы скачали zip-файл, вам следует разблокировать zip-файл перед его извлечением, чтобы избежать массовой разблокировки всех файлов внутри него.
Охад Шнайдер
14
@Lankymart Windows 10, пробовал, не говорит, что заблокирован.
Алан Бальеу
119

Что нужно проверить:

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

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
Энди Арисменди
источник
Значение по умолчанию для Scopeпараметра LocalMachine, поэтому Set-ExecutionPolicy Unrestrictedфактически такой же , как Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachineя уже пробовал. Да, Turn on Script Executionполитика включена для Computer Configuration. PowerShellоткрывается в C:\Users\UserName, поэтому я просто бегаю .\Desktop\Script.ps1по запросу. Использование абсолютного пути приводит к той же ошибке, что и вызов скрипта через powershell.exe.
BACON
Вы пробовали отключить настройку групповой политики и обновить ее с помощью gpupdate /force? (После перезапуска PowerShell.exe)
Энди Арисменди,
Что ж, долгое время я работал Unrestrictedв области LocalMachineвидимости, но когда я начал писать сценарии, я хотел запускать их с других компьютеров, на которые я LocalMachineвернулся, Undefinedи добавил текущую групповую политику для установки RemoteSignedв MachinePolicyобласти. Это всего лишь одноразовый тестовый сценарий, и на самом деле нет ничего страшного в том, чтобы запустить его из сети, я просто хочу знать, почему он не работает локально. В конце концов, локально созданный сценарий должен быть разрешен для выполнения RemoteSigned, верно? Я просто подумал, что что-то я упускаю или не понимаю.
BACON
@BACON Вы правы в том, что RemoteSignedсохранение Write-Host hiс помощью блокнота на рабочий стол должно работать нормально. Ваша конфигурация тоже выглядит нормально ... Мне кажется, что-то сломалось ... поэтому я предложил удалить групповую политику, чтобы посмотреть, поможет ли это.
Энди Арисменди
1
Для разработки мы просто -executionpolicy bypassвременно обходили проблему с удаленной подписью ... и это позволяло нам обнаруживать и отлаживать другие проблемы (не связанные, которые требовали от нас обновления PowerShell).
Doug_Ivison 08
13

Я наконец отследил это до .NET Code Access Security . У меня есть некоторые внутренние двоичные модули, которые хранятся и выполняются из общего сетевого ресурса. Чтобы заставить .NET 2.0 / PowerShell 2.0 загружать их, я добавил в Intranetгруппу кода правило URL, чтобы доверять этому каталогу:

PS> & "$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....

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -remgroup 1.2.3.
Microsoft (R) .NET Framework CasPol 2.0.50727.9136
Copyright (c) Microsoft Corporation.  All rights reserved.

The operation you are performing will alter security policy.
Are you sure you want to perform this operation? (yes/no)
yes
Removed code group from the Machine level.
Success

... У меня осталась конфигурация CAS по умолчанию, и теперь локальные скрипты снова работают. Это было время , так как я возился с CAS, и я не знаю , почему мое правило , казалось бы вмешиваться в те предоставление FullTrustк MyComputer, но так как CAS нежелателен из .NET 4.0 (на котором базируется PowerShell 3.0), I думаю, сейчас это спорный вопрос.

БЕКОН
источник
Как вы добавили правило URL? У меня была такая же проблема, и я надеюсь, что это поможет мне ее решить. Спасибо.
OptimusPrime
Прошло очень много времени с тех пор, как я работал caspol.exe, но после запуска caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrustя пришел к тому же 1.2.3.правилу, что и в этом ответе. Я использовал file://URL-адрес для ссылки на каталог на общем ресурсе SMB, хотя я вижу в документации, что в одном из -addgroup примеров используется путь UNC.
BACON
11

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

Единственное, что у меня работает, это

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

GeekMustHave
источник
1
Вы говорите, что ваш сценарий хранится на диске, подключенном к общему сетевому ресурсу? Или скрипт создает подключенный диск? Если первое, как указано в теле и заголовке вопроса, сценарий был создан и сохранен локально, поэтому происхождение / зона сценария не будет иметь значения. В любом случае использование Bypassполитики выполнения было предложено более пяти лет назад и совсем недавно, всего пять месяцев назад . Пожалуйста, прочтите вопрос и существующие ответы, прежде чем отвечать.
BACON
6

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

Шьям
источник
2
Как я объяснил как в вопросе, так и в моем комментарии к ответу @O-Dogg, сценарий создавался непосредственно на моем жестком диске (не загружался откуда-либо), и я подтвердил, что нет альтернативных потоков, идентифицирующих его как исходящие из другой зоны. (как Internet Explorer и другие веб-браузеры). Если я запустил, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;то все равно получал ошибку, что скрипт не был подписан цифровой подписью и не был выполнен. Если я открывал диалоговое окно «Свойства» для вновь созданного файла, разблокировать было нечего.
BACON
Стоит убедиться, что вы не создаете и не запускаете его на подключенном диске. Например, на наших серверах домашняя папка для каждого пользователя - это диск, подключенный к их личной папке.
Caltor 09
0

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

бдубб
источник
OP явно не хочет, чтобы сценарии выполнялись без подписи и не ссылались на IDE.
kfsone
1
Недоступно в Powershell ISE
Джош Ноу,
0

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

Мо Заатар
источник
1
Уже есть два ответа, которые игнорируют то, что указано в вопросе, и предлагают то же неприменимое решение. Я очень четко написал: «Я ... использовал потоковую утилиту Sysinternals и диалоговое окно свойств файла, чтобы подтвердить, что сценарий не рассматривается как исходящий из Интернета», а затем «он создается и выполняется локально». В названии даже написано, что сценарий «создан локально». Разблокировать нечем. Если разблокировка вашего скрипта решила вашу проблему, значит, у вас не было той же проблемы, что и у меня, потому что, как указано, мой скрипт не был заблокирован. -1.
BACON
1
@BACON, честно говоря, у меня были те же симптомы, что и у вас, и у меня разблокировка сработала. Даже несмотря на то, что мой сценарий был создан локально, мне приходилось разблокировать его каждый раз после сохранения.
SQB
Возможно, это
обходной
0

Сделайте резервную копию файла script.bs1

Для меня сработало удаление файла script.bs1 и выполнение команды выполнения.

Простая абстракция
источник
1
Какое сообщение об ошибке было решено таким образом?
БЕКОН
Я прошел через эту ошибку 2 раза и исправил ее одинаково. Похоже, что запуск команды выполнения из CMD немедленно запустится в другом файле с тем же именем, но с расширением (.cmd).
Простая абстракция
Файл C: \ Users \ UserName \ Desktop \ Script.ps1 не может быть загружен. Файл C: \ Users \ UserName \ Desktop \ Script.ps1 не имеет цифровой подписи. Сценарий не будет выполняться в системе. ((Script.ps1 ошибка без цифровой подписи))
Simple Abstraction
Понимаю. А что возвращается при запуске Get-ExecutionPolicy -List?
БЕКОН
MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
простая абстракция
-1

Выберите командную строку терминала вместо оболочки Power. Это должно сработать.

пранав аггарвал
источник
2
Что это вообще значит? Выбрать где? Целью было запустить сценарий PowerShell в PowerShell, поэтому использование чего-либо, кроме PowerShell, не сработает.
BACON
-1

Когда вы запускаете сценарий PowerShell .ps1, вы можете получить сообщение «.ps1 не имеет цифровой подписи. Сценарий не будет выполняться в системе ». Чтобы исправить это, вы должны выполнить команду ниже, чтобы запустить Set-ExecutionPolicy и изменить параметр политики выполнения.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Гаутам Шарма
источник
Другой ответ уже предлагает использовать Bypassполитику выполнения. В любом случае использование другой политики бесполезно и не решает фактическую проблему, если это RemoteSignedдействительно необходимо. Наконец, сообщение об ошибке, на которое вы ссылаетесь, не совпадает с сообщением в вопросе.
BACON
-2

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

Новый парень
источник
У вас была такая же проблема? Или если дважды щелкнуть .ps1файл, он откроется в Блокноте вместо выполнения сценария в PowerShell?
BACON
-2

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

Полина
источник
3
Как указано в вопросе, I am both a domain administrator and a local administrator. Запуск PowerShell с повышенными привилегиями не имеет значения, поскольку скрипту разрешено запускаться без повышенных прав при хранении в общей сетевой папке.
BACON
-4

Выполните ниже 2 команды в окне PowerShell

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

  2. Разблокировать файл-Путь D: \ PowerShell \ Script.ps1

Ракеш Донгарвар
источник
2
Ясно, что вы не читали вопрос или ответы другой давности, предлагающие варианты того же неприменимого решения, или мои комментарии, в которых снова и снова говорится, что это не ответ. Я бы сделал -10, если бы мог, но вместо этого мне придется довольствоваться -1.
BACON