本文介绍
PowerShell
执行策略并说明如何管理它们。
什么是PowerShell
执行策略?
PowerShell 执行策略是一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶意脚本的执行。
在 Windows 计算机上,可以为本地计算机、当前用户或特定会话设置执行策略。 还可使用组策略设置为计算机和用户设置执行策略。
本地计算机和当前用户的执行策略存储在注册表中。 无需在 PowerShell 配置文件中设置执行策略。 特定会话的执行策略仅存储在内存中,在会话关闭时丢失。
执行策略不是限制用户操作的安全系统。 例如,当用户无法运行脚本时,可以在命令行中键入脚本内容,从而轻松绕过策略。 相反,执行策略可帮助用户设置基本规则,并防止他们无意中违反这些规则。
在非 Windows 计算机上,默认执行策略是 Unrestricted 且无法更改。 Set-ExecutionPolicy cmdlet 可用,但 PowerShell 会显示不支持的控制台消息。 虽然 Get-ExecutionPolicy 在非 Windows 平台上返回 Unrestricted,但该行为实际上与 Bypass 匹配,因为这些平台未实施 Windows 安全区域。
PowerShell
执行策略有哪些?
AllSigned
脚本可以运行。
要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。
在运行来自尚未分类为可信或不可信的发布者的脚本之前会提示你。
存在运行已签名的恶意脚本的风险。
Bypass
不阻止任何操作,并且没有任何警告或提示。
此执行策略专为将 PowerShell 脚本内置到较大应用程序中的配置,或以 PowerShell 为具有自己的安全模型的程序的基础的配置而设计。
Default
设置默认执行策略。
Restricted(适用于 Windows 客户端)。
RemoteSigned(适用于 Windows 服务器)。
RemoteSigned
Windows 服务器计算机的默认执行策略。
脚本可以运行。
需要受信任的发布者对从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序)的数字签名。
在本地计算机上编写且不是从 Internet 下载的脚本不需要数字签名。
如果脚本已解除阻止(例如通过使用 Unblock-File cmdlet),则运行从 Internet 下载且未签名的脚本。
存在运行来自 Internet 以外来源的未签名脚本以及可能存在恶意的签名脚本的风险。
Restricted
Windows 客户端计算机的默认执行策略。
允许单个命令,但不允许脚本。
阻止运行所有脚本文件,包括格式和配置文件 (.ps1xml)、模块脚本文件 (.psm1) 和 PowerShell 配置文件 (.ps1)。
Undefined
当前作用域内没有设置执行策略。
如果所有作用域内的执行策略均为 Undefined,则对于 Windows 客户端,有效执行策略为 Restricted;对于 Windows Server,有效执行策略为 RemoteSigned。
Unrestricted
非 Windows 计算机的默认执行策略,无法更改。
未签名的脚本可以运行。 存在运行恶意脚本的风险。
在运行非来自本地 Intranet 区域的脚本和配置文件之前警告用户。
如何操作?
查看当前执行策略
Get-ExecutionPolicy
查看所有执行策略
Get-ExecutionPolicy -List
查看当前用户作用域下的执行策略
Get-ExecutionPolicy -Scope CurrentUser
更改执行策略
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
# 例如:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
更改特定作用域执行策略
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
# 例如:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
- 更改执行策略的命令可能会成功,但仍然不会更改有效的执行策略。
- 例如,为本地计算机设置执行策略的命令可能会成功,但会被当前用户的执行策略覆盖。
删除本地计算机所有用户的执行策略
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine
删除特定作用域执行策略
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser