PowerShell 执行策略是一个安全限制,用于管理和控制本地及网络上的 PS 脚本运行。本文简述可用的若干执行策略及其设置方法。

执行策略的类别

PS 有多种执行策略,对本地及网络来源的脚本执行做出约束。这些策略分别是:

  1. Restricted
  2. RemoteSigned
  3. AllSigned
  4. Default
  5. Undefined
  6. Unrestricted

Restricted

Restricted(受限)策略是 Windows 客户端操作系统的默认策略。

该策略下,仅允许执行单一的指令,但会阻止所有的脚本执行。被阻止的脚本包含各类配置文件、模块脚本文件以及单纯的脚本文件。

RemoteSigned

RemoteSigned(远程签名)策略是 Windows Server 操作系统的默认策略。

该策略下,允许执行脚本。对于本地编写的脚本无需签名即可执行,对于从网络获取的脚本或配置文件如有可信数字签名则可执行,否则将会拒绝。

对于非网络渠道获取的未签名脚本,或已签名的恶意脚本,这一策略可能产生风险。

AllSigned

AllSigned(强制签名)策略,在该策略下仅允许具备可信签名的脚本执行,包括本地编写或其他渠道取得的所有脚本。对于已签名的恶意脚本,这一策略可能产生风险。

Default

Default(默认)策略,指执行当前环境下的默认策略。在 Windows 客户端操作系统中默认策略指定为 Restricted(受限)策略;在 Windows Server 操作系统中默认策略指定为 RemoteSigned(远程签名)策略。

Undefined

Undefined(未定义)策略是指对当前范围未设定执行策略。若当前环境下所有范围均设置为未定义策略时,等效于默认选择 Restricted(受限)策略。

Unrestricted

需要注意的是 Unrestricted(不受限)策略,该策略仅工作在非 Windows 操作系统的环境中,且不可变更。该策略允许所有脚本的执行,包括未签名脚本,这意味着这一策略具有一定风险。

执行策略的范围

执行策略可以根据范围的不同进行不同的设置。有效的范围包含以下几个:

  1. MachinePolicy
  2. UserPolicy
  3. Process
  4. CurrentUser
  5. LocalMachine

在设置和变更执行策略范围时,如未明确具体范围,默认为 LocalMachine。

MachinePolicy

MachinePolicy(机器策略)范围指通过组策略对计算机所有用户做出设置。

UserPolicy

UserPolicy(用户策略)范围指通过组策略对计算机当前用户做出设置。

Process

Process(进程)范围指仅在当前 PowerShell 会话中生效,被设置的执行策略将暂存在当前会话的环境变量中,在当前会话被关闭时,其执行策略会被删除。

CurrentUser

CurrentUser(当前用户)范围指被设置的执行策略仅对当前用户生效,该策略将保存在注册表 HKEY_CURRENT_USER 子键下。

LocalMachine

LocalMachine(本地)范围指被设置的执行策略对本地所有用户生效,该策略保存在注册表 HKEY_LOCAL_MACHINE 子键下。

查询执行策略

PowerShell 中用于查询当前执行策略的指令如下所示:

# 查询执行策略
Get-ExecutionPolicy

# 查询各范围执行策略
Get-ExecutionPolicy -List

# 查询特定范围执行策略(以 CurrentUser 为例)
Get-ExecutionPolicy -Scope CurrentUser

在各范围均设置执行策略的情况下,作用范围最小的执行策略优先级最高。例如,LocalMachine 范围采用 AllSigned 执行策略,而 CurrentUser 范围采用 RemoteSigned 执行策略,则当前情况下 RemoteSigned 策略生效。

变更和取消执行策略

变更执行策略采用 Set-ExecutionPolicy 指令,可以根据实际需要对特定范围做出限制。

Set-ExecutionPolicy RemoteSigned

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

取消执行策略,仅需将被设置执行策略改为 Undefined 即可,同样也可对特定范围生效。

变更和取消执行策略是即时生效的,不需要重启 PowerShell。

Process 范围策略

如不希望变更当前执行策略,仅在单一会话中使用不同的执行的策略,可在命令行中调用 pwsh.exe 程序并传参 ExecutionPolicy,即可在新的会话环境中生效。如:

pwsh.exe -ExecutionPolicy AllSigned

该用例旨在启动一个新的会话,并采用 AllSigned 执行策略。该策略将在会话关闭后终止。