Поделиться через


Хэш файла не соответствует при запуске подписанного скрипта PowerShell

Область применения: 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 процесс подписи создает цифровую подпись для umlaut и специальных символов с помощью кода en-US. Если вы запускаете подписанный скрипт на компьютере cs-CZ, проверка подписи завершится ошибкой, так как umlaut и специальные символы, такие как ö, ä, и ü в ASCII или UTF-8, кодируются по-разному на компьютерах en-US и cs-CZ.

Процесс проверки подписи создает хэш для содержимого скрипта PowerShell, которое не включает подпись. И umlaut и специальные символы интерпретируются по-разному на компьютерах cs-CZ и en-US. В этой ситуации будет возникать хэш-несоответствие.

Решение

Чтобы выполнить подписанный скрипт PowerShell независимо от параметров языкового стандарта, используйте один из следующих методов:

  • Замените или удалите все umlaut и специальные символы, такие как ö, ä и ü перед подписанием скриптов PowerShell.

  • Используйте кодировку UTF-16 LE BOM для сценариев PowerShell.

Дополнительная информация

Пример (скрипт в кодировке 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, которые кодируются по-разному, см. в следующих статье:

Скрипт PowerShell в кодировке ASCII Скрипт PowerShell в кодировке UTF-8 Скрипт PowerShell в кодировке UTF-16 BE BOM Скрипт PowerShell в кодировке UTF-16 LE BOM
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 не затронута

Сбор данных

Если вам нужна помощь от поддержки Майкрософт, рекомендуется собирать сведения, выполнив действия, описанные в статье "Сбор сведений" с помощью TSS для проблем с взаимодействием с пользователем.