RemoteSigned执行政策下未签名互联网脚本可运行的原因咨询
为什么带Zone.Identifier的未签名脚本在不同PowerShell 5.1版本中执行结果不同?
这本质上是Windows 10版本更新带来的PowerShell安全策略逻辑调整,具体对应两个版本所处的系统迭代:
版本差异背后的系统背景
- 你使用的
5.1.14409.1012对应Windows 10 1607(Anniversary Update) 5.1.16299.98对应Windows 10 1709(Fall Creators Update)
微软在1709版本中收紧了PowerShell对"互联网来源脚本"的判定规则:
核心行为差异原因
在Windows 10 1607及更早版本中,PowerShell的RemoteSigned执行策略仅对通过PowerShell直接从网络获取的脚本(比如用Invoke-WebRequest下载的)强制要求签名;对于本地保存的、仅带有Zone.Identifier ADS(ZoneId=3)的脚本,PowerShell不会将其判定为"远程来源",因此允许未签名运行。
而从Windows 10 1709开始,PowerShell更新了逻辑:只要脚本带有ZoneId=3的ADS标识(无论通过哪种方式下载到本地),就会被视为"来自互联网的远程脚本",此时RemoteSigned策略会强制要求脚本必须经过数字签名才能运行,这就是你在16299版本中看到报错的原因。
验证与解决方案
验证规则
你可以通过移除脚本的Zone.Identifier ADS来测试:
Remove-Item .\Get-Type.ps1 -Stream Zone.Identifier
之后再运行脚本,两个版本都会允许执行(因为脚本不再带有互联网来源标识)。
合法的解决方式
- 移除Zone标识:对于信任的脚本,使用上述命令或者右键文件→属性→勾选"解除锁定"来移除ADS。
- 签名脚本:如果你需要长期使用这个脚本,可以给自己的脚本添加数字签名,符合
RemoteSigned策略要求。 - 临时调整执行策略(不推荐):仅在测试环境中,可临时将当前用户的执行策略改为
Unrestricted,但会降低系统安全性。
内容的提问来源于stack exchange,提问作者lit




