次の方法で共有


署名された 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 コンピューターでスクリプトに署名すると、署名プロセスによって、en-US コードを使用して、ウムラウトと特殊文字のデジタル署名が作成されます。 cs-CZ コンピューターで署名済みスクリプトを実行すると、ASCII または UTF-8 の ö、ä、ü などのウムラウト文字と特殊文字が en-US コンピューターと cs-CZ コンピューターでエンコードが異なるため、署名の検証は失敗します。

署名検証プロセスでは、署名を含まない PowerShell スクリプト コンテンツのハッシュが作成されます。 また、ウムラウトと特殊文字は、cs-CZ と en-US コンピューターでは解釈が異なります。 この状況では、ハッシュの不一致が発生します。

解決方法

署名された PowerShell スクリプトをロケール設定とは別に実行するには、次のいずれかの方法を使用します。

  • PowerShell スクリプトに署名する前に、ö、ä、ü などのすべてのウムラウト文字と特殊文字を置換または削除します。

  • 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 を作成し、スクリプト 署名します

    Note

    署名されたスクリプトを同じコンピューターで実行すると、問題なく動作します。

  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 を使用して、 Gather 情報に記載されている手順に従って情報を収集することをお勧めします