本文译自微软PowerShell官方文档,原版请参阅 PowerShell Documentation ## 介绍 设置Windows计算机的PowerShell执行策略

Set-ExecutionPolicy   [-ExecutionPolicy] <ExecutionPolicy>   [[-Scope] <ExecutionPolicyScope>]   [-Force]   [-WhatIf]   [-Confirm]   [<CommonParameters>]

描述

Set-ExecutionPolicy 命令会更改Windows计算机的PowerShell执行策略。有关更多信息,请参见 关于可执行程序策略

对于非windows系统的PowerShell,自6.0版本以后,默认的执行策略是 Unrestricted(不受限制的)

执行策略是PowerShell安全策略的一部分。执行策略决定您是否可以加载配置文件(例如PowerShell配置文件)或运行脚本。并且,脚本在运行之前是否必须经过数字签名。

Set-ExecutionPolicy 命令的默认范围是本地机器(LocalMachine),它会影响使用计算机的每个人。若要更改LocalMachine的执行策略,请使用“以管理员身份运行”启动PowerShell 。

要按优先顺序显示每个作用域的执行策略,请使用 Get-ExecutionPolicy -List 如要查看您的PowerShell会话的有效执行策略,请使用 Get-ExecutionPolicy 无参数的方法。

例子

示例1:设置执行策略

本示例演示如何设置本地计算机的执行策略。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
Get-ExecutionPolicy -ListScope ExecutionPolicy        
----- ---------------
MachinePolicy       Undefined   
UserPolicy       Undefined      
Process      Undefined  
CurrentUser    RemoteSigned 
LocalMachine    RemoteSigned

Set-ExecutionPolicy命令使用ExecutionPolicy参数指定 RemoteSigned(已远程签名) 的策略。该范围参数指定默认的范围值, LOCALMACHINE。若要查看执行策略设置,请将该Get-ExecutionPolicycmdlet与List参数一起使用。

示例2:设置与组策略冲突的执行策略

该命令尝试将LocalMachine范围的执行策略设置为Restricted。 LocalMachine的限制更严格,但不是有效的策略,因为它与组策略冲突。该限制政策被写入到注册表配置单元HKEY_LOCAL_MACHINE。

PS> Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope LocalMachine

Set-ExecutionPolicy : PowerShell updated your local preference successfully, but the setting is
overridden by the Group Policy applied to your system. Due to the override, your shell will retain
its current effective execution policy of "AllSigned". Contact your Group Policy administrator for
more information. At line:1 char:20 + Set-ExecutionPolicy < restricted="" ps=""> Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds

    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds

Name                    Property
----                    --------
Microsoft.PowerShell    Path            : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
                        ExecutionPolicy : Restricted
ScriptedDiagnostics     ExecutionPolicy : Unrestricted

Set-ExecutionPolicy命令使用ExecutionPolicy参数指定受 限制的策略。该范围参数指定默认的范围值,LOCALMACHINE。该Get-ChildItemcmdlet与HKLM提供程序一起使用Path参数来指定注册表位置。 ### 示例3:将执行策略从远程计算机应用到本地计算机 此命令从远程计算机获取执行策略对象,并在本地计算机上设置策略。在管道中Get-ExecutionPolicy发送Microsoft.PowerShell.ExecutionPolicy对象。Set-ExecutionPolicy接受管道输入,不需要 ExecutionPolicy参数。

PS> Invoke-Command -ComputerName Server01 -ScriptBlock { Get-ExecutionPolicy } | Set-ExecutionPolicy

Invoke-Command命令在本地计算机上执行,并将ScriptBlock发送到远程计算机。该计算机名参数指定远程计算机,Server01上。该 脚本块参数运行Get-ExecutionPolicy在远程计算机上。该 Get-ExecutionPolicy物体顺着管道发送Set-ExecutionPolicySet-ExecutionPolicy将执行策略应用于本地计算机的默认范围 LocalMachine。 ### 示例4:设置执行策略的范围 本示例说明如何为指定范围CurrentUser设置执行策略。该 CurrentUser范围只影响谁设置此范围内的用户。

Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope CurrentUserGet-ExecutionPolicy -ListScope ExecutionPolicy        ----- ---------------MachinePolicy       Undefined   UserPolicy       Undefined      Process       Undefined  CurrentUser       AllSigned LocalMachine    RemoteSigned

Set-ExecutionPolicy使用ExecutionPolicy参数指定AllSigned策略。该范围参数指定CurrentUser。若要查看执行策略设置,请将该Get-ExecutionPolicycmdletList参数一起使用。 用户的有效执行策略变为AllSigned。 ### 示例5:删除当前用户的执行策略 本示例说明如何使用未定义的执行策略删除指定范围的执行策略。

Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUserGet-ExecutionPolicy -ListScope ExecutionPolicy        ----- ---------------MachinePolicy       Undefined   UserPolicy       Undefined      Process       Undefined  CurrentUser       Undefined LocalMachine    RemoteSigned

Set-ExecutionPolicy使用ExecutionPolicy参数指定未定义策略。该范围参数指定CurrentUser。若要查看执行策略设置,请将该Get-ExecutionPolicycmdletList参数一起使用。 ### 示例6:设置当前PowerShell会话的执行策略 Process(进程) 范围只影响当前的PowerShell会话。执行策略保存在环境变量中,$env:PSExecutionPolicyPreference并在关闭会话时被删除。

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

Set-ExecutionPolicy使用ExecutionPolicy参数指定的AllSigned 政策。所述范围参数指定值过程。若要查看执行策略设置,请将该Get-ExecutionPolicycmdletList参数一起使用。 ### 示例7:取消阻止脚本以运行它而不更改执行策略 本示例说明RemoteSigned执行策略如何阻止您运行未签名的脚本。

最佳实践是在使用Unblock-File命令之前阅读脚本的代码并验证其安全性。该Unblock-Filecmdlet取消阻止脚本,以便它们可以运行,但不会更改执行策略。

PS> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachinePS> Get-ExecutionPolicyRemoteSignedPS> .\Start-ActivityTracker.ps1.\Start-ActivityTracker.ps1 : File .\Start-ActivityTracker.ps1 cannot be loaded.The file .\Start-ActivityTracker.ps1 is not digitally signed.The script will not execute on the system.For more information, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.At line:1 char:1+ .\Start-ActivityTracker.ps1+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo          : NotSpecified: (:) [], PSSecurityException+ FullyQualifiedErrorId : UnauthorizedAccessPS> Unblock-File -Path .\Start-ActivityTracker.ps1PS> Get-ExecutionPolicyRemoteSignedPS> .\Start-ActivityTracker.ps1Task 1:

Set-ExecutionPolicy使用ExecutionPolicy参数指定下RemoteSigned 政策。该策略设置为默认范围LocalMachine

Get-ExecutionPolicy命令显示RemoteSigned是当前PowerShell会话的有效执行策略。

在启动ActivityTracker.ps1脚本是从当前目录执行。该脚本被RemoteSigned阻止,因为该脚本未进行数字签名。

对于此示例,脚本的代码已被检查并确认可以安全运行。该Unblock-File命令使用Path参数来取消阻止脚本。

要验证Unblock-File没有更改执行策略,请Get-ExecutionPolicy显示有效的执行策略RemoteSigned

脚本Start-ActivityTracker.ps1是从当前目录执行的。该脚本开始运行,因为该Unblock-File命令未被cmdlet阻止。

参数

Confirm

运行命令之前提示您进行确认。

名称
Type(类型):
Aliases(别名):
Position(位置):
Default value(默认值):
Accept pipeline input(接受管道输入):
Accept wildcard characters(接受通配符):

ExecutionPolicy

指定执行策略。如果没有组策略,并且每个范围的执行策略都设置为Undefined,那么Restricted将成为所有用户的有效策略。

可接受的执行策略值如下:

  • 全部签名。要求所有脚本和配置文件均由受信任的发布者签名,包括在本地计算机上编写的脚本。
  • 绕过。没有任何障碍,也没有警告或提示。
  • 默认。设置默认执行策略。对于Windows客户端或 RemoteSigned对于Windows服务器受限制。
  • RemoteSigned。要求从Internet下载的所有脚本和配置文件均由受信任的发布者签名。Windows服务器计算机的默认执行策略。
  • 受限制的。不加载配置文件或运行脚本。Windows客户端计算机的默认执行策略。
  • 未定义。没有为范围设置执行策略。从组策略未设置的范围中删除分配的执行策略。如果所有作用域中的执行策略均为未定义,则有效执行策略为“受限”。
  • 不受限制。从PowerShell 6.0开始,这是非Windows计算机的默认执行策略,不能更改。加载所有配置文件并运行所有脚本。如果运行从Internet下载的未签名脚本,则会在运行之前提示您获得许可。
名称
Type(类型): ExecutionPolicy
Accepted values(可接受的值): AllSigned, Bypass, Default, RemoteSigned, Restricted, Undefined, Unrestricted
Position(位置): 0
Default value(默认值): None
Accept pipeline input(接受管道输入): True
Accept wildcard characters(接受通配符): False

Force

禁止所有确认提示。请谨慎使用此参数,以避免意外结果。

名称
Type(类型):
Position(位置):
Default value(默认值):
Accept pipeline input(接受管道输入):
Accept wildcard characters(接受通配符):

Scope

指定受执行策略影响的范围。默认范围是LocalMachine。

有效执行策略由优先级顺序确定,如下所示: * MachinePolicy。由组策略为计算机的所有用户设置。 * UserPolicy。由组策略为计算机的当前用户设置。 * Process。仅影响当前的PowerShell会话。 * CurrentUser。仅影响当前用户。 * LocalMachine。影响计算机所有用户的默认范围。

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

CurrentUser范围的执行策略被写入注册表配置单元 HKEY_LOCAL_USER

LocalMachine范围的执行策略写入注册表配置单元 HKEY_LOCAL_MACHINE

名称
Type(类型): ExecutionPolicyScope
Accepted values(可接受的值): CurrentUser, LocalMachine, MachinePolicy, Process, UserPolicy
Position(位置): 1
Default value(默认值): LocalMachine
Accept pipeline input(接受管道输入): True
Accept wildcard characters(接受通配符): False

WhatIf

显示命令运行时即将发生的情况。该cmdlet没有运行。

名称
Type(类型):
Aliases(别名):
Position(位置):
Default value(默认值):
Accept pipeline input(接受管道输入):
Accept wildcard characters(接受通配符):

输入

Microsoft.PowerShell.ExecutionPolicy, System.String
您可以将执行策略对象或包含执行策略名称的字符串传递给 Set-ExecutionPolicy

输出

Set-ExecutionPolicy 不返回任何输出。

注意事项

Set-ExecutionPolicy不会更改MachinePolicyUserPolicy范围,因为它们是由组策略设置的。

Set-ExecutionPolicy 即使用户首选项比策略更具限制性,它也不会覆盖组策略。

如果为计算机或用户启用了组策略打开脚本执行,则将保存用户首选项,但无效。PowerShell将显示一条说明冲突的消息。