Чому моєму локально створеному сценарію не дозволяється запускатись відповідно до політики виконання 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: хочете сказати причину, чому?
БЕКОН

Відповіді:


125

Файл заблоковано? У мене була та сама проблема, і я зміг її вирішити, клацнувши правою кнопкою миші файл .PS1, Властивості та вибравши Розблокувати.


1
Як я пояснив, сценарій створюється безпосередньо на моєму жорсткому диску (не завантажується звідки-небудь), і я підтвердив, що немає альтернативних потоків, які б ідентифікували його як той, що походить з іншої зони (наприклад, Internet Explorer та інші веб-браузери). Якщо я запускаю, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;я все одно отримую помилку, що сценарій не підписаний цифровим способом і він не виконується. Якщо я відкрию діалогове вікно Властивості для нещодавно створеного файлу, розблокувати нічого.
БЕКОН

48
Що ви маєте на увазі ~ " Властивості та вибір розблокування "?
ІгорГанапольський

1
@IgorGanapolsky вони мають на увазі в Провіднику, знайдіть ps1файл, клацніть на ньому правою кнопкою миші, щоб відкрити контекстне меню, і виберіть Properties, на першій вкладці внизу він скаже, що файл заблоковано, і дозволить вам встановити прапорець, щоб його розблокувати.
Ланкімарт,

1
Зауважте, що якщо ви завантажили zip-файл, перед його вилученням слід розблокувати zip-файл, щоб уникнути масової розблокування всіх файлів усередині нього.
Охад Шнайдер,

14
@Lankymart Windows 10, спробував це, не говорить, що його заблоковано.
Alan Baljeu

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

13

Нарешті я відстежив це до .NET Code Access Security . У мене є кілька внутрішньо розроблених двійкових модулів, які зберігаються та виконуються з мережевого ресурсу. Щоб отримати .NET 2.0 / PowerShell 2.0 для їх завантаження, я додав правило URL-адреси до Intranetгрупи кодів, щоб довіряти цьому каталогу:

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.
БЕКОН

11

Під час запуску файлу PS1 для відображеного диска в Dropbox я дізнався, що я завжди отримую цю помилку. При відкритті властивостей для PS1 немає "Розблокувати".

Єдине, що мені вдається - це

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


1
Ви говорите, що ваш сценарій зберігається на диску, зіставленому з мережевим ресурсом? Або сценарій створює відображений диск? Якби перший, як зазначено в тілі та назві питання, скрипт створювався та зберігався локально, то походження / зона сценарію не була б фактором. У будь-якому випадку, використання Bypassполітики виконання вже пропонувалося більше п’яти років тому та ще п’ять місяців тому . Будь ласка, прочитайте питання та існуючі відповіді перед тим, як відповісти.
BACON

6

Якщо файл скопійовано з мережевого розташування, тобто іншого комп'ютера, Windows, можливо, заблокував цей файл. Клацніть правою кнопкою миші на файлі та натисніть кнопку розблокування та перевірте, чи працює.


2
Як я пояснив як у запитанні, так і в своєму коментарі до відповіді @ O-Dogg, сценарій створювався безпосередньо на моєму жорсткому диску (не завантажувався звідки-небудь), і я підтвердив, що не було альтернативних потоків, які б ідентифікували його як той, що походить з іншої зони (наприклад, Internet Explorer та інші веб-браузери). Якщо я запустив, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;я все одно отримав помилку, що сценарій не був цифровим підписом і він не був виконаний. Якщо я відкрив діалогове вікно Властивості для нещодавно створеного файлу, розблокувати не було чого.
БЕКОН

Варто перевірити, що ви не створюєте та не запускаєте його на зіставленому диску. Наприклад, на наших серверах домашньою папкою для кожного користувача є прив'язаний диск до їх особистої папки.
Калтор

0

Це проблема IDE. Змініть налаштування в графічному інтерфейсі PowerShell. Перейдіть на вкладку Інструменти та виберіть Параметри, а потім Параметри налагодження . Потім поставте прапорець Вимкнути вимогу для підписання сценаріїв . Готово.


OP явно не хоче, щоб сценарії працювали без підпису, і не посилався на IDE.
kfsone

1
Недоступно в Powershell ISE
Джош Ное,

0

Для мене працює правий клік на файл .ps1, а потім властивості. Натисніть кнопку «РОЗБЛОКУВАТИ». Чудово працює у мене після того, як годинами намагався змінити політику.


1
Уже є дві відповіді, які ігнорують те, що сказано у питанні, і пропонують це саме непридатне рішення. Я дуже чітко написав: "Я ... використовував утиліту потоків Sysinternals і діалогове вікно Властивості файлу, щоб підтвердити, що сценарій не розглядається як той, що надходить з Інтернету", а потім "його створюють і виконують локально". У заголовку навіть сказано, що сценарій "створений локально". Розблокувати нема чого. Якщо розблокування вашого сценарію вирішило вашу проблему, то у вас не було тієї самої проблеми, яка була у мене, оскільки, як зазначено, мій сценарій не був заблокований. -1.
БЕКОН

1
@BACON, щоб бути справедливим, у мене були ті самі симптоми, що і у вас, і для мене розблокування спрацювало. Навіть думаючи, що мій сценарій створений локально, мені доводилося його розблоковувати щоразу після збереження.
SQB

Це, можливо, робота, але не повне правильне рішення
Мо Заатар,

0

Зробіть резервну копію для файлу script.bs1

Мені вдалося видалити файл script.bs1 та запустити команду виконання.


1
Яке повідомлення про помилку, яке ви отримували, було вирішено цим?
БЕКОН

Я пройшов цю помилку два рази і виправляв її так само. Схоже, запуск команди виконання з CMD буде негайно запущений для іншого файлу з тим самим іменем, але з розширенням (.cmd).
Проста абстракція

Файл C: \ Users \ UserName \ Desktop \ Script.ps1 не може бути завантажений. Файл C: \ Users \ UserName \ Desktop \ Script.ps1 не має цифрового підпису. Сценарій не буде виконуватися в системі. ((Script.ps1 не помилка з цифровим підписом))
Проста абстракція

Розумію. А що повертається, коли ти біжиш Get-ExecutionPolicy -List?
БЕКОН

MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
Simple Abstraction

-1

Виберіть командний рядок терміналу замість оболонки живлення. Це має спрацювати.


2
Що це взагалі означає? Виберіть його де? Метою було запустити сценарій PowerShell у PowerShell, тому використання будь-чого іншого, крім PowerShell, не буде працювати.
BACON

-1

Коли ви запускаєте сценарій PowerShell .ps1, може з’явитися повідомлення про те, що .ps1 не має цифрового підпису. Сценарій не буде виконуватися в системі. " Щоб це виправити, вам потрібно запустити наведену нижче команду, щоб запустити Set-ExecutionPolicy і змінити налаштування політики виконання.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Інша відповідь вже пропонує використовувати Bypassполітику виконання. Використання іншої політики в будь-якому випадку не є корисним і не стосується фактичної проблеми, якщо RemoteSignedнасправді це те, що потрібно. Нарешті, повідомлення про помилку, на яке ви посилаєтесь, не таке, як у запитанні.
БЕКОН

-2

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


У вас була ця сама проблема? Або коли ви двічі клацаєте .ps1файл, який він відкриває в Блокноті, замість того, щоб виконувати сценарій у PowerShell?
БЕКОН

-2

Спробуйте запустити графічний інтерфейс Powershell від імені адміністратора


3
Як зазначено у питанні I am both a domain administrator and a local administrator,. Запуск PowerShell з підвищеним рівнем не призведе до різниці, оскільки сценарію було дозволено працювати без підвищення, коли він зберігається в спільній мережі.
БЕКОН

-4

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

  1. Політика необмежена

  2. Розблокувати файл-Шлях D: \ PowerShell \ Script.ps1


2
Очевидно, ви не читали запитання чи інші багаторічні відповіді, які пропонують варіанти цього самого непридатного рішення, чи мої коментарі, що знову і знову заявляють, що це не відповідь. Я б -10 це, якби міг, але натомість мені доведеться погодитися на -1.
BACON
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.