about_Execution_Policies

简短说明

介绍 PowerShell 执行策略并说明如何管理它们。

详细说明

PowerShell 的执行策略是一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶意脚本的执行。

在Windows计算机上,你可以为本地计算机、当前用户或特定会话设置执行策略。 还可使用组策略设置为计算机和用户设置执行策略。

本地计算机和当前用户的执行策略存储在注册表中。 无需在 PowerShell 配置文件中设置执行策略。 特定会话的执行策略仅存储在内存中,在关闭会话时将丢失。

执行策略不是限制用户操作的安全系统。 例如,当用户无法运行脚本时,可以通过在命令行中键入脚本内容来轻松绕过策略。 相反,执行策略可帮助用户设置基本规则,并防止用户无意中违反这些规则。

在非Windows计算机上,默认执行策略为 且 Unrestricted 无法更改。 Set-ExecutionPolicycmdlet 可用,但 PowerShell 显示一条控制台消息,指出它不受支持。 虽然 在非 Windows平台上返回 ,但行为确实匹配,因为这些平台不实现 Windows 安全中心 Get-ExecutionPolicy Unrestricted Bypass 区域。

PowerShell 执行策略

这些策略仅在其他平台上Windows执行。 PowerShell 执行策略如下所示:

AllSigned

  • 脚本可以运行。
  • 要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。
  • 在从尚未分类为受信任或不受信任的发布者运行脚本之前,提示你。
  • 运行已签名但恶意的脚本的风险。

Bypass

  • 不阻止任何操作,并且没有任何警告或提示。
  • 此执行策略适用于将 PowerShell 脚本内置到较大应用程序中的配置,或用于 PowerShell 是具有其自己的安全模型的程序基础的配置。

Default

  • 设置默认执行策略。
  • Restricted 对于 Windows 客户端。
  • RemoteSigned Windows服务器。

RemoteSigned

  • 服务器计算机的默认Windows策略。
  • 脚本可以运行。
  • 需要受信任的发布者对从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序)进行数字签名。
  • 对于在本地计算机上编写且未从 Internet 下载的脚本,不需要数字签名。
  • 如果脚本未受阻止(例如使用 cmdlet),则运行从 Internet 下载且 Unblock-File 未签名的脚本。
  • 从 Internet 来源(而不是 Internet)运行未签名脚本的风险,以及可能是恶意的已签名脚本的风险。

Restricted

  • 客户端计算机的默认Windows策略。
  • 允许单个命令,但不允许脚本。
  • 阻止运行所有脚本文件,包括格式化和配置文件 () 、模块脚本文件 () 和 .ps1xml .psm1 PowerShell 配置文件 .ps1 () 。

Undefined

  • 当前作用域中未设置执行策略。
  • 如果所有作用域中的执行策略都是 ,则有效执行策略适用于 Windows Undefined Restricted 客户端 ,RemoteSigned 适用于 Windows 服务器。

Unrestricted

  • 非计算机的默认执行Windows无法更改。
  • 未签名的脚本可以运行。 存在运行恶意脚本的风险。
  • 在运行不是来自本地 Intranet 区域中的脚本和配置文件之前,警告用户。

备注

在未区分通用命名约定 (UNC) 路径与 Internet 路径的系统上,可能不允许 UNC 路径标识的脚本使用 RemoteSigned 执行策略运行。

执行策略范围

可以设置仅在特定范围内有效的执行策略。

的有效值为 Scope MachinePolicy 、UserPolicy Process 、、CurrentUserLocalMachineLocalMachine 是设置执行策略时的默认选项。

这些值 Scope 按优先顺序列出。 优先的策略在当前会话中有效,即使设置了限制性更强且优先级较低的策略。

有关详细信息,请参阅 Set-ExecutionPolicy

MachinePolicy

由 组策略计算机的所有用户设置。

UserPolicy

由 组策略当前用户的设置。

Process

Process 范围仅影响当前 PowerShell 会话。 执行策略保存在环境变量 中 $env:PSExecutionPolicyPreference ,而不是注册表中。 关闭 PowerShell 会话后,将删除变量和值。

CurrentUser

执行策略仅影响当前用户。 它存储在注册表 HKEY_CURRENT_USER项中

LocalMachine

执行策略会影响当前计算机上所有用户。 它存储在注册表 HKEY_LOCAL_MACHINE项中

使用 PowerShell 管理执行策略

若要获取当前 PowerShell 会话的有效执行策略,请使用 Get-ExecutionPolicy cmdlet。

以下命令获取有效执行策略:

Get-ExecutionPolicy

若要获取影响当前会话的所有执行策略,并按优先顺序显示这些策略,请执行以下命令:

Get-ExecutionPolicy -List

结果类似于以下示例输出:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine       AllSigned

在这种情况下,有效执行策略为 RemoteSigned, 因为当前用户的执行策略优先于为本地计算机设置的执行策略。

若要获取特定范围的执行策略集,请使用 Scope 的 参数 Get-ExecutionPolicy

例如,以下命令获取 CurrentUser 范围的执行 策略:

Get-ExecutionPolicy -Scope CurrentUser

更改执行策略

若要更改计算机上 PowerShell 执行Windows,请使用 Set-ExecutionPolicy cmdlet。 更改会立即生效。 无需重启 PowerShell。

如果为 LocalMachineCurrentUser 范围设置执行策略,则更改将保存在注册表中,并一直有效,直到再次更改它。

如果为范围设置执行 Process 策略,该策略不会保存在注册表中。 将保留执行策略,直到当前进程和任何子进程关闭。

备注

在 Windows Vista 及更高版本的 Windows 中,若要运行更改本地计算机 LocalMachine 范围的执行策略的命令,请通过"以管理员方式运行"选项启动PowerShell。

更改执行策略:

Set-ExecutionPolicy -ExecutionPolicy <PolicyName>

例如:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

设置特定作用域中的执行策略:

Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>

例如:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

更改执行策略的命令可以成功,但仍不能更改有效执行策略。

例如,为本地计算机设置执行策略的命令可以成功,但被当前用户的执行策略重写。

删除执行策略

若要删除特定范围的执行策略,将执行策略设置为 Undefined

例如,若要删除本地计算机的所有用户的执行策略,请执行以下命令:

Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine

删除 的执行策略 Scope

Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser

如果在任何作用域中未设置执行策略,则有效执行策略为 Restricted ,这是客户端Windows策略。

为一个会话设置不同的策略

可以使用 的 ExecutionPolicy 参数 pwsh.exe 为新的 PowerShell 会话设置执行策略。 策略仅影响当前会话和子会话。

若要设置新会话的执行策略,请从命令行(如 PowerShell 或 PowerShell)启动 PowerShell,然后使用 的 cmd.exe ExecutionPolicy 参数 pwsh.exe 设置执行策略。

例如:

pwsh.exe -ExecutionPolicy AllSigned

设置的执行策略不会存储在注册表中。 而是存储在环境 $env:PSExecutionPolicyPreference 变量中。 关闭设置策略的会话时,将删除该变量。 不能通过编辑变量值来更改策略。

在会话期间,为会话设置的执行策略优先于在本地计算机或当前用户的注册表中设置的执行策略。 但是,它并不优先于使用命令设置的执行组策略。

使用组策略管理执行策略

可以使用"启用 脚本执行 组策略"设置来管理企业中计算机的执行策略。 "组策略"设置将覆盖所有作用域的 PowerShell 中设置的执行策略。

" 启用脚本执行" 策略设置如下所示:

  • 如果禁用 "启用脚本执行", 则脚本不会运行。 这等效于 Restricted 执行策略。

  • 如果启用 "启用脚本执行", 可以选择执行策略。 组策略设置等效于以下执行策略设置:

    组策略 执行策略
    允许所有脚本 Unrestricted
    允许本地脚本和远程签名脚本 RemoteSigned
    仅允许已签名的脚本 AllSigned
  • 如果未 配置"启用 脚本执行",则不起作用。 PowerShell 中设置的执行策略有效。

PowerShellExecutionPolicy.adm 和 PowerShellExecutionPolicy.admx 文件将以下路径中的"启用脚本执行"策略添加到 组策略 编辑器中的"计算机配置"和"用户配置"节点。

对于 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 将按以下优先顺序评估执行策略:

Group Policy: MachinePolicy
Group Policy: UserPolicy
Execution Policy: Process (or pwsh.exe -ExecutionPolicy)
Execution Policy: CurrentUser
Execution Policy: LocalMachine

管理已签名和未签名的脚本

在 Windows 中,Internet Explorer 和 Microsoft Edge 程序向下载的文件添加备用数据流。 这会将文件标记为"来自 Internet"。 如果 PowerShell 执行策略为 RemoteSigned,则 PowerShell 不会运行从 Internet 下载的未签名脚本,其中包括电子邮件和即时消息程序。

你可以对脚本进行签名,也可以选择在不更改执行策略的情况下运行未签名的脚本。

从 PowerShell 3.0 开始,可以使用 cmdlet 的 Stream 参数来检测由于从 Internet 下载而受阻 Get-Item 的文件。 使用 Unblock-File cmdlet 取消阻止脚本,以便可以在 PowerShell 中运行它们。

有关详细信息,请参阅 about_Signing、Get-ItemUnblock-File

备注

下载文件的其他方法可能不会将文件标记为来自 Internet 区域。 示例包括:

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

Windows Server Core 和 Window Nano Server 上的执行策略

在某些情况下,如果 PowerShell 6 Windows Server Core 或 nano Server Windows,则执行策略可能会失败并出现以下错误:

AuthorizationManager check failed.
At line:1 char:1
+ C:\scriptpath\scriptname.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

PowerShell 使用 Windows Desktop Shell () API explorer.exe 来验证脚本文件的区域。 Windows Server Core 和 Nano Server 上Windows Shell Windows。

如果桌面 Shell 不可用或无Windows,Windows系统上也收到此错误。 例如,在登录期间,PowerShell 登录脚本可以在桌面桌面Windows之前开始执行,从而导致失败。

使用 ByPassAllSigned 的执行策略不需要区域检查来避免此问题。

另请参阅

about_Environment_Variables

about_Group_Policy_Settings

about_Signing

Get-ExecutionPolicy

Get-Item

about_Pwsh

Set-ExecutionPolicy

Unblock-File