1. about_Execution_Policies1.1 POWERSHELL 执行策略1.2 执行策略作用域 2. 使用 PowerShell 管理执行策略2.1 查看当前的有效执行策略2.2 更改执行策略2.3 删除执行策略2.4 为某个会话设置一个不同的执行策略2.5 使用组策略管理执行策略 3. 未签名的脚本3.1 未签名的脚本包含:3.2 本地脚本与网络下载脚本的区别3.3 一秒解锁网络下载脚本3.4 临时绕过策略执行特定脚本3.5 直接运行网络未签名脚本3.6 小结 4. 执行策略可能会失败的原因
1. about_Execution_Policies
https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_execution_policies
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies
PowerShell 执行策略是一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶意脚本的执行。
本地计算机和当前用户的执行策略存储在注册表中。
无需在 Windows PowerShell 配置文件中设置执行策略。
某个特定会话的执行策略仅存储在内存中,当关闭会话时,该执行策略会丢失。
执行策略不是限制用户操作的安全系统。
例如,当用户无法运行脚本时,可以通过在命令行键入脚本内容轻松绕过策略。
相反,执行策略帮助用户设置基本规则并阻止他们无意中违反规则。
1.1 POWERSHELL 执行策略
| ExecutionPolicy 执行策略 |
已签名 | 未签名 | 行为描述 | 概述 | 组策略 选项 | |
| 本地 | 远程(网络) | |||||
| Restricted | No | No | No | 默认策略,禁止所有. 包括: (.ps1xml)格式, (.psm1)模块, (.ps1)PS配置 | 受限 | n |
| AllSigned | Yes | No | No | 要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。 | 仅签名 | Y |
| RemoteSigned | Yes | Yes | No | 本地脚本可运行,下载的脚本需签名 (Windows Server 2012 R2 默认执行策略) | 普通 | Y |
| UnRestricted | Yes | Yes | Yes (提示) | 允许运行所有脚本,但下载的未签名脚本会提示确认 (非 Windows 的默认执行策略) | 非受限 | Y |
| Bypass | Yes | Yes | Yes | 无任何限制,无警告或提示!(高风险) | 无限制 | n |
| Undefined | - | - | - | 当前作用域中未设置执行策略。 | 未定义 | n |
Undefined 表示当前作用域中未设置执行策略。
若所有作用域都没有设置,则默认为: Restricted, 禁止所有脚本。
1.2 执行策略作用域
| 优先级 | Scope 作用域 | 执行策略影响范围 | 存储在: |
| 最高 | MachinePolicy | 当前计算机上的所有用户 | 通过组策略为计算机的所有用户设置 |
| ^ | UserPolicy | 当前计算机上的当前用户 | 通过组策略为计算机的当前用户设置 |
| ^ | PROCESS | 当前的 PowerShell 会话 | 环境变量 $env:PSExecutionPolicyPreference. 关闭 PowerShell 会话时,将删除变量和值。 |
| ^ | CURRENTUSER | 当前计算机上的当前用户 | 存储在 HKCU 注册表子项 |
| 最低 | LOCALMACHINE | 当前计算机上的所有用户 | HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell |
作用域优先级:如上表从上往下依次降低。也是命令 (Get-ExecutionPolicy -list) 列出的顺序。
- 若所有作用域都没有设置执行策略,即同为 [Undefined], 则默认为: Restricted, 禁止所有脚本。
- 若多个作用域设置了执行策略,则优先级高的生效,优先级低的会被忽略。
2. 使用 PowerShell 管理执行策略
2.1 查看当前的有效执行策略
https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.5#managing-the-execution-policy-with-powershell
获取当前 PowerShell 会话的有效执行策略
Get-ExecutionPolicy
Restricted
若要获取影响当前会话的所有执行策略,并按优先顺序显示它们,请键入:
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
以下命令获取 CurrentUser 作用域的执行策略。
Get-ExecutionPolicy -Scope CurrentUser
Undefined
2.2 更改执行策略
若要更改你计算机上的 Windows PowerShell 执行策略,请使用 Set-ExecutionPolicy cmdlet。
更改会立即生效,你无需重新启动 Windows PowerShell。
- 如果为 Scopes LocalMachine 或 CurrentUser 设置执行策略,更改将保存在配置文件中,并在再次更改之前保持有效。
- 如果为 Process 范围设置执行策略,则不会将其保存在配置文件中。 执行策略将一直保留,直到当前进程和任何子进程关闭。
若要更改你的执行策略,请键入:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
不指定作用域,则默认为本机
若要设置某个特定作用域中的执行策略,请键入
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
更改执行策略的命令会成功,但不一定会成为有效的执行策略。
例如,用于设置本地计算机的执行策略的命令可能成功,但会被当前用户的执行策略覆盖。优先级更高的生效。
2.3 删除执行策略
若要删除某个特定作用域的执行策略,则将执行策略的值设置为 Undefined。
例如,若要删除本地计算机的所有用户的执行策略,请键入:
Set-ExecutionPolicy Undefined
或者键入:
Set-ExecutionPolicy Undefined -scope LocalMachine
如果未在任何作用域中设置执行策略,则有效的执行策略是 Restricted,它是默认执行策略。
2.4 为某个会话设置一个不同的执行策略
可以使用 PowerShell.exe 的 ExecutionPolicy 参数为新的 Windows PowerShell 会话设置执行策略。 策略仅影响当前会话和子会话。
例如:
PowerShell.exe -ExecutionPolicy AllSigned
设置的执行策略不是存储在注册表中,而是存储在 $env:PSExecutionPolicyPreference 环境变量中。 当关闭在其中设置了策略的会话时,会删除变量。不能通过编辑变量值来更改策略。
在会话期间,为会话设置的执行策略优先于在注册表中为本地计算机或当前用户设置的执行策略。 但是,它并不优先于通过使用组策略设置的执行策略。优先级见前面的表格。
2.5 使用组策略管理执行策略
可以使用“启用脚本执行”组策略设置来管理计算机的执行策略。 组策略设置覆盖所有作用域中设置的执行策略。
“启用脚本执行”策略设置如下所示:
- -- 如果禁用“启用脚本执行”,则脚本不会运行。这等效于“Restricted”执行策略。
- -- 如果启用“启用脚本执行”,则可以选择一个执行策略。组策略设置等效于以下执行策略设置。
- Group Policy Execution Policy
- 允许所有脚本 Unrestricted
- 允许本地脚本和远程签名脚本 RemoteSigned
- 只允许签名脚本 AllSigned
- '-- 如果未配置“启用脚本执行”,则它将不起作用。 在 Windows PowerShell 中设置的执行策略是有效的。
PowerShellExecutionPolicy.adm 和 PowerShellExecutionPolicy.admx 文件将“启用脚本执行”策略添加到组策略编辑器中的计算机配置节点和用户配置节点中。路径如下:
- Administrative Templates\Windows Components\Windows PowerShell
- [计算机配置] 或 [用户配置] → 管理模板 → Windows 组件 → Windows PowerShell → 启用脚本执行
设置后,让策略立即生效命令:
gpupdate /force
[计算机配置] 节点中设置的策略 优先于 [用户配置] 节点中设置的策略。
Microsoft 下载中心提供 PowerShellExecutionPolicy.adm 文件。有关详细信息,请访问 PowerShell 的管理模版
https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_group_policy_settings
about_Group_Policy_Settings
3. 未签名的脚本
3.1 未签名的脚本包含:
- 网络地址未签名脚本,比如: http://127.0.0.1:9000/Microsoft.PowerShell_profile.ps1
- 本地未签名脚本,本机生成的脚本,比如: Microsoft.PowerShell_profile.ps1
- 网络下载的未签名脚本。~\download\Microsoft.PowerShell_profile.ps1
3.2 本地脚本与网络下载脚本的区别
在 Windows 中,Internet Explorer 和 Microsoft Edge 等程序会向下载的文件添加备用数据流。 这会将文件标记为“来自 Internet”。
如果 PowerShell 执行策略是 RemoteSigned,PowerShell 将不会运行从 Internet 下载的未签名脚本,其中包括电子邮件和即时消息程序。
可以对脚本进行签名,或选择在不更改执行策略的情况下运行未签名的脚本。
从 PowerShell 3.0 开始,可以使用 cmdlet 的 Get-Item 的 Stream 参数来检测因从 Internet 下载而被阻止的文件。 使用 Unblock-File cmdlet 解除阻止脚本,以便可以在 PowerShell 中运行这些脚本。
下载文件的其他方法可能不会将文件标记为来自 Internet 区域。 一些示例包括:
curl.exe; Invoke-RestMethod; Invoke-WebRequest.
查看当前目录下来自网络的未签名文件
- 在脚本文件上,右键 → [属性] 下方有 [解除锁定]的待选框,该文件即为网络下载的带有Internet标记的网络脚本。
- 使用命令行查看 带有Internet标记的网络脚本
- [0.02 sec] > Get-Item * -Stream "Zone.Identifier" -ErrorAction SilentlyContinue
- PSPath : Microsoft.PowerShell.Core\FileSystem::D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:Zone.Identifier
- PSParentPath : Microsoft.PowerShell.Core\FileSystem::D:\Tom\Documents\WindowsPowerShell
- PSChildName : Microsoft.PowerShell_profile.ps1:Zone.Identifier
- PSDrive : D
- PSProvider : Microsoft.PowerShell.Core\FileSystem
- PSIsContainer : False
- FileName : D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
- Stream : Zone.Identifier
- Length : 125
3.3 一秒解锁网络下载脚本
如果 PowerShell 执行策略是 RemoteSigned,则会阻挡网络下载的脚本。但只需解锁,将网络下载脚本变成本地脚本即可。
有很多方法实现这个过程:
- [下载的脚本文件] 上右键 → 点击 [属性] → 勾选下方的 [解除锁定]
- 使用文本编辑器 打开 [下载的脚本文件] → [另存为],新保存的文件就是本地脚本了…
- 使用命令解锁,下面是解锁的不同写法:
- dir D:\Downloads\*PowerShell* | Unblock-File
- Unblock-File -Path D:\Downloads\PowerShell.ps1
- Get-Item D:\Downloads\PowerShell.ps1 | Unblock-File
获取Unblock-File命令帮助
- get-help Unblock-File
- get-help Unblock-File -examples
- get-help Unblock-File -detailed
3.4 临时绕过策略执行特定脚本
PowerShell.exe -ExecutionPolicy Bypass -File "D:\Downloads\PowerShell.ps1"
仅对当前会话有效,退出当前PowerShell后策略自动恢复
3.5 直接运行网络未签名脚本
在本地包含脚本的目录下执行如下命令,启动简单web服务
python -m http.server 9000
通过本机IP即可访问该文件夹的脚本文件
http://127.0.0.1:9000/Microsoft.PowerShell_profile.ps1
通过 Invoke-Expression 命令从网络加载 PowerShell 脚本. 效果同本地文件...
IEX (New-Object Net.WebClient).DownloadString('http://127.0.0.1:9000/Microsoft.PowerShell_profile.ps1')
这个脚本文件本身,即使有来自Internet的标记,不需要解锁,就能加载执行。
查看相关帮助
- Iex -?
- get-help Invoke-Expression -examples
- get-help Invoke-Expression -detailed
加载 PowerShell 脚本
https://exp10it.io/posts/load-powershell-script/
3.6 小结
网络下载的未签名脚本,如上所述,很多方法,非常容易就能解锁变为本地脚本。
再回看前面的 [执行策略表格] 对于网络下载的未签名脚本的态度:
- RemoteSigned,No,但是可以轻松1秒解锁…
- UnRestricted,Yes (提示)
- Bypass,Yes
这样看来这3个策略其实差别不大...
4. 执行策略可能会失败的原因
出现以下错误:
AuthorizationManager check failed.
PowerShell 使用 Windows 桌面 Shell 中的 API (explorer.exe) 来验证脚本文件的区域。
Windows Shell 在 Windows Server Core 和 Windows Nano Server 上不可用。
如果 Windows 桌面 Shell 不可用或无响应,也可能在任何 Windows 系统上收到此错误。
例如,在登录期间,PowerShell 登录脚本可能会在 Windows 桌面准备就绪之前开始执行,从而导致失败。
使用 ByPass 或 AllSigned 的执行策略不需要区域检查,以避免问题。
sztom
osoft@qq.comCC-BY-NC-SA