По-умолчанию настройки Windows запрещают запуск скриптов PowerShell. Это необходимо для предотвращения запуска вредоносного кода на PowerShell. Настройки политик запуска PowerShell скриптов определяются в Execution Policy. В этой статье мы рассмотрим доступные политики запуска PS скриптов, как изменить Execution Policy и настроить политики использования PowerShell скриптов на компьютерах в домене.
Содержание:
- Выполнение PowerShell скриптов запрещено для данной системы
- Как разрешить запуск скриптов PowerShell с помощью Execution Policy?
- Настройка PowerShell Execution Policy с помощью групповых политик
- Способы обхода политики PowerShell Execution
Выполнение PowerShell скриптов запрещено для данной системы
При попытке выполнить PowerShell скрипт (файл с расширением PS1) на чистой Windows 10, появляется ошибка:
File C:\ps\.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170. + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
Не удается загрузить файл.ps1, так как выполнение скриптов запрещено для данной системы.
Текущее значение политики выполнения скриптов PowerShell на компьютере можно получить командой:
Get-ExecutionPolicy
Доступны следующие значения PowerShell Execution Policy:
- Restricted – запрещен запуск скриптов PowerShell, можно выполнять только интерактивные команды в консоли;
- AllSigned – разрешено выполнять только подписанные PS скрипты с цифровой подписью от доверенного издателя (можно подписать скрипт самоподписанным сертификатом и добавить его в доверенные). При запуске недоверенных скриптов появляется предупреждение:
Do you want to run software from this untrusted publisher? File .ps1 is published by CN=test1 and is not trusted on your system. Only run scripts from trusted publishers
- RemoteSigned – можно запускать локальные PowerShell скрипты без ограничения. Можно запускать удаленные PS файлы с цифровой подписью (нельзя запустить PS1 файлы, скачанные из Интернета, запущенные из сетевой папки по UNC пути и т.д.);
- Unrestricted – разрешен запуск всех PowerShell скриптов;
При запуске сторонних PowerShell скриптов может появляется предупреждение с подтверждением запуска, см. ниже.
- Bypass – разрешён запуск любых PS файлов (предупреждения не выводятся) – эта политика обычно используется для автоматического запуска PS скриптов без вывода каких-либо уведомлений (например при запуске через GPO, SCCM, планировщик и т.д.) и не рекомендуется для постоянного использования;
- Default – сброс настроек выполнения скриптов на стандартную;
В Windows 10 значение политики выполнения PowerShell по-умолчанию Restricted, а в Windows Server 2016 — RemoteSigned.
- Undefined – не задано. Применяется политика Restricted для десктопных ОС и RemoteSigned для серверных.
Как разрешить запуск скриптов PowerShell с помощью Execution Policy?
Чтобы изменить текущее значение политики запуска PowerShell скриптов, используется командлет Set-ExecutionPolicy.
Например, разрешим запуск локальных скриптов:
Set-ExecutionPolicy RemoteSigned
Подтвердите изменение политики запуска PS1 скриптов, нажав Y или A.
Чтобы запрос не появлялся, можно использовать параметр Force.
Set-ExecutionPolicy RemoteSigned –Force
Если вы установили значение политики PowerShell Execution Policy в Unrestricted, то при запуске удаленных скриптов из сетевых каталогов по UNC пути, скачанных из интернета файлов, все равно будет появляться предупреждение:
Security warning 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. Do you want to run? [D] Do not run [R] Run once [S] Suspend [?] Help (default is "D")
Как PowerShell различает локальные и удаленные скрипты? Все дело в идентификаторе зоны ZoneId, которую выставляет браузер в альтернативном потоке при загрузке файла (см. статью “Как Windows определяет, что файл скачан из Интернета?”). Вы можете разблокировать такой файл, поставив галку “Разблокирвать” в его свойствах или очиститься метку зоны с помощью комадлета Unblock-File.
Также следует различать различные области действия политик выполнения скриптов PowerShell (scopes):
- MachinePolicy – действует для всех пользователей компьютера, настраивается через GPO;
- UserPolicy – действует на пользователей компьютера, также настраивается через GPO;
- Process — настройки ExecutionPolicy действует только для текущего сеанса PowerShell.exe (сбрасываются при закрытии процесса);
- CurrentUser – политика ExecutionPolicy применяется только к текущему пользователю (параметр из ветки реестра HKEY_CURRENT_USER);
- LocalMachine – политика для всех пользователей компьютера (параметр из ветки реестра HKEY_LOCAL_MACHINE);
Область применения политики можно указать с помощью параметр Scope командлета Set-ExecutionPolicy. Например:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
Проверим текущие настройки ExecutionPolicy для всех областей:
Get-ExecutionPolicy -List
Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Bypass CurrentUser Undefined LocalMachine RemoteSigned
Значение политики выполнения, которые вы задаете с помощью командлета 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).
Аналогичные настройки для области CurrentUser находятся в разделе реестра пользователя HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.
Отметим, что чаще всего в корпоративной среде используется ExecutionPolicy со значением AllSigned на уровне LocalMachine. Это обеспечивает максимальный баланс между безопасностью и удобством. Для личного пользования на компьютере можно использовать RemoteSigned. Ну а Bypass политику лучше использовать только для запуска отдельных задач (например для запуска скриптов через GPO или заданий планировщика).
Настройка PowerShell Execution Policy с помощью групповых политик
Вы можете настроить политику выполнения PowerShel скриптов на серверах или компьютерах домена с помощью групповых политик.
- С помощью редактора доменных GPO (gpmc.msc) создайте новую GPO (или отредактируйте) существующую и назначьте ее на OU с компьютерами, к которым нужно применить политику запуска PowerShell скриптов;
- В редакторе политики перейдите в раздел Computer Configuration -> Policies -> Administrative Templates -> Windows Components -> Windows PowerShell и найдите политику Turn on Script Execution (Включить выполнение сценариев);
Аналогичная политика есть в пользовательском разделе GPO — User Configuration, но политика компьютера имеет приоритет.
- Для политики доступны три значения:
- Allow only signed scripts (Разрешать только подписанные сценарии) — соответствует политике AllSigned;
- Allow local scripts and remote signed scripts (Разрешать локальные и удаленные подписанные сценарии) — соответствует политике PS RemoteSigned;
- Allow all scripts (Разрешать все сценарии) — политика Unrestricted.
- Выберите необходимое значение политики, сохраните GPO и обновите политики на компьютере.
- Проверьте, что для области MachinePolicy теперь действуют новые настройки выполнения.
После настройки политики выполнения через 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. Due to the override, your shell will retain its current effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List" to view your execution policy settings.
Способы обхода политики PowerShell Execution
Есть несколько трюков, которые могут помочь вам, когда нужно запустить на компьютере PowerShell скрипт, не изменяя настройки политики выполнения. Например, я хочу запустить простой PS1 скрипт, который поверяет, что запущен с правами администратора.
Можно с помощью Get-Content получить содержимое скрипта и перенаправить его в стандартныq поток ввода консоли PS.
Get-Content c:\ps\check_process_elevation.ps1 | PowerShell.exe -noprofile –
Либо можно запустить новый процесс powershell.exe с политикой выполнения Bypass:
powershell.exe -noprofile -executionpolicy bypass -file c:\ps\check_process_elevation.ps1
Contents
- 1 How to Check Your PowerShell Execution Policy
- 2 How to Set PowerShell Execution Policy to RemoteSigned
- 3 How to Set the PowerShell Execution Policy for the Current User via PowerShell
- 4 How to Enable PowerShell Scripts for the Local Machine via Command Line
- 5 How to Set PowerShell Execution Policy for the Current PowerShell Window Only
PowerShell is a powerful tool that many, including myself, don’t use to its full potential. That’s why most of us rely on PowerShell scripts crafted by others, but this can have its own hurdles. Often, you’ll see errors like “PowerShell: running scripts is disabled on this system”. To Enable PowerShell scripts in Windows 10, you must first set the execution policy.
This extra step is to protect you against attackers with malicious scripts, and should only be switched if you trust its source. It’s possible to modify PowerShell script execution via the Group Policy editor and registry, but the easiest and most sensical method is via PowerShell itself. As a result, we’re only going to focus on how to change PowerShell execution policy via the command line today.
PowerShell Execution Policies and Scope values explained
PowerShell has five execution policies; AllSigned, Bypass, RemoteSigned, Restricted, and Unrestricted. It also has three “scope” values which determine how far the PowerShell script execution changes will reach. You can read up on all of them in the tables below:
Execution Policy | Description |
Default | Sets Windows to the default execution policy – Restricted for regular Windows and RemoteSigned for server installs. |
Restricted | The default execution policy for Windows 10. You can’t run any PowerShell scripts and PowerShell is set to interactive mode so that you can only run individual commands. |
RemoteSigned | Default for server installs. You can run downloaded PowerShell scripts, but they must be signed by a trusted publisher. Non-downloaded PowerShell scripts don’t need a signature. |
AllSigned | You can only run PowerShell scripts from a trusted publisher, regardless of where they came from. |
Unrestricted | You can run unsigned scripts, but you’ll get a warning before trying to run ones that come from the internet. |
Bypass | The least strict setting. Run any script with no warnings or prompts. Not recommended for anything other than test machines. |
Scope | Description |
Process | Set the execution policy for the current Windows PowerShell instance. |
CurrentUser | The execution policy is set for the current user only and stored in the HKEY_CURRENT_USER registry key. |
LocalMachine | |
AllSigned | Sets the policy for everyone on the machine via a HKEY_LOCAL_MACHINE key. |
Keep these values in mind as you set your execution policy, as choosing the wrong one could have unintended security consequences.
It’s a good idea to determine what execution policy your PC already has before you change anything. This can also help after you change for verification purposes.
- Open PowerShell
Press “Windows +X” to open the Start context menu and click “Windows PowerShell (Admin)”.
- Enter the PowerShell get execution policy command
In the main PowerShell window, type the following and press enter:
Get-ExecutionPolicy -List
Check the fields for your current user and local machine to determine the current policy.
How to Set PowerShell Execution Policy to RemoteSigned
There’s a fast, UI-friendly way to enable running PowerShell scripts with the RemoteSigned policy via Windows settings.
- Go to Update & Security settings
Press “Windows + I” to open settings and click on “Update & Security”.
- Set the PowerShell execution policy to RemoteSigned via developer options
On the left sidebar, click “For developers”, then scroll down to the “PowerShell” subheading. Tick “change execution policy to allow local PowerShell scripts to run without signing. Require signing for remote scripts.”
How to Set the PowerShell Execution Policy for the Current User via PowerShell
Alternatively, you can enable PowerShell scripts via a different policy for the current user through the command-line.
- Type the following command:
Set-ExecutionPolicy Bypass -Scope CurrentUser -Force
Change “Bypass” for whichever policy type you want to use to enable PowerShell scripts, referring to the table above.
How to Enable PowerShell Scripts for the Local Machine via Command Line
If you want to apply a policy to the machine as a whole that’s possible via a slight change to the command.
- (Optional) set the current user policy to Undefined
When setting your execution policy for the local machine, Windows will use whatever you have chosen for your current user before the global setting. If this happens, you may get an error with the line “Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope”.
If you’d like to your current user to have the same setting as the local machine as a whole, you can switch it to Undefined or change it separately in the next step. Otherwise, you can ignore the error.
- Use the PowerShell set execution policy command to enable PowerShell scripts in Windows
You can set the execution policy for the current Windows user and the Local machine with two separate commands:
Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force
Set-ExecutionPolicy Unrestricted -Scope LocalMachine -ForceYou can set a different policy for each, based on the table above, or set the current user to “Undefined” to have it follow the Local Machine setting.
How to Set PowerShell Execution Policy for the Current PowerShell Window Only
For security, it’s generally recommended that most users set PowerShell execution policy on a per-script basis.
- Enable PowerShell script execution for the current instance
In your PowerShell window, type and enter:
Set-ExecutionPolicy Bypass -Scope Process -Force
Only do this if you trust the script. You can then run the script as you normally would.
По умолчанию выполнение сценариев Windows PowerShell в системе запрещено. По соображениям безопасности все скрипты PowerShell должны быть подписаны цифровой подписью, данный метод называется — политика выполнения.
Если скрипт не соответствует этому условию, то выполнение сценариев PowerShell в системе запрещено. Это связано в первую очередь с тем, что в скрипте может находиться вредоносный код, который может нанести вред операционной системе.
PowerShell имеет несколько режимов выполнения, которые определяют, какой тип кода разрешается выполнять. Существует 5 различных режимов выполнения:
- Ограниченный (Restricted) — значение по умолчанию. Блокируется выполнение любых скриптов и разрешается работа интерактивных команд.
- Все подписанные (All Signed) — разрешено выполнение скриптов, имеющих цифровую подпись.
- Удаленные подписанные (Remote Signed) — локальные скрипты работают без подписи. Все скачанные скрипты должны иметь цифровую подпись.
- Неограниченный (Unrestricted) — разрешено выполнение любых скриптов. При запуске не подписанного скрипта, который был загружен из Интернета, программа может потребовать подтверждение.
- Обходной (Bypass) — ничего не блокируется, никакие предупреждения и запросы не появляются.
По умолчанию для PowerShell используется режим «Ограниченный». В этом режиме, PowerShell работает как интерактивная оболочка. Если вы ранее не настраивали PowerShell, то вместо работы скрипта вы увидите сообщение об ошибке, написанное красным шрифтом как на скриншоте ниже.
Самым безопасным способом решения этой проблемы является – изменение политики выполнения на неограниченную, запуск скрипта, и затем обратный возврат к ограниченной политике.
Для изменения политики выполнения на неограниченную, воспользуемся консолью PowerShell открытую с правами Администратора и выполним следующую команду:
Set-ExecutionPolicy Unrestricted
После запуска команды вам будет предложено подтвердить изменение политики выполнения. Ответим Y (Да).
Теперь можно запустить скрипт. Однако, вы подвергаете систему серьезному риску, так что по окончании работы скрипта, не забудьте вернуть политику выполнения назад в ограниченный режим. Сделать это можно с помощью следующей команды:
Set-ExecutionPolicy Restricted
После запуска команды вам будет предложено подтвердить изменение политики выполнения. Ответим Y (Да)
Далее ниже представлены все команды для изменения политики выполнения.
Блокируется выполнение любых скриптов. Значение по умолчанию.
Set-ExecutionPolicy Restricted
Разрешено выполнение скриптов, имеющих цифровую подпись.
Set-ExecutionPolicy AllSigned
Скрипты, подготовленные на локальном компьютере, можно запускать без ограничений, скрипты, загруженные из Интернета — только при наличии цифровой подписи.
Set-ExecutionPolicy RemoteSigned
Разрешено выполнение любых скриптов. При запуске не подписанного скрипта, который был загружен из Интернета, программа может потребовать подтверждение.
Set-ExecutionPolicy Unrestricted
Ничего не блокируется, никакие предупреждения и запросы не появляются.
Set-ExecutionPolicy Bypass
Для выполнения выше представленных команд без подтверждения изменения, воспользуйтесь параметром -Force, например выполните команду:
Set-ExecutionPolicy Bypass -Force
Теперь при выполнении команд не нужно подтверждать производимые изменения.
Windows PowerShell is a powerful tool that can be used by system administrators and power users to perform administrative tasks, including task automation, managing user accounts and groups, etc. Despite this, PowerShell does not allow you to run scripts by default.
Instead, Microsoft pre-installed PowerShell Integrated Scripting Environment (ISE) in Windows 10 and 11, specifically used to run scripts. But what if you need to run scripts and cmdlets simultaneously in PowerShell?
If you try running a script in PowerShell, you will get see the following error message:
In that case, you need to explicitly allow PowerShell to run scripts. Not only that, but you can also define policies used to execute the script, as well as its scope.
Let us now dig into the details of the execution policy and its scope, and then show you how to enable script execution in Windows PowerShell.
Table of contents
- What is a Script?
- PowerShell Execution Policies and Scopes
- How to Allow Scripts to Run in PowerShell
- Set Script Execution Policy to RemoteSigned
- Through Settings App
- From PowerShell
- How to Change Script Execution Policy for Specific Scope
- Set Script Execution Policy to RemoteSigned
- Set Script Execution Policy to Default
- How to Check PowerShell Execution Policy
- Frequently Asked Questions (FAQs)
- How do we allow PowerShell script only this once?
- How do we revert all script execution policies to default?
- How do we allow PowerShell scripts for current user account only?
What is a Script?
A script is a piece of code, in any programming language, which performs a specific function or a task. A script can be as short as a single expression, or as long as running a complex algorithm.
Scripts can be run directly in a scripting environment – an application designed for coding – or saved in a file, such as a batch file.
In the case of PowerShell scripts, we run the code directly inside the PowerShell window or run a PowerShell file with the extension “.PS1” which contains the script.
Before we discuss how to allow script execution in PowerShell, here is some information we think you ought to know beforehand.
PowerShell Execution Policies and Scopes
As we mentioned earlier, you can optionally choose from the different script execution policies that can be configured for PowerShell. Each of these policies is designed to distinguish between the different types of scripts, and which to allow and which to block. The table below lists the policies you can choose from and what each of them allows.
Execution Policy | Description |
Default | Sets Windows to the default execution policy (Restricted for Windows and RemoteSigned for Servers). |
Restricted | This is the default execution policy for Windows 10 and 11. You can’t run any PowerShell scripts and PowerShell is set to interactive mode so that you can only run individual commands. |
RemoteSignedThis is the default execution policy for Windows Servers. You can run downloaded PowerShell scripts, but they must be signed by a trusted publisher. Self-written (non-downloaded) PowerShell scripts can run without a signature. | |
AllSigned | You can only run PowerShell scripts from a trusted publisher, regardless of where they come from. |
Unrestricted | You can run unsigned scripts, but you’ll get a warning before trying to run ones that come from the internet. |
Bypass | This is the least strict setting. Run any script with no warnings or prompts. Not recommended for anything other than test machines. |
Undefined | No policy has been implemented, which automatically applies to the Restricted policy. |
Furthermore, each of these policies can be defined for a different scope. By scope, we mean where the policy will be applied. The table below lists the different scopes.
Scope | Description |
Process | Set the execution policy for the current Windows PowerShell instance. This will discontinue once PowerShell is closed. |
CurrentUser | The execution policy is set for the current user only and stored in the HKEY_CURRENT_USER registry key. |
LocalMachine | Sets the policy for everyone on the machine via a HKEY_LOCAL_MACHINE key. |
MachinePolicy | Configured using Group Policy for all user accounts on the computer. |
UserPolicy | Configured using Group Policy for the current user account. |
You can use these execution policies and scopes to manage how to execute scripts in Windows PowerShell.
How to Allow Scripts to Run in PowerShell
You can now use a combination of execution policies and scopes to configure how you want to run your scripts. Each of the sections below gives a different example of how to set a policy.
Set Script Execution Policy to RemoteSigned
Users usually prefer setting the script execution policy for Windows PowerShell to RemoteSigned, as it keeps their system safe by preventing unauthorized scripts from running. There are 2 ways in Windows to configure this policy.
Through Settings App
The Settings app in Windows allows you to manage how, whether you wish to allow scripts to run in PowerShell or not. Here’s how to enable it:
- Navigate to the following:
- Windows 11:
Settings app >> Privacy & security >> For developers
- Windows 10:
Settings app >> Update & security >> For developers
- Windows 11:
- Now scroll down to the bottom of the page and check the box next to “Change execution policy to allow local PowerShell scripts to run without signing. Require signing for remote scripts” under the PowerShell section. Then click Apply.
Note that this will only allow scripts from trusted online and local sources in the “CurrentUser” scope.
From PowerShell
If you’d prefer only the Command Line Interface (CLI), here is how to configure the RemoteSigned Execution Policy directly from PowerShell:
- Launch PowerShell with administrative rights.
- Now paste the following command and hit Enter.
Set-ExecutionPolicy RemoteSigned
- Now enter A to confirm.
The command above will set the RemoteSigned execution policy for all users on the computer (scope: LocalMachine). If you want to change the scope of the policy, use the -Scope
parameter followed by the scope name. Here is an example:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
You will then need to confirm this change as well.
How to Change Script Execution Policy for Specific Scope
You can now use this method to configure any one of the above-discussed policies to any scope using the cmdlet below. Simply replace NewPolicy with the Execution Policy and NewScope with the Scope where you want to define it.
Set-ExecutionPolicy NewPolicy -Scope NewScope
Set Script Execution Policy to Default
If you no longer wish to allow scripts to run in PowerShell, you can always change their value to default, which is Undefined or Restricted. However, if a policy has been applied to a specific scope, then you need to update the policy for that particular scope again.
In the command below, we are going to restore the script execution policy for the LocalMachine scope to its default setting:
Set-ExecutionPolicy Undefined -Scope LocalMachine
You can now run the script again with a different scope to change all scopes to their default (restricted) policy.
How to Check PowerShell Execution Policy
To check your current script execution policy in PowerShell, run the following command in PowerShell:
Get-ExecutionPolicy -List
You can then use this information to change your script execution policy using the guide given above.
Frequently Asked Questions (FAQs)
How do we allow PowerShell script only this once?
You can use the Process scope to restrict the execution policy to one-time only. The execution policy will then revert once the PowerShell window is closed. Here is an example code to set the execution policy to RemoteSigned for this instance of PowerShell only:Set-ExecutionPolicy RemoteSigned -Scope Process -Force
How do we revert all script execution policies to default?
If you have defined the execution policies scope-wise, then you must revert them scope-wise as well. However, in case you did not define a scope ( where the policy is automatically configured for LocalMachine), use the following cmdlet to change it back to default:Set-ExecutionPolicy Undefined
How do we allow PowerShell scripts for current user account only?
You can define a script execution policy on your current account only by defining the scope to “CurrentUser.” Here is an example:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
This will prevent all other users from running a script in Windows PowerShell.
При разработке PowerShell особое внимание было уделено безопасности. Одной из мер безопасности является наличие политики выполнения (Execution Policy), которая определяет, могут ли скрипты PowerShell выполняться в системе, и если могут, то какие именно.
Для примера возьмем чистую Windows 10, откроем консоль PowerShell и попробуем выполнить простой скрипт. Попытка завершится ошибкой, поскольку, как видно из сообщения, выполнение скриптов в системе запрещено.
Это сработала политика выполнения, и если мы все же хотим выполнить скрипт, то ее необходимо изменить. Выбрать можно одно из следующих значений:
• Restricted — в системе запрещено выполнение любых скриптов, допускается только выполнение отдельных команд. Это политика по умолчанию для клиентских ОС Windows;
• AllSigned — разрешено выполнение только скриптов, имеющих цифровую подпись от доверенного издателя;
• RemoteSigned — для удаленных скриптов требуется наличие цифровой подписи, локальные скрипты выполняются без ограничений. Удаленными считаются скрипты, полученные из удаленных источников (загруженные из интернета, полученные по электронной почте и т.п.), локальными — скрипты, созданные на локальном компьютере. Это политика по умолчанию для серверных ОС Windows;
• Unrestricted — разрешено выполнение любых скриптов, как локальных так и удаленных. При выполнении удаленного скрипта без цифровой подписи будет выдано предупреждение. Это дефолтная и единственно возможная политика для всех ОС, отличных от Windows;
• Bypass — разрешено выполнение любых скриптов, никакие предупреждения и запросы не выводятся;
• Default — сбрасывает политику на значение по умолчанию. Для серверов это RemoteSigned, для клиентов Restricted;
• Undefined — не определено. В случае, если значение политики не определено, то применяется политика Restricted.
Теоретически все понятно, проверим на практике. Для просмотра параметров политики используется командлет Get-ExecutionPolicy, а для изменения Set-ExecutionPolicy.
Для начала выведем действующую политику выполнения командой:
Get-ExecutionPolicy
Как и ожидалось, текущая политика Restricted. Разрешим выполнение скриптов, установив для политики значение Unrestricted:
Set-ExecutionPolicy Unrestricted -Force
И еще попробуем запустить скрипт. На сей раз он выполнился без ошибок.
Политика Unrestricted разрешает выполнение любых скриптов, но у нее все же есть ограничения. Для проверки я подготовил два скрипта, локальный localscript.ps1 и удаленный remotescript.ps1. Сначала запустим локальный, он выполнится без проблем. А вот при запуске удаленного скрипта PowerShell выдаст предупреждение и потребует подтвердить его запуск. При ручном выполнении это не является большой проблемой, а вот в случае автоматического запуска (напр. из планировщика) скрипт может не отработать.
Теперь изменим политику на Bypass и еще раз запустим удаленный скрипт. На сей раз он просто выполнился, безо всяких сообщений и подтверждений. Bypass удобно использовать в ситуациях, когда скрипт должен гарантированно отработать, причем автоматически, без вмешательства пользователя.
Следующим пунктом нашего меню идет политика 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 — политика действует на всех пользователей данного компьютера. Значение хранится в реестре, в разделе HKEY_LOCAL_MACHINE;
• CurrentUser — политика действует только на текущего пользователя. Хранится в разделе реестра HKEY_CURRENT_USER;
• Process — действие политики распространяется только на текущий сеанс PowerShell. Значение хранится в переменной окружения $PSExecutionPolicyPreference и при закрытии сеанса удаляется;
• Userpolicy — политика действует на всех пользователей данного компьютера. Распространяется с помощью групповых политик. Значение хранится в разделе пользователя, соответственно политика применяется при входе пользователя в систему;
• MachinePolicy — действует на всех пользователей данного компьютера. Распространяется с помощью групповых политик. Значение хранится в разделе компьютера, политика применяется при загрузке системы;
Вывести значение политики для всех областей можно командой:
Get-ExecutionPolicy -List
Получается, что при установке политики без указания области изменяется значение LocalMachine. Если же требуется указать конкретную область действия, то сделать это можно с помощью параметра Scope командлета Set-ExecutionPolicy. Для примера установим для области СurrentUser политику Bypass:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force
Затем проверим значение политики в текущем сеансе и убедимся в том, что оно изменилось на Bypass.
Теперь установим политику Unrestricted для области Process:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted -Force
Еще раз проверим текущую политику, теперь она имеет значение Unrestricted. Т.е. более ″конкретная″ политика всегда имеет больший приоритет.
Для областей UserPolicy и MachinePolicy значение политики задаются через GPO. За настройку отвечает параметр Turn on Script Execution (Включить выполнение сценариев), находящийся в разделе Administrative Templates\Windows Components\Windows PowerShell. Для UserPolicy он находится в конфигурации пользователя (User Configuration), для MachinePolicy — в конфигурации компьютера (Computer Configuration). Политика, применяемая к компьютеру, имеет приоритет перед политикой пользователя.
Для установки политики надо включить параметр и выбрать одно из трех значений:
• Allow only signed scripts (Разрешать только подписанные сценарии) — политика AllSigned;
• Allow local scripts and remote signed scripts (разрешать локальные и удаленные подписанные сценарии) — политика RemoteSigned;
• Allow all scripts (Разрешать все сценарии) — политика Unrestricted.
Политика Bypass считается небезопасной и ее нельзя установить через групповые политики.
Для примера установим для MachinePolicy политику RemoteSigned и проверим результат. Как видите, политика, назначенная через GPO, имеет больший приоритет и переопределяет все остальные политики.
Более того, при использовании GPO становится невозможным переназначить политики вручную. При попытке изменения выдается предупреждение, а текущая политика остается без изменений.
А что будет, если ни для одной области политика не определена, т.е. везде стоит значение Undefined? В этом случае все просто, выполнение всех скриптов запрещается, а текущая политика принимает значение Restricted.
Обход политики
Можно ли как то запустить скрип в обход политики выполнения, не изменяя ее значение? В принципе можно, есть несколько способов.
К примеру для того, чтобы выполнить скрипт, достаточно открыть его в проводнике, кликнуть правой клавишей мыши и выбрать пункт Выполнить с помощью PowewrShell (Run with PowerShell). Это запускает оболочку PowerShell c политикой Bypass. При этом политика применяется только для выполнения конкретного скрипта, значение политики в реестре не изменяется.
Этот способ называется ″Run with PowerShell″ и у него есть некоторые ограничения. Скрипты, запущенные таким образом, не могут взаимодействовать с пользователем (выводить сообщения на экран, требовать ввода данных и т.п.). Скрипт просто запускается, выполняется и немедленно закрывается.
Собственно говоря, предыдущий способ использует запуск PowerShell с указанием требуемой политики. Сделать это можно из командной строки, например для запуска скрипта можно попробовать такую команду:
powershell.exe -file .\script.ps1 -Executionpolicy Bypass
Теоретически эта команда должна выполнить скрипт, не смотря на текущую политику. Так написано в официальной документации Microsoft. На практике же этот способ работает не всегда, например на одном из проверенных мной компьютеров я получил ошибку. При этом из проводника скрипт успешно выполнился.
Еще один вариант — это попробовать изменить политику выполнения для области Process. Эта операция не вносит изменений в реестр и не требует прав администратора. Но в том случае, если для назначения политики выполнения используются групповые политики, этот способ не сработает.
Ну и наконец можно просто считать содержимое скрипта и выполнить его в виде команды. Например так:
$script = Get-Content ./script.ps1
Invoke-Expression -Command ″$script″