about_Execution_Policies
简短说明
介绍 PowerShell 执行策略并说明如何管理它们。
长说明
PowerShell 执行策略是一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶意脚本的执行。
在 Windows 计算机上,可以为本地计算机、当前用户或特定会话设置执行策略。 还可使用组策略设置为计算机和用户设置执行策略。
本地计算机和当前用户的执行策略存储在 PowerShell 配置文件中。 无需在 PowerShell 配置文件中设置执行策略。 特定会话的执行策略仅存储在内存中,在会话关闭时丢失。
执行策略不是限制用户操作的安全系统。 例如,当用户无法运行脚本时,可以在命令行中键入脚本内容,从而轻松 bypass 创建策略。 相反,执行策略可帮助用户设置基本规则,并防止他们无意中违反这些规则。
在非 Windows 计算机上, default 执行策略是 Unrestricted 无法更改的。 Set-ExecutionPolicy
cmdlet 可用,但 PowerShell 会显示不支持的控制台消息。 虽然 Get-ExecutionPolicy
在非 Windows 平台上返回 Unrestricted,但该行为实际上与 Bypass 匹配,因为这些平台未实施 Windows 安全区域。
PowerShell 执行策略
这些策略仅在 Windows 平台上执行。 PowerShell 执行策略如下:
AllSigned
- 脚本可以运行。
- 要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。
- 在运行来自尚未分类为可信或不可信的发布者的脚本之前会提示你。
- 存在运行已签名的恶意脚本的风险。
Bypass
- 不阻止任何操作,并且没有任何警告或提示。
- 此执行策略专为将 PowerShell 脚本内置到较大应用程序中的配置,或以 PowerShell 为具有自己的安全模型的程序的基础的配置而设计。
Default
- default设置执行策略。
- Restricted(适用于 Windows 客户端)。
- RemoteSigned(适用于 Windows 服务器)。
RemoteSigned
- default Windows 服务器计算机的执行策略。
- 脚本可以运行。
- 需要受信任的发布者对从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序)的数字签名。
- 在本地计算机上编写且不是从 Internet 下载的脚本不需要数字签名。
- 如果脚本已解除阻止(例如通过使用
Unblock-File
cmdlet),则运行从 Internet 下载且未签名的脚本。 - 存在运行来自 Internet 以外来源的未签名脚本以及可能存在恶意的签名脚本的风险。
Restricted
- default Windows 客户端计算机的执行策略。
- 允许单个命令,但不允许脚本。
- 阻止运行所有脚本文件,包括格式和配置文件 (
.ps1xml
)、模块脚本文件 (.psm1
) 和 PowerShell 配置文件 (.ps1
)。
Undefined
- 当前 scope中没有设置执行策略。
- 如果所有作用域内的执行策略均为 Undefined,则对于 Windows 客户端,有效执行策略为 Restricted;对于 Windows Server,有效执行策略为 RemoteSigned。
Unrestricted
- default非 Windows 计算机的执行策略,不能更改。
- 未签名的脚本可以运行。 存在运行恶意脚本的风险。
- 在运行非来自本地 Intranet 区域的脚本和配置文件之前警告用户。
注意
在不区分通用命名约定 (UNC) 路径和 Internet 路径的系统上,可能不允许使用 RemoteSigned 执行策略运行由 UNC 路径标识的脚本。
执行策略 scope
可以设置仅在特定 scope中有效的执行策略。
Scope 的有效值为 MachinePolicy、UserPolicy、Process、CurrentUser 和 LocalMachine。 LocalMachine 是在 default 设置执行策略时。
Scope 值按优先顺序列出。 优先的策略在当前会话中有效,即使在较低优先级设置了更严格的策略。
有关详细信息,请参阅 Set-ExecutionPolicy。
MachinePolicy
通过组策略为计算机的所有用户设置。
UserPolicy
通过组策略为计算机的当前用户设置。
Process
仅 Processscope 影响当前 PowerShell 会话。 执行策略保存在环境变量
$env:PSExecutionPolicyPreference
中,而不是配置文件。 关闭 PowerShell 会话时,将删除变量和值。CurrentUser
执行策略仅影响当前用户。 它存储在 CurrentUser 配置文件中。
LocalMachine
执行策略会影响当前计算机上的所有用户。 它存储在 AllUsers 配置文件中。
使用 PowerShell 管理执行策略
若要获取当前 PowerShell 会话的有效执行策略,请使用 Get-ExecutionPolicy
cmdlet。
以下命令可获取有效的执行策略:
Get-ExecutionPolicy
若要获取影响当前会话的所有执行策略,并按优先级顺序显示它们,请执行以下操作:
Get-ExecutionPolicy -List
结果类似于以下示例输出:
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine AllSigned
在这种情况下,有效的执行策略是 RemoteSigned,因为当前用户的执行策略优先于本地计算机设置的执行策略。
若要为特定 scope设置执行策略,请使用 Scope 参数 Get-ExecutionPolicy
。
例如,以下命令获取 CurrentUserscope 的执行策略:
Get-ExecutionPolicy -Scope CurrentUser
更改执行策略
若要更改 Windows 计算机上的 PowerShell 执行策略,请使用 Set-ExecutionPolicy
cmdlet。 更改立即生效。 无需重启 PowerShell。
如果为 Scopes LocalMachine 或 CurrentUser 设置执行策略,更改将保存在配置文件中,并在再次更改之前保持有效。
如果为 Processscope 设置执行策略,则不会保存在配置文件中。 执行策略将保留,直到当前 process 进程和任何子进程关闭。
注意
在 Windows Vista 和更高版本的 Windows 中,若要运行更改本地计算机的 执行策略的命令 LocalMachinescope,请使用 “以管理员 身份运行”选项启动 PowerShell。
若要更改执行策略,请执行以下操作:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
例如:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
若要在特定 scope设置执行策略,请执行以下操作:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
例如:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
更改执行策略的命令可能会成功,但仍然不会更改有效的执行策略。
例如,为本地计算机设置执行策略的命令可能会成功,但会被当前用户的执行策略覆盖。
删除执行策略
若要删除特定 scope对象的执行策略,请将执行策略设置为 Undefined。
例如,若要删除本地计算机所有用户的执行策略:
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine
若要删除 Scope 的执行策略,请执行以下操作:
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
如果未设置任何scope执行策略,则有效的执行策略是 Restricteddefault Windows 客户端。
为一个会话设置不同的策略
可以使用 pwsh.exe
的 ExecutionPolicy 参数为新的 PowerShell 会话设置执行策略。 该策略仅影响当前会话和子会话。
若要为新会话设置执行策略,请在命令行(如 cmd.exe
或 PowerShell)启动 PowerShell,然后使用 pwsh.exe
的 ExecutionPolicy 参数设置执行策略。
例如:
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: LocalMachine
Execution Policy: CurrentUser
管理已签名和未签名的脚本
在 Windows 中,Internet Explorer 和 Microsoft Edge 等程序会向下载的文件添加备用数据流。 这会将文件标记为“来自 Internet”。 如果 PowerShell 执行策略是 RemoteSigned,PowerShell 将不会运行从 Internet 下载的未签名脚本,其中包括电子邮件和即时消息程序。
可以对脚本进行签名,或选择在不更改执行策略的情况下运行未签名的脚本。
从 PowerShell 3.0 开始,可以使用 Get-Item
cmdlet 的 Stream 参数来检测因从 Internet 下载而被阻止的文件。 使用 Unblock-File
cmdlet 解除阻止脚本,以便可以在 PowerShell 中运行这些脚本。
有关详细信息,请参阅 about_Signing、Get-Item 以及 Unblock-File。
注意
下载文件的其他方法可能不会将文件标记为来自 Internet 区域。 一些示例包括:
curl.exe
Invoke-RestMethod
Invoke-WebRequest
Windows Server Core 和 Windows Nano Server 上的执行策略
在某些情况下,在 Windows Server Core 或 Windows Nano Server 上运行 PowerShell 6 时,执行策略可能会失败,并出现以下错误:
AuthorizationManager check failed.
At line:1 char:1
+ C:\scriptpath\scriptname.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
PowerShell 使用 Windows 桌面 Shell 中的 API (explorer.exe
) 来验证脚本文件的区域。 Windows Shell 在 Windows Server Core 和 Windows Nano Server 上不可用。
如果 Windows 桌面 Shell 不可用或无响应,也可能在任何 Windows 系统上收到此错误。 例如,在登录期间,PowerShell 登录脚本可能会在 Windows 桌面准备就绪之前开始执行,从而导致失败。
使用或 AllSigned 的执行策略ByPass不需要区域检查以避免问题。