脚本之前一直好好的,装完 Windows 11 的 KB5132061 之后,签过名的 PowerShell 脚本突然验证失败,甚至 Get-AuthenticodeSignature 直接说“NotSigned”——您是不是正碰上这个?
简单讲:微软在 2026 年 11 月 10 日推送的 KB5132061,把 PowerShell 签名验证和签名时的编码检查变严了。脚本里有不合规的 UTF-8 数据,或者文件编码被系统“读错”了,原来能过的签名就会失败。解决思路也不复杂:先扫描定位,再把脚本转成带 BOM 的 UTF-8,检查内容后重新签名。
如果您还没了解这次更新本身,可以先看小编的另一篇:Windows 11 KB5132061 十一月更新:新功能、修复和下载方法。

为什么签名会验证失败
PowerShell 靠数字签名确认脚本没被改过、来源可信。KB5132061 之后,系统在验证和签名时对文本编码要求更严:以前遇到不合规的 UTF-8 数据,Windows 会用替代字符“糊弄过去”,现在不行了。
下面几种脚本最容易中招:
- 脚本里含有无效的 UTF-8 字节。
- UTF-8 文件没有字节顺序标记(BOM),被系统按本机代码页去读。
- 文件本来是 Shift-JIS 之类的编码,却被当成 UTF-8 解析。
要注意,不是所有“签名失败”都是这次更新惹的祸。文件可能真被改过,或者签名证书本身不受信任,所以别急着改编码,先扫描确认。
想了解更新本身可能带来的其他问题,可以看这篇:装完 KB5132061 出问题怎么办?Windows 11 六种排查办法。
常见症状对照
| 您看到的现象 | 可能说明什么 |
|---|---|
| Get-AuthenticodeSignature 对原本签过名的脚本返回 NotSigned | 签名验证没通过,可能和编码有关 |
| Set-AuthenticodeSignature 返回 UnknownError | 签名时的编码检查没通过 |
| 提示“No mapping for the Unicode character exists in the target multi-byte code page” | 字符和目标代码页对不上 |
| 启用 App Control for Business 的设备上脚本以 ConstrainedLanguage 模式运行 | 受影响脚本被降级处理 |
单凭这些现象不能断定就是编码问题,微软建议先扫描受影响的文件,再决定怎么修。
第一步:用微软的修复脚本扫描文件
微软提供了一个名为 Repair-SignedPowerShellUtf8.ps1 的工具,用来识别和修复这类编码问题。请从微软官方支持页面下载脚本,完整保存并命名为 Repair-SignedPowerShellUtf8.ps1。
运行时请在 FullLanguage 会话里启动 Windows PowerShell 5.1,并遵守您所在组织的执行策略和应用控制要求,不要为了跑脚本去关闭安全策略。
修改或替换任何脚本之前,先用 Scan 模式扫描,它只检查、不改动文件。在放着修复工具的目录里打开 PowerShell,运行:
.\Repair-SignedPowerShellUtf8.ps1 -Mode Scan -Path C:\Scripts -Recurse | Format-Table Path, Issue, SignatureStatus, Action -Wrap 
把命令里的 C:\Scripts 换成您存放脚本的文件夹。扫描结果会列出可能的编码问题、当前签名状态和建议操作,常见的 Issue 有三类:
- CodePageTextReadAsUtf8:某种语言的文本(比如 Shift-JIS)被当成 UTF-8 读了。
- Utf8WithoutBom:没有 BOM 的 UTF-8,可能和系统代码页冲突。
- MalformedUtf8:按 UTF-8 读取时发现了无效数据。
如果扫描结果是 None,就别只因为状态显示 NotSigned 去硬改编码,转而检查证书和签名本身有没有别的问题。
第二步:把脚本转换成带 BOM 的 UTF-8(推荐)
想一劳永逸,微软的建议是:把受影响的脚本转成合法的、带字节顺序标记(BOM)的 UTF-8,检查内容,然后重新签名。命令如下:
.\Repair-SignedPowerShellUtf8.ps1 -Mode ConvertToUtf8Bom -Path C:\Scripts\Deploy.ps1 把路径换成您那个出问题的脚本。工具不会覆盖原文件,而是另存一份带 .utf8bom.ps1 后缀的副本,并且会把旧签名从副本里去掉。
如果脚本原本用的是特定编码,需要指定源代码页。比如 Shift-JIS 对应代码页 932:
.\Repair-SignedPowerShellUtf8.ps1 -Mode ConvertToUtf8Bom -Path C:\Scripts\Deploy.ps1 -SourceCodePage 932 转换完成后,打开新文件仔细核对命令、特殊字符和注释,确认没有被转坏再继续。
第三步:给转换后的脚本重新签名
假设您信任的签名证书已经放在变量 $cert 里,运行:
Set-AuthenticodeSignature -FilePath C:\Scripts\Deploy.utf8bom.ps1 -Certificate $cert 再验证一下签名:
Get-AuthenticodeSignature -FilePath C:\Scripts\Deploy.utf8bom.ps1 | Format-List Status, StatusMessage 确认状态显示有效(Valid)后,先在测试环境跑一遍,再部署到其他设备。命令的详细说明可以看微软文档:Set-AuthenticodeSignature。
第四步(备选):暂时不重新签名的临时修复
如果一时没法重新签名,微软的工具对部分编码问题提供了临时修复模式:
.\Repair-SignedPowerShellUtf8.ps1 -Mode Repair -Path C:\Scripts\Deploy.ps1 这个模式同样会生成一份单独的副本,并尽量保留原有签名。它只适用于部分编码场景,不保证每次都成功。只有当结果文件的 SignatureStatus 是 Valid,并且您检查、测试过之后,再拿去使用。
小结
这不是 PowerShell 坏了,而是 KB5132061 有意加强了安全校验:对编码不合规或被改动的脚本不再“放行”。碰到问题,按“先扫描、再转 UTF-8 BOM、检查后重新签名”的顺序处理就行。
常见问题(FAQ)
脚本签名失败一定是 KB5132061 导致的吗?
不一定。文件被改过、证书不受信任也会失败,所以请先用 Scan 模式确认是不是编码问题。
修复脚本会直接改掉我的原文件吗?
不会。转换和修复模式都会另存一份副本,原文件不动。
转换成 UTF-8 BOM 后,旧签名还能用吗?
转换时旧签名会从副本里去掉,需要用您信任的证书重新签名。
扫描结果是 None,但还是显示 NotSigned 怎么办?
那就不是编码问题,不要硬改编码,转去检查证书和签名本身。
可以为了跑脚本去关掉执行策略吗?
不建议。请遵守组织的执行策略和应用控制,通过修复脚本解决,而不是关闭安全设置。