适用于: Windows PowerShell
现象
假设出现了下面这种情景:
- 你有一个 PowerShell 脚本,其中包含特殊字符,如 ö、ä 或 ü。
- 在使用系统区域设置(例如 en-US)的计算机上对脚本进行签名。
- 在使用另一个系统区域设置的计算机上运行签名的脚本(例如 cs-CZ)。
- 该脚本使用 ASCII 或 UTF-8 进行编码。
在此方案中,PowerShell 显示以下错误消息:
The contents of file <FullPathForSignedPowerShellScript> might have been changed by an
unauthorized user or process because the hash of the file does not match the hash stored
in the digital signature. The script cannot run on the specified system.
原因
在 en-US 计算机上对脚本进行签名时,签名过程使用 en-US 代码为 umlaut 和特殊字符创建数字签名。 如果在 cs-CZ 计算机上运行签名脚本,签名验证将失败,因为 ö、ä 和 ü 等 ASCII 或 UTF-8 中的 umlaut 和特殊字符在 en-US 和 cs-CZ 计算机上以不同的方式编码。
签名验证过程为不包含签名的 PowerShell 脚本内容创建哈希。 cs-CZ 和 en-US 计算机上以不同的方式解释 umlaut 和特殊字符。 在这种情况下,将发生哈希不匹配。
解决方法
若要使签名的 PowerShell 脚本独立于区域设置运行,请使用以下方法之一:
- 在对 PowerShell 脚本进行签名之前,替换或删除所有 umlaut 和特殊字符,例如 ö、ä 和 ü。
- 对 PowerShell 脚本使用 UTF-16 LE BOM 编码。
详细信息
有关重现问题的特殊字符“ä”的示例(UTF-8 编码脚本),请参阅以下步骤:
-
你有一台具有以下设置的计算机:
PS C:\Users> get-culture LCID Name DisplayName ---- ---- ----------- 1033 en-US English (United States) PS C:\Users> Get-ExecutionPolicy AllSigned PS C:\Users> Get-WinSystemLocale LCID Name DisplayName ---- ---- ----------- 1033 en-US English (United States) -
在同一台计算机上,创建一个 PowerShell 脚本 Install.ps1 ,其中包含特殊字符“ä”,并 对脚本进行签名。
注意
在同一台计算机上运行已签名的脚本时,它会正常工作,不会出现问题。
-
在使用另一个系统区域设置的计算机上运行相同的签名脚本。 例如:
PS C:\tmp> Get-Culture LCID Name DisplayName ---- ---- ----------- 1033 en-US English (United States) PS C:\tmp > Get-ExecutionPolicy AllSigned PS C:\tmp > Get-WinSystemLocale LCID Name DisplayName ---- ---- ----------- 1029 cs-CZ Czech (Czech Republic)脚本失败并显示以下消息:
File C:\tmp\Install.ps1 cannot be loaded. The contents of file C:\tmp\Install.ps1 might have been changed by an unauthorized user or process, because the hash of the file does not match the hash stored in the digital signature. The script cannot run on the specified system. For more information, run Get-Help about_Signing.. At line:1 char:1 + .\Install.ps1 + ~~~~~~~~~~~~~ + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
有关以不同方式编码的 PowerShell 脚本的详细信息,请参阅:
| - | ASCII 编码的 PowerShell 脚本 | UTF-8 编码的 PowerShell 脚本 | UTF-16 BE BOM 编码的 PowerShell 脚本 | UTF-16 LE BOM 编码的 PowerShell 脚本 |
|---|---|---|---|---|
| Windows 10 | 受影响的 HASH 不匹配问题 | 受影响的 HASH 不匹配问题 | n/a (Set-AuthenticodeSignature 失败并出现 UnknownError) | 与 HASH 不匹配问题不受影响 |
| Windows 11 | 受影响的 HASH 不匹配问题 | 受影响的 HASH 不匹配问题 | n/a (Set-AuthenticodeSignature 失败并出现 UnknownError) | 与 HASH 不匹配问题不受影响 |
| Windows Server 2019 | 受影响的 HASH 不匹配问题 | 受影响的 HASH 不匹配问题 | n/a (Set-AuthenticodeSignature 失败并出现 UnknownError) | 与 HASH 不匹配问题不受影响 |
| Windows Server 2022 | 受影响的 HASH 不匹配问题 | 受影响的 HASH 不匹配问题 | n/a (Set-AuthenticodeSignature 失败并出现 UnknownError) | 与 HASH 不匹配问题不受影响 |
数据收集
如果需要Microsoft支持方面的帮助,建议按照使用 TSS 收集信息中的 步骤收集用户体验问题来收集信息。