Compartilhar via


O hash do arquivo não corresponde ao executar o script assinado do PowerShell

Aplica-se a: Windows PowerShell

Sintomas

Considere o cenário a seguir.

  • Você tem um script do PowerShell que contém caracteres especiais como ö, ä ou ü.

  • Você assina o script em um computador que usa uma localidade do sistema (por exemplo, en-US).

  • Você executa o script assinado em um computador que usa outra localidade do sistema (por exemplo, cs-CZ).

  • O script é codificado com ASCII ou UTF-8.

Nesse cenário, o PowerShell exibe a seguinte mensagem de erro:

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.

Causa

Quando você assina o script em um computador en-US, o processo de assinatura cria a assinatura digital para trema e caracteres especiais usando o código en-US. Se você executar o script assinado em um computador cs-CZ, a verificação de assinatura falhará porque trema e caracteres especiais como ö, ä e ü em ASCII ou UTF-8 são codificados de forma diferente em computadores en-US e cs-CZ.

O processo de verificação de assinatura cria um hash para o conteúdo do script do PowerShell que não inclui a assinatura. E o trema e os caracteres especiais são interpretados de forma diferente nos computadores cs-CZ e en-US. Nessa situação, ocorrerá uma incompatibilidade de hash.

Solução

Para fazer com que um script do PowerShell assinado seja executado independentemente das configurações de localidade, use um dos seguintes métodos:

  • Substitua ou remova todos os tremas e caracteres especiais como ö, ä e ü antes de assinar scripts do PowerShell.

  • Use a codificação UTF-16 LE BOM para scripts do PowerShell.

Mais informações

Para obter um exemplo (script codificado em UTF-8 com caractere especial "ä") que reproduz o problema, consulte as seguintes etapas:

  1. Você tem um computador com as seguintes configurações:

    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. No mesmo computador, crie um script do PowerShell Install.ps1 que contenha um caractere especial "ä" e assine o script.

    Observação

    Quando você executa o script assinado no mesmo computador, ele funciona sem problemas.

  3. Execute o mesmo script assinado em um computador que usa outra localidade do sistema. Por exemplo:

    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)
    

    O script falha com as seguintes mensagens:

    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  
    

Para obter mais informações sobre os scripts do PowerShell codificados de forma diferente, consulte:

Script do PowerShell codificado em ASCII Script do PowerShell codificado em UTF-8 Script do PowerShell codificado UTF-16 BE BOM Script do PowerShell codificado em BOM LE UTF-16 LE
Windows 10 Afetado com problema de incompatibilidade de HASH Afetado com problema de incompatibilidade de HASH n/a (Set-AuthenticodeSignature falha com UnknownError) NÃO afetado com problema de incompatibilidade de HASH
Windows 11 Afetado com problema de incompatibilidade de HASH Afetado com problema de incompatibilidade de HASH n/a (Set-AuthenticodeSignature falha com UnknownError) NÃO afetado com problema de incompatibilidade de HASH
Windows Server 2019 Afetado com problema de incompatibilidade de HASH Afetado com problema de incompatibilidade de HASH n/a (Set-AuthenticodeSignature falha com UnknownError) NÃO afetado com problema de incompatibilidade de HASH
Windows Server 2022 Afetado com problema de incompatibilidade de HASH Afetado com problema de incompatibilidade de HASH n/a (Set-AuthenticodeSignature falha com UnknownError) NÃO afetado com problema de incompatibilidade de HASH

Coleta de dados

Se você precisar de ajuda do suporte da Microsoft, recomendamos coletar as informações seguindo as etapas mencionadas em Coletar informações usando o TSS para problemas relacionados à Experiência do Usuário.