2

signtoolを使用してmsiファイルとsetup.exeファイルに署名しています。msiがタイムスタンプされているかどうかを調べるにはどうすればよいですか?

msiのほとんどでタイムスタンプが失敗しました。今は別々にタイムスタンプしたいと思います。

タイムスタンプがないかどうかを確認する方法はありますか?コマンドレット後

は、私は、どのようにそれを行うには、MSIのタイムスタンプが欠落しているかいないかどうかを確認する必要が今

$AuthStatus= (Get-AuthenticodeSignature $FILENAME) 

    If ($AuthStatus.status -ne "Valid") { 

       $SIGNTOOL sign /v /f $CERPFX /t $TimestampSRVR /p $PWD $FILENAME 
     } 

を、それが署名されているかどうかを見つけるために私を助けたりしませんか?

+1

「タイムスタンプ」とはどういう意味ですか? Get-AuthenticodeSignatureのどのプロパティにマップされていますか? –

+0

@Shay Levy:Signtool.exeでは、署名とタイムスタンプを行います。 [msiが署名されている場合] msiを右クリックしてプロパティを表示すると、「デジタル署名」というタブが表示されます。 [デジタル署名]タブをクリックすると、タイムスタンプの列が表示されます。今は私のために空です。私はこれに匹敵する正確な財産ではありません。 – Samselvaprabu

+0

タイムスタンプがあるかどうかを判断するための1つの可能なアプローチについては、この[SO post](http://stackoverflow.com/questions/3281057/get-timestamp-from-authenticode-signed-files-in-net)を参照してください。 –

答えて

1

最後に私は自分で答えを見つけました。 "TimeStamperCertificate"という名前のプロパティがあります。以下はコードスニペットです。

msiが署名されていないかタイムスタンプが設定されていると、署名とタイムスタンプが再度行われます。

$MsiAuthInfo= (Get-AuthenticodeSignature $FILENAME) 

    If ($MsiAuthInfo.status -ne "Valid" -or $MsiAuthInfo.TimeStamperCertificate -eq $Null) { 

       $SIGNTOOL sign /v /f $CERPFX /t $TimestampSRVR /p $PWD $FILENAME 
     } 
1

ここでPowerShellのMVP Vadims PodansのPowerShellのソリューションの礼儀です。 Get-AuthenticodeSignatureExは結果にSigningTimeプロパティを追加します。値は一般時間(ローカル時間ではありません)としての日時であり、datetimeオブジェクトのToLocalTime()を呼び出してタイムゾーンで結果を得ることができます。次のコマンドを使用すると、すぐにテストできます。

dir $pshome\*.ps1xml | Get-AuthenticodeSignatureEx | ft SignerCertificate,Status,SigningTime,Path 


function Get-AuthenticodeSignatureEx 
{ 
    [CmdletBinding()] 

    param(
     [Parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] 
     [String[]]$FilePath 
    ) 

    begin 
    { 
     $signature = @" 
     [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool CryptQueryObject(
      int dwObjectType, 
      [MarshalAs(UnmanagedType.LPWStr)]string pvObject, 
      int dwExpectedContentTypeFlags, 
      int dwExpectedFormatTypeFlags, 
      int dwFlags, 
      ref int pdwMsgAndCertEncodingType, 
      ref int pdwContentType, 
      ref int pdwFormatType, 
      ref IntPtr phCertStore, 
      ref IntPtr phMsg, 
      ref IntPtr ppvContext 
     ); 
     [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool CryptMsgGetParam(
      IntPtr hCryptMsg, 
      int dwParamType, 
      int dwIndex, 
      byte[] pvData, 
      ref int pcbData 
     ); 
     [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool CryptMsgClose(
      IntPtr hCryptMsg 
     ); 
     [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool CertCloseStore(
      IntPtr hCertStore, 
      int dwFlags 
     ); 
"@ 
     Add-Type -AssemblyName System.Security 
     Add-Type -MemberDefinition $signature -Namespace PKI -Name Crypt32 
    } 

    process 
    { 
     Get-AuthenticodeSignature @PSBoundParameters | ForEach-Object { 
      $Output = $_ 
      if ($Output.SignerCertificate -ne $null) { 
       $pdwMsgAndCertEncodingType = 0 
       $pdwContentType = 0 
       $pdwFormatType = 0 
       [IntPtr]$phCertStore = [IntPtr]::Zero 
       [IntPtr]$phMsg = [IntPtr]::Zero 
       [IntPtr]$ppvContext = [IntPtr]::Zero 
       $return = [PKI.Crypt32]::CryptQueryObject(
        1, 
        $_.Path, 
        16382, 
        14, 
        $null, 
        [ref]$pdwMsgAndCertEncodingType, 
        [ref]$pdwContentType, 
        [ref]$pdwFormatType, 
        [ref]$phCertStore, 
        [ref]$phMsg, 
        [ref]$ppvContext 
       ) 

       $pcbData = 0 
       $return = [PKI.Crypt32]::CryptMsgGetParam($phMsg,29,0,$null,[ref]$pcbData) 
       $pvData = New-Object byte[] -ArgumentList $pcbData 
       $return = [PKI.Crypt32]::CryptMsgGetParam($phMsg,29,0,$pvData,[ref]$pcbData) 
       $SignedCms = New-Object Security.Cryptography.Pkcs.SignedCms 
       $SignedCms.Decode($pvData) 
       foreach ($Infos in $SignedCms.SignerInfos) { 
        foreach ($CounterSignerInfos in $Infos.CounterSignerInfos) { 
         $sTime = ($CounterSignerInfos.SignedAttributes | Where-Object {$_.Oid.Value -eq "1.2.840.113549.1.9.5"}).Values | Where-Object {$_.SigningTime -ne $null} 
        } 
       } 
       $Output | Add-Member -MemberType NoteProperty -Name SigningTime -Value $sTime.SigningTime -PassThru -Force 
       [void][PKI.Crypt32]::CryptMsgClose($phMsg) 
       [void][PKI.Crypt32]::CertCloseStore($phCertStore,0) 
      } else { 
       $Output 
      } 
     }  
    } 
} 
関連する問題