Самое первое из за чего обычно не запускается скрипт написанный на powershell это из за следующих ошибок:
Файл <file-name> невозможно загрузить. Файл <file-name> не имеет цифровой подписи. Скрипт не будет выполнен в системе. Чтобы получить дополнительные сведения, введите команду «Get-Help about_signing».
The file <file-name> cannot be loaded. The file <file-name> is not digitally signed. The script will not execute on the system. Please see «Get-Help about_Signing» for more details.
или
Запустить программу от ненадежного издателя? Файл <file-name> опубликован CN=<publisher-name>. Этот издатель не помечен как надежный в данной системе. Выполнять следует только скрипты надежных издателей.
[V] Никогда не выполнять [D] Не выполнять [R] Выполнить один раз [A] Всегда выполнять [?] Справка (по умолчанию «D»):
Do you want to run software from this untrusted publisher? The file <file-name> is published by CN=<publisher-name>. This publisher is not trusted on your system. Only run scripts from trusted publishers.
[V] Never run [D] Do not run [R] Run once [A] Always run [?] Help (default is «D»):
Данные события происходят из за политик выполнения Windows PowerShell. Однако не стоит считать, что они существенно повышают безопасность и ограничивают возможность пользователю навредить себе. Это может обезопасить только от случайных дейстивий. Т.к. данные из скрипта вы можете скопировать в консоль PowerShell и скрипт отработает.
Поэтому обычно данную проблему решают командой:
1 |
Set-ExecutionPolicy Unrestricted LocalMachine |
Применить данную команду рекомендуется в консоли PowerShell запущенной от имени администратора. Данная команда разрешит выполнять, на данном компьютере, не подписанные скрипты и скрипты из Интернета.
Если данное решение вас не устраивает разберёмся подробнее.
Get-Executionpolicy
Посмотреть текущие настройки политики во всех областях применения можно выполнив командлет Get-Executionpolicy с параметром list.
Пример:
1 |
get-executionpolicy -list |
Результат выполнения командлета:
Scope | ExecutionPolicy |
#8212;#8212; | ————— |
MachinePolicy | Unrestricted |
UserPolicy | Undefined |
Process | RemoteSigned |
CurrentUser | AllSigned |
LocalMachine | Restricted |
Значения политики.
Данная политика может принимать 6 значений:
Restricted (Политика выполняется по умолчанию. Например если во всех областях применения стоит значение Undefined)
— Допускает отдельные команды, но скрипты выполнять нельзя.
— Препятствует выполнению всех файлов скриптов, включая файлы форматирования и конфигурации (PS1XML), файлы скриптов модулей (PSM1) и профили Windows PowerShell (PS1).
AllSigned
— Выполнение скриптов разрешено.
— Требует, чтобы все скрипты и файлы конфигурации были подписаны надежным издателем, в том числе скрипты, подготовленные на локальном компьютере.
— Перед выполнением скриптов издателей, для которых еще не определено, являются ли они надежными, выводятся предупреждения.
— Имеется риск выполнения неподписанных скриптов из источников, отличных от Интернета, а также подписанных, но вредоносных скриптов.
RemoteSigned
— Выполнение скриптов разрешено.
— Требует наличия цифровой подписи надежного издателя у скриптов и файлов конфигурации, загружаемых из Интернета (включая электронную почту и программы мгновенного обмена сообщениями).
— Не требует наличия цифровых подписей у скриптов, выполняемых и написанных на локальном компьютере (не загруженных из Интернета).
— Имеется риск выполнения подписанных, но вредоносных скриптов.
Unrestricted
— Могут выполняться неподписанные скрипты. (Имеется риск выполнения вредоносных скриптов.)
— Предупреждает пользователя перед выполнением скриптов и файлов конфигурации, загруженных из Интернета.
Bypass
— Ничего не блокируется, и никакие предупреждения и запросы не появляются.
— Эта политика выполнения предназначена для конфигураций, в которых скрипт Windows PowerShell встроен в более крупное приложение, или для конфигураций, в которых Windows PowerShell является платформой для программы, у которой имеется собственная модель обеспечения безопасности.
Undefined
— В текущей области не задана политика выполнения.
— Если политика выполнения во всех областях имеет значение Undefined, действует политика выполнения Restricted, которая является политикой выполнения по умолчанию.
Области применения политики.
Областей применений пять:
MachinePolicy и UserPolicy задаются политиками AD или локальными политиками данного компьютера.
Process — область применения текущая ссесия. В справке говорится, что её значение хранится в переменной $PSExecutionPolicyPreference однако получить/изменить значение данной политики через переменную не удалось. Измения сделанные на эту область применения ни как не повлияют на другие сессии.
CurrentUser — область применения текущей пользователь. Её значение хранится в разделе реестра HKEY_CURRENT_USER («HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell\ExecutionPolicy»).
LocalMachine — область применения на всех пользователей текущего компьютера. Она хранится в разделе реестра HKEY_LOCAL_MACHINE(«HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\ScriptedDiagnostics\ExecutionPolicy»).
У команды get-executionpolicy есть параметр -Scope. С помощью данного параметра можно выбрать область применения для которого отобразиться значение политики.
Прмер:
1 |
Get-ExecutionPolicy -scope Process |
Результат выполнения командлета: RemoteSigned
При этом Области применения имеют приоритет высшим обладает MachinePolicy, потом UserPolicy, Process, CurrentUser и самый низкий приоритет у LocalMachine.
Поэтому в примере:
Scope | ExecutionPolicy |
#8212;#8212; | ————— |
MachinePolicy | Unrestricted |
UserPolicy | Undefined |
Process | RemoteSigned |
CurrentUser | AllSigned |
LocalMachine | Restricted |
В текущей ссесии результирующая политика будет иметь значение Unrestricted.
Для того что бы узнать значение политики выполнения скриптов для данной сесии, надо применить командлет Get-ExecutionPolicy без параметров.
Пример:
1 |
Get-ExecutionPolicy |
Вывод: Unrestricted
Set-Executionpolicy
Что бы изменять значение политик выполнения скриптов PowerShell, существует коммандлет Set-ExecutionPolicy.
Данный командлет имеет следующие параметры:
-ExecutionPolicy
Указывает значение политики. Может иметь следующие значения: Restricted, AllSigned, RemoteSigned, Unrestricted, Bypass, Undefined. Данный параметр обязательный для указания. Если не указан, во время выполнения комадлет попросит указать значения.
1 |
Set-ExecutionPolicy |
Вывод:
Укажите значения для следующих параметров:
ExecutionPolicy:
-Scope
Определяет область применения данной политики. Может иметь следующие значения: LocalMachine ,Process, CurrentUser. Если параметр области применения не указан, по умолчанию указывается значение LocalMachine.
1 |
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process |
или
1 |
Set-ExecutionPolicy Unrestricted Process |
-Force
С этим параметром командлет не будет требовать подтверждения со стороны пользователя.
Пример
1 |
Set-ExecutionPolicy Unrestricted Process -Force |
Командлет ничего не выведет на экран и применит значение политики.
-Confirm
Если же вам наоборот мало одного подтверждения. Можно указать параметр Confirm и у вас будет ещё один, дополнительный, запрос на подтверждение ваших действий:
1 |
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process -confirm |
Результат выполнения:
Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции «Set-ExecutionPolicy» над целевым объектом «Unrestricted».
[Y] Да — Y [A] Да для всех — A [N] Нет — N [L] Нет для всех — L [S] Приостановить — S [?] Справка (значением по умолчанию является «Y»):
Изменение политики выполнения
Политика выполнения защищает компьютер от ненадежных сценариев. Изменение политики выполнения может поставить под угрозу безопасность системы, как описано в разделе справки, вызываемом командой about_Execution_Policies. Вы хотите изменить политику выполнения?
[Y] Да — Y [N] Нет — N [S] Приостановить — S [?] Справка (значением по умолчанию является «Y»):
-WhatIf
С параметром WhatIf командлет не выполняется. А выводит на консоль свои предполагаемые действия без данного параметра.
1 |
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process -WhatIf |
Результат выполниня:
WhatIf: Выполнение операции «Set-ExecutionPolicy» над целевым объектом «Unrestricted».
Изменение параметров политики, при запуске консоли.
Так же можно задать значение области применения Process при запуске консоли PowerShell c помощью параметра executionpolicy. Пример:
1 2 |
powershell.exe -executionpolicy Unrestricted Get-ExecutionPolicy -list |
Результат выполнения:
Scope | ExecutionPolicy |
#8212;#8212; | ————— |
MachinePolicy | Unrestricted |
UserPolicy | Undefined |
Process | RemoteSigned |
CurrentUser | AllSigned |
LocalMachine | Restricted |
Изменение параметров политики запуска скриптов, с помощью групповых политик.
В груповой политике, параметр контролирующая запуск скриптов находиться по пути:
для MachinePolicy:
Computer Configuration/Policies/Administrative Templates/Windows Components/Windows PowerShell
или
Конфигурация компьютера/Административные шаблоны/Компоненты Windows/Windows PowerShell
для UserPolicy:
User Configuration/Policies/Administrative Templates/Windows Components/Windows PowerShell
или
Конфигурация пользователя/Административные шаблоны/Компоненты Windows/Windows PowerShell
Параметр Execution Policy может принимать 3 значения:
Значение параметра Execution Policy в групповой политики | Значение параметра отображающееся в Get-Executionpolicy |
---|---|
Разрешить все скрипты. (Allow all scripts) |
Unrestricted |
Разрешить локальные скрипты и удаленные подписанные скрипты. (Allow local scripts and remote signed scripts) |
RemoteSigned |
Разрешить только подписанные скрипты. (Allow all scripts) |
AllSigned |
Ура мне помогла ваша статья. Спасибо!