启动与系统组件

运行已签名的 PowerShell 脚本时文件哈希不匹配 - Windows Client

· 52CE 我爱测

适用于: Windows PowerShell 现象 假设出现了下面这种情景: - 你有一个 PowerShell 脚本,其中包含特殊字符,如 ö、ä 或 ü。 - 在使用系统区域设置(例如 en-US)的计算机上对脚本进行签名。 - 在使用另一个系统区域设置的计算机上运行签名的脚本(例如 cs-CZ)。 - 该脚本使用 ASCII 或 UTF-8 进行编码。 在此方案中,PowerShell 显示以下错误消息: 原因 在 en-US 计算机上对脚本进行签

适用于: 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 编码脚本),请参阅以下步骤:

  1. 你有一台具有以下设置的计算机:

    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)
    
  2. 在同一台计算机上,创建一个 PowerShell 脚本 Install.ps1 ,其中包含特殊字符“ä”,并 对脚本进行签名。

    注意

    在同一台计算机上运行已签名的脚本时,它会正常工作,不会出现问题。

  3. 在使用另一个系统区域设置的计算机上运行相同的签名脚本。 例如:

    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 收集信息中的 步骤收集用户体验问题来收集信息。

资料来源与适用范围

资料来源
微软官方中文故障文档
适用范围
适用于: Windows PowerShell
内容语言
中文;命令、路径和错误标识保留技术原文
本地收录日期
2026-10-26
授权说明
CC BY 4.0

正文与所需资源由本站本地存储。查看来源及更新记录 ↗

请按适用版本和实际日志确认原因;本站没有对每一种系统或设备逐项执行文中的操作。