Разрешить выполнение скриптов powershell windows 10

Обновлено: 07.07.2024

Когда я пытаюсь выполнить свой сценарий PowerShell, я получаю эту ошибку:

Файл C: \ Common \ Scripts \ hello.ps1 не может быть загружен, потому что выполнение сценариев отключено в этой системе. Пожалуйста, смотрите "get-help about_signing" для более подробной информации.
В строке: 1 символ: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Запустите Windows PowerShell с параметром «Запуск от имени администратора». Только члены группы «Администраторы» на компьютере могут изменять политику выполнения.

Включите запуск неподписанных скриптов, введя:

Это позволит запускать неподписанные сценарии, которые вы пишете на локальном компьютере, и подписанные сценарии из Интернета.

Смотрите также Запуск сценариев в библиотеке Microsoft TechNet.

+1 для удаленных подписчиков вместо неограниченных. Вы можете запускать свои локальные сценарии, не подвергая себя опасности отовсюду. Спасибо - этот пост помог мне. Однако у меня все еще были проблемы, потому что я не запускал PowerShell "как администратор" под win8 Изменит ли это политику навсегда или мне придется делать это каждый раз при перезагрузке компьютера? Есть ли способ включить выполнение конкретного сценария powershell? Так что, возможно, я просто хочу разрешить hello.ps1 из OP или Microsoft.PowerShell_profile.ps1 на ящик пользователя? (Я думаю, что это, возможно, подпадает под общепризнанный OP-вопрос (ха, который я теперь вижу, тоже ваш!). Если вы чувствуете, что это новый вопрос, я могу его задать.)

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

Вы должны ввести следующее, чтобы перейти в неограниченный режим:

Надеюсь это поможет

-1. это слишком открыто, чтобы просто выполнить. RemoteSigned лучше. Требующая подпись имеет смысл, если вы ожидаете, что пользователь будет копировать и вставлять вредоносные скрипты из Интернета. Если вы предполагаете, что пользователь не глуп, то «удаленное подписывание» не добавляет безопасности и усложняет жизнь. @Guss: При тестировании этого я обнаружил, что RemoteSigned больше не требует, чтобы локально сгенерированные файлы .ps1 были подписаны, и он рассматривает управление исходным кодом git как локальный источник. @ Джошуа - да, моя точка зрения точно. Если RemoteSigned не блокирует копирование и вставку, не блокирует git или другие методы загрузки, отличные от IE, тогда для чего это нужно? Скажи это со мной: «абсолютно ничего!». Я думаю, что требовать подписи сценариев с сертификатом подписи кода за 100 долларов - это бесполезно, глупо и сводит на нет все то хорошее, что может сделать приличный язык сценариев для Windows. При этом, если путь вперед состоит в том, чтобы заставить пользователей понять, что они делают, чтобы использовать сценарии PS, то мы можем быть слишком заняты . Нееее, это никогда не сработает ;-) @Guss: У меня уже есть хороший язык сценариев для Windows. Cygwin отлично работает на Windows 10; буквально намного лучше, чем это было в любой предыдущей версии Windows. Я только когда-либо хочу запустить записки, которые кто-то уже написал.

На моей машине, которую я использую для разработки сценариев, я буду использовать -unresricted, как указано выше. Однако при развертывании моих сценариев на компьютере конечного пользователя я просто вызову powershell с ключом -executionpolicy:

Этот трюк позволил мне запустить скрипт powershell из Git Bash (MINGW32 bash)

Мы можем получить статус текущего ExecutionPolicy с помощью команды ниже:

По умолчанию это ограничено . Чтобы разрешить выполнение сценариев PowerShell, нам нужно установить для ExecutionPolicy значение Bypass или Unrestricted .

Мы можем установить политику для текущего пользователя как Bypass или Unrestricted с помощью любой из следующих команд PowerShell:

Неограниченная политика загружает все файлы конфигурации и запускает все сценарии. Если вы запускаете неподписанный скрипт, который был загружен из Интернета, вам будет предложено разрешение перед его запуском.

Принимая во внимание, что в политике обхода ничего не блокируется, и нет никаких предупреждений или подсказок во время выполнения скрипта. Обход ExecutionPolicy более расслаблен, чем неограничен.

В зависимости от версии и конфигурации Windows вы можете получить следующее предупреждение, даже в Unrestricted режиме:

Решение состоит в том, чтобы использовать политику обхода, активированную с помощью следующей команды:

Обход: ничего не заблокировано и нет предупреждений или подсказок.

Это явно небезопасно, пожалуйста, поймите риски.

это был единственный способ заставить мой скрипт работать в среде WINE с powershell 2.0. Спасибо. @ Wyatt8740: Потому что вино представляет все диски как сетевые диски. @ Джошуа, я понятия не имел. Можете ли вы дать мне источник для этого заявления? Я попробовал случайный Google, но я, очевидно, выгляжу неправильно. @ Wyatt8740: Источник: стандартное диалоговое окно Wine OpenFileName. Посмотрите значки дисков. @ Joshua Я имел в виду исходный код; иконки могут быть произвольными. Но я бы не подумал об этом; Я думаю, это хорошее место для начала (редактировать: не похоже, что они здесь .)

Рег ключ с:
Windows Registry Editor версии 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword: 00000001 "ExecutionPolicy" = "Обход"

действительно работает тоже.

Принятый ответ правильный, но изменение политики доступно только для текущего запущенного экземпляра Powershell, то есть после закрытия экземпляра Powershell. Политика будет сброшена. Если пользователь повторно открывает другой экземпляр Powershell, будет применена политика по умолчанию, которая Restricted

Для меня мне нужно использовать консоль VisualStudio Code и g ++ из cygwin для сборки вещей. Консоль использует Powershell, с политикой по умолчанию ничего нельзя сделать. Одним из решений является изменение политики каждый раз, когда консоль запускается в консоли кода VisualStudio, возможно, это скрипт изменения политики.

Я ленив, поэтому другое решение - когда я запускаю Powershell в режиме администратора, аналогично тому, что делает принятый ответ. но с дополнительным параметром, который изменяет значения в таблице реестра. Как только это было сделано. Другие экземпляры Powershell будут использовать RemoteSigned политику по умолчанию.

set-executionpolicy remotesigned -Scope CurrentUser

Установка политики (правильно) - лучший выбор, но в моих управляемых системах у меня нет возможности изменить эту политику.

Для меня самый простой обходной путь к изменению политики состоит в том, чтобы открыть сценарий в «PowerShell ISE» , выделить код (или часть кода) для выполнения и затем нажать кнопку «Выполнить выбор» (или использовать клавишу F8). ярлык).

Это не лучшее решение и мало что дает для автоматизации задач, но оно позволяет мне использовать и использовать PowerShell, хотя и не работает в стороне от моего отдела информационных технологий.

Причина, по которой работает ключ reg, заключается в том, что он делает именно то, что делают команды PS. Команды записывают изменения в ключи reg. Команды намного быстрее и проще, чем создание ключа reg или копание в реестре.

date

03.06.2020

directory

PowerShell, Windows 10, Windows Server 2016

comments

Комментариев пока нет

По-умолчанию настройки Windows запрещают запуск скриптов PowerShell. Это необходимо для предотвращения запуска вредоносного кода на PowerShell. Настройки политик запуска PowerShell скриптов определяются в Execution Policy. В этой статье мы рассмотрим доступные политики запуска PS скриптов, как изменить Execution Policy и настроить политики использования PowerShell скриптов на компьютерах в домене.

Выполнение PowerShell скриптов запрещено для данной системы

При попытке выполнить PowerShell скрипт (файл с расширением PS1) на чистой Windows 10, появляется ошибка:

Не удается загрузить файл ps1, так как выполнение скриптов запрещено для данной системы.

Текущее значение политики выполнения скриптов PowerShell на компьютере можно получить командой:

Get-ExecutionPolicy

Доступны следующие значения PowerShell Execution Policy:

При запуске сторонних PowerShell скриптов может появляется предупреждение с подтверждением запуска, см. ниже.

Как разрешить запуск скриптов PowerShell с помощью Execution Policy?

Чтобы изменить текущее значение политики запуска PowerShell скриптов, используется командлет Set-ExecutionPolicy.

Например, разрешим запуск локальных скриптов:

Подтвердите изменение политики запуска PS1 скриптов, нажав Y или A.

Set-ExecutionPolicy RemoteSigned разрешить запуск локальных powershell скриптов

Чтобы запрос не появлялся, можно использовать параметр Force.

Set-ExecutionPolicy RemoteSigned –Force

Если вы установили значение политики PowerShell Execution Policy в Unrestricted, то при запуске удаленных скриптов из сетевых каталогов по UNC пути, скачанных из интернета файлов, все равно будет появляться предупреждение:

Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your computer. If you trust this script, use the Unblock-File cmdlet to allow the script to run without this warning message

Как PowerShell различает локальные и удаленные скрипты? Все дело в идентификаторе зоны ZoneId, которую выставляет браузер в альтернативном потоке при загрузке файла (см. статью “Как Windows определяет, что файл скачан из Интернета?”). Вы можете разблокировать такой файл, поставив галку “Разблокирвать” в его свойствах или очиститься метку зоны с помощью комадлета Unblock-File.

Также следует различать различные области действия политик выполнения скриптов PowerShell (scopes):

Область применения политики можно указать с помощью параметр Scope командлета Set-ExecutionPolicy. Например:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force

Проверим текущие настройки ExecutionPolicy для всех областей:

Get-ExecutionPolicy scopes области действия

Значение политики выполнения, которые вы задаете с помощью командлета Set-ExecutionPolicy для областей CurrentUser и LocalMachine, хранятся в реестре. Например, выполните командлет:

Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Restricted –Force

Откройте ветку реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell и проверьте значение REG_SZ параметра ExecutionPolicy. Оно изменилось на Restricted (допустимые значения параметра Restricted, AllSigned, RemoteSigned, Bypass, Unrestricted и Undefined).

ExecutionPolicy в реестре

Аналогичные настройки для области CurrentUser находятся в разделе реестра пользователя HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.

Т.е. вы можете распространить нужные настройки политики исполнения скриптов через реестр с помощью Group Policy Preferences.

Отметим, что чаще всего в корпоративной среде используется ExecutionPolicy со значением AllSigned на уровне LocalMachine. Это обеспечивает максимальный баланс между безопасностью и удобством. Для личного пользования на компьютере можно использовать RemoteSigned. Ну а Bypass политику лучше использовать только для запуска отдельных задач (например для запуска скриптов через GPO или заданий планировщика).

Настройка PowerShell Execution Policy с помощью групповых политик

Вы можете настроить политику выполнения PowerShel скриптов на серверах или компьютерах домена с помощью групповых политик.

  1. С помощью редактора доменных GPO (gpmc.msc) создайте новую GPO (или отредактируйте) существующую и назначьте ее на OU с компьютерами, к которым нужно применить политику запуска PowerShell скриптов;
  2. В редакторе политики перейдите в раздел Computer Configuration -> Policies -> Administrative Templates -> Windows Components -> Windows PowerShell и найдите политику Turn on Script Execution (Включить выполнение сценариев);

групповая политика Turn on Script Execution

  • Allow only signed scripts (Разрешать только подписанные сценарии) — соответствует политике AllSigned;
  • Allow local scripts and remote signed scripts (Разрешать локальные и удаленные подписанные сценарии) — соответствует политике PS RemoteSigned;
  • Allow all scripts (Разрешать все сценарии) — политика Unrestricted.

После настройки политики выполнения через GPO вы не сможете изменить настройки политики выполнения скриптов вручную. При попытке изменить настройки Execution Policy на компьютере, на который применяется такая GPO, появится ошибка:

Set-ExecutionPolicy : Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope

Аналогичным образом можно настроить Execution Policy на отдельном компьютере с помощью локального редактора GPO – gpedit.msc.

Способы обхода политики PowerShell Execution

Есть несколько трюков, которые могут помочь вам, когда нужно запустить на компьютере PowerShell скрипт, не изменяя настройки политики выполнения. Например, я хочу запустить простой PS1 скрипт, который поверяет, что запущен с правами администратора.

Описывает политики выполнения PowerShell и способы управления ими.

Подробное описание

Политика выполнения PowerShell — это функция безопасности, которая управляет условиями, при которых PowerShell загружает файлы конфигурации и запускает сценарии. Эта функция помогает предотвратить выполнение вредоносных сценариев.

на Windows компьютере можно задать политику выполнения для локального компьютера, для текущего пользователя или для конкретного сеанса. Можно также использовать параметр групповой политики, чтобы задать политики выполнения для компьютеров и пользователей.

Политики выполнения для локального компьютера и текущего пользователя хранятся в реестре. В профиле PowerShell не нужно задавать политики выполнения. Политика выполнения для определенного сеанса сохраняется только в памяти и теряется при закрытии сеанса.

Политика выполнения не является системой безопасности, которая ограничивают действия пользователя. Например, пользователи могут без труда обходить политику, вводя содержимое скрипта в командной строке, если не удается выполнить сценарий. Вместо этого политика выполнения помогает пользователям задавать основные правила и запрещает их непреднамеренное нарушение.

Политики выполнения PowerShell

принудительное применение этих политик выполняется только на платформах Windows. Ниже перечислены политики выполнения PowerShell.

AllSigned

  • Сценарии могут выполняться.
  • требует, чтобы все скрипты и файлы конфигурации, включая скрипты, подготовленные на локальном компьютере, были подписаны доверенным издателем.
  • Выводит приглашение перед запуском скриптов от издателей, которые еще не классифицированы как доверенные или ненадежные.
  • Риски, в которых выполняются подписанные, но вредоносные сценарии.

Bypass

  • ничего не блокируется, и никакие предупреждения и запросы не появляются.
  • Эта политика выполнения предназначена для конфигураций, в которых сценарий PowerShell встроен в более крупное приложение, или для конфигураций, в которых PowerShell является основой для программы, имеющей собственную модель безопасности.

Default

  • Задает политику выполнения по умолчанию.
  • Restricted для Windows клиентов.
  • RemoteSigned для серверов Windows.

RemoteSigned

Restricted

  • политика выполнения по умолчанию для клиентских компьютеров Windows.
  • Разрешает отдельные команды, но не разрешает сценарии.
  • Предотвращает запуск всех файлов скриптов, включая файлы форматирования и конфигурации ( .ps1xml ), файлы скриптов модуля ( .psm1 ) и профили PowerShell ( .ps1 ).

Undefined

  • В текущей области не задана политика выполнения.
  • если политика выполнения во всех областях имеет значение Undefined , то действующая политика выполнения предназначена Restricted для Windows клиентов и RemoteSigned для Windows Server.

Unrestricted

  • политика выполнения по умолчанию для компьютеров, не являющихся Windows, и не может быть изменена.
  • Неподписанные скрипты могут выполняться. Существует риск запуска вредоносных сценариев.
  • Предупреждает пользователя перед запуском скриптов и файлов конфигурации, которые не входят в зону местной интрасети.

В системах, которые не отличают пути UNC от Интернет-путей, сценарии, определяемые путем UNC, могут быть запрещены для выполнения с политикой выполнения RemoteSigned .

Область политики выполнения

Можно задать политику выполнения, действующую только в определенной области.

Допустимые значения для Scope : MachinePolicy , UserPolicy, Process , CurrentUser и LocalMachine. Хранилище LocalMachine используется по умолчанию при задании политики выполнения.

Scope Значения перечислены в порядке приоритета. Политика, которая имеет приоритет, вступает в силу в текущем сеансе, даже если более ограничивающая политика была установлена на более низком уровне приоритета.

Дополнительные сведения см. в разделе Set-ExecutionPolicy.

MachinePolicy

Задается групповая политика для всех пользователей компьютера.

UserPolicy

Задается групповая политика для текущего пользователя компьютера.

Process

Process Область влияет только на текущий сеанс PowerShell. Политика выполнения сохраняется в переменной среды $env:PSExecutionPolicyPreference , а не в реестре. При закрытии сеанса PowerShell переменная и значение удаляются.

CurrentUser

политика выполнения распространяется только на текущего пользователя. Он хранится в подразделе реестра HKEY_CURRENT_USER .

LocalMachine

Политика выполнения влияет на всех пользователей на текущем компьютере. Он хранится в подразделе реестра HKEY_LOCAL_MACHINE .

Управление политикой выполнения с помощью PowerShell

Чтобы получить действующую политику выполнения для текущего сеанса PowerShell, используйте Get-ExecutionPolicy командлет.

Следующая команда получает действующую политику выполнения:

Чтобы получить все политики выполнения, влияющие на текущий сеанс, и отобразить их в порядке очередности:

Результат выглядит примерно так, как показано в следующем примере:

В этом случае действующая политика выполнения — RemoteSigned , так как политика выполнения для текущего пользователя имеет приоритет над политикой выполнения, заданной для локального компьютера.

Чтобы получить политику выполнения, заданную для определенной области, используйте Scope параметр Get-ExecutionPolicy .

Например, следующая команда возвращает политику выполнения для области CurrentUser :

Изменение политики выполнения

чтобы изменить политику выполнения PowerShell на Windows компьютере, используйте Set-ExecutionPolicy командлет. Изменение вступает в силу немедленно. Вам не нужно перезапускать PowerShell.

Если задать политику выполнения для областей LocalMachine или CurrentUser, это изменение будет сохранено в реестре и останется эффективным, пока вы не измените его.

Если задать политику выполнения для Process области, она не будет сохранена в реестре. Политика выполнения сохраняется до закрытия текущего процесса и любых дочерних процессов.

в Windows Vista и более поздних версиях Windows для выполнения команд, изменяющих политику выполнения для локального компьютера, область LocalMachine , запустите PowerShell с параметром запуск от имени администратора .

Чтобы изменить политику выполнения, выполните следующие действия.

Чтобы задать политику выполнения в определенной области, выполните следующие действия.

Команда для изменения политики выполнения может быть выполнена, но не будет изменена действующая политика выполнения.

Например, команда, которая задает политику выполнения для локального компьютера, может быть выполнена, но переопределена политикой выполнения для текущего пользователя.

Удаление политики выполнения

Чтобы удалить политику выполнения для определенной области, задайте для политики выполнения значение Undefined .

Например, чтобы удалить политику выполнения для всех пользователей локального компьютера, выполните следующие действия.

Чтобы удалить политику выполнения для Scope :

если в какой-либо области не задана политика выполнения, действующая политика выполнения — это значение Restricted по умолчанию для клиентов Windows.

Задание другой политики для одного сеанса

Параметр ExecutionPolicy параметра можно использовать pwsh.exe для установки политики выполнения для нового сеанса PowerShell. Политика влияет только на текущий сеанс и дочерние сеансы.

Чтобы задать политику выполнения для нового сеанса, запустите PowerShell из командной строки, например cmd.exe или из PowerShell, а затем используйте параметр ExecutionPolicy из pwsh.exe для установки политики выполнения.

Заданная политика выполнения не хранится в реестре. Вместо этого он хранится в $env:PSExecutionPolicyPreference переменной среды. Переменная удаляется при закрытии сеанса, в котором задана политика. Вы не можете изменить политику, изменив значение переменной.

Во время сеанса политика выполнения, заданная для сеанса, имеет приоритет над политикой выполнения, заданной в реестре для локального компьютера или текущего пользователя. Однако он не имеет приоритета над политикой выполнения, заданной с помощью групповая политика.

Использование групповая политика для управления политикой выполнения

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

Включить параметры политики выполнения сценария следующим образом:

Если отключить выполнение скрипта, скрипты не будут выполняться. Это эквивалентно Restricted политике выполнения.

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

Если параметр включить выполнение скрипта не настроен, он не будет действовать. Политика выполнения, заданная в PowerShell, вступает в силу.

Файлы Повершеллексекутионполици. adm и Повершеллексекутионполици. ADMX добавляют политику выполнения сценария включения в узлы Конфигурация компьютера и Конфигурация пользователя в групповая политика Editor по следующим путям.

для Windows XP и Windows Server 2003:

Administrative Templates\Windows Components\Windows PowerShell

для Windows Vista и более поздних версий Windows:

Administrative Templates\Classic Administrative Templates\Windows Components\Windows PowerShell

Политики, заданные в узле Конфигурация компьютера, имеют приоритет над политиками, заданными в узле Конфигурация пользователя.

Дополнительные сведения см. на веб-сайте about_Group_Policy_Settings.

Приоритет политики выполнения

При определении действующей политики выполнения для сеанса PowerShell оценивает политики выполнения в следующем порядке очередности.

Управление подписанными и неподписанными скриптами

Вы можете подписать сценарий или выбрать Запуск неподписанного скрипта без изменения политики выполнения.

Начиная с версии PowerShell 3,0 можно использовать параметр Stream Get-Item командлета для обнаружения заблокированных файлов, так как они были загружены из Интернета. Используйте Unblock-File командлет, чтобы разблокировать скрипты, чтобы их можно было запускать в PowerShell.

Дополнительные сведения см. в разделе about_Signing, Get-Itemи Unblock-File.

Другие методы загрузки файлов могут не помечать файлы как поступающие из зоны Интернета. Некоторые примеры:

  • curl.exe
  • Invoke-RestMethod
  • Invoke-WebRequest

политика выполнения в Windows server Core и windows Nano server

когда PowerShell 6 запускается на Windows server Core или Windows Nano server при определенных условиях, политики выполнения могут завершиться со следующей ошибкой:

PowerShell использует интерфейсы api в оболочке Windows Desktop Shell ( explorer.exe ) для проверки зоны файла скрипта. оболочка Windows недоступна в Windows server Core и Windows Nano server.

эту ошибку также можно получить на любой Windows системе, если оболочка Windows Desktop Shell недоступна или не отвечает. например, во время входа сценарий входа PowerShell может начать выполнение до того, как Windows рабочий стол будет готов, что приведет к сбою.

При использовании политики выполнения обхода или AllSigned не требуется проверка зоны, которая позволяет избежать проблемы.

При разработке PowerShell особое внимание было уделено безопасности. Одной из мер безопасности является наличие политики выполнения (Execution Policy), которая определяет, могут ли скрипты PowerShell выполняться в системе, и если могут, то какие именно.

Это сработала политика выполнения, и если мы все же хотим выполнить скрипт, то ее необходимо изменить. Выбрать можно одно из следующих значений:

Теоретически все понятно, проверим на практике. Для просмотра параметров политики используется командлет Get-ExecutionPolicy, а для изменения Set-ExecutionPolicy.

Для начала выведем действующую политику выполнения командой:

Как и ожидалось, текущая политика Restricted. Разрешим выполнение скриптов, установив для политики значение Unrestricted:

Set-ExecutionPolicy Unrestricted -Force

И еще попробуем запустить скрипт. На сей раз он выполнился без ошибок.

изменение политики выполнение на Unrestricted

Политика Unrestricted разрешает выполнение любых скриптов, но у нее все же есть ограничения. Для проверки я подготовил два скрипта, локальный localscript.ps1 и удаленный remotescript.ps1. Сначала запустим локальный, он выполнится без проблем. А вот при запуске удаленного скрипта PowerShell выдаст предупреждение и потребует подтвердить его запуск. При ручном выполнении это не является большой проблемой, а вот в случае автоматического запуска (напр. из планировщика) скрипт может не отработать.

выполнение локального и удаленного скрипта

установка политики выполнения Bypass

Следующим пунктом нашего меню идет политика RemoteSigned. Она является наиболее сбалансированной как с точки зрения безопасности, так и удобства использования, поэтому на серверах включена по умолчанию. Установим для политики значение RemoteSigned и проверим ее действие. Локальный скрипт снова выполняется без проблем, а удаленный выдает ошибку, поскольку у него нет подписи.

установка политики выполнения RemoteSigned

У вас может возникнуть вопрос, как именно PowerShell различает локальные и удаленные скрипты. Тут все просто. При загрузке файла приложение (напр. браузер) добавляет файл идентификатор зоны (ZoneId), который и определяет, откуда был взят файл. Идентификатор хранится в альтернативном потоке и имеет значение от 0 до 4:

• Локальный компьютер (0)
• Местная сеть (1)
• Надежные сайты (2)
• Интернет (3)
• Опасные сайты (4)

Если файл имеет ZoneId 3 или 4, то PowerShell считает его удаленным. А если на компьютере включена конфигурация усиленной безопасности Internet Explorer, то файлы, взятые из локальной сети, тоже могут считаться удаленными.

Как выполнить удаленный скрипт? Во первых его можно разблокировать (превратить в локальный), для этого есть специальный командлет Unblock-File. Хотя если просто открыть скрипт на локальном компьютере и внести в него изменения, то он тоже станет локальным.

выполнение подписанного скрипта

Переходим к политике AllSigned. Это наиболее жесткая политика, требующая подписывания всех без исключения скриптов, как удаленных так и локальных. И даже с подписанными скриптами она работает не так, как RemoteSigned. Для примера сменим политику на AllSigned и снова запустим подписанный скрипт. В этот раз для его выполнения потребуется подтверждение, т.к. PowerShell посчитал подпись недоверенной.

запрос на выполнение подписанного скрипта

Области применения

Политика выполнения имеет свою область действия (scope). Всего есть 5 областей:

Вывести значение политики для всех областей можно командой:

Области действия политики выполнения

Получается, что при установке политики без указания области изменяется значение LocalMachine. Если же требуется указать конкретную область действия, то сделать это можно с помощью параметра Scope командлета Set-ExecutionPolicy. Для примера установим для области СurrentUser политику Bypass:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force

Затем проверим значение политики в текущем сеансе и убедимся в том, что оно изменилось на Bypass.

изменяем политику выполнения для текущего пользователя

Теперь установим политику Unrestricted для области Process:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted -Force

Еще раз проверим текущую политику, теперь она имеет значение Unrestricted. Т.е. более ″конкретная″ политика всегда имеет больший приоритет.

изменяем политику выполнения для процесса

групповые политики PowerShell

Для установки политики надо включить параметр и выбрать одно из трех значений:

Политика Bypass считается небезопасной и ее нельзя установить через групповые политики.

Установка политики выполнения через GPO

Для примера установим для MachinePolicy политику RemoteSigned и проверим результат. Как видите, политика, назначенная через GPO, имеет больший приоритет и переопределяет все остальные политики.

список политик выполнения по областям

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

попытка изменения политики выполнения

А что будет, если ни для одной области политика не определена, т.е. везде стоит значение Undefined? В этом случае все просто, выполнение всех скриптов запрещается, а текущая политика принимает значение Restricted.

политика Undefined

Обход политики

Можно ли как то запустить скрип в обход политики выполнения, не изменяя ее значение? В принципе можно, есть несколько способов.

К примеру для того, чтобы выполнить скрипт, достаточно открыть его в проводнике, кликнуть правой клавишей мыши и выбрать пункт Выполнить с помощью PowewrShell (Run with PowerShell). Это запускает оболочку PowerShell c политикой Bypass. При этом политика применяется только для выполнения конкретного скрипта, значение политики в реестре не изменяется.

выполнение скрипта PowerShell из проводника

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

powershell.exe -file .\script.ps1 -Executionpolicy Bypass

Теоретически эта команда должна выполнить скрипт, не смотря на текущую политику. Так написано в официальной документации Microsoft. На практике же этот способ работает не всегда, например на одном из проверенных мной компьютеров я получил ошибку. При этом из проводника скрипт успешно выполнился.

ошибка при использовании политики Bypass

Ну и наконец можно просто считать содержимое скрипта и выполнить его в виде команды. Например так:

Читайте также: