2

Я использую signtool для подписи моих файлов msi и setup.exe.Как определить, является ли msi временной отметкой или нет?

Временная ошибка не удалась для большинства msi. Теперь я хотел бы отметить их отдельно.

Как определить, отсутствует ли временная метка или нет?

После командлета помогает мне найти ли он подписан или нет

$AuthStatus= (Get-AuthenticodeSignature $FILENAME) 

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

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

Теперь мне нужно проверить, является ли временная метка MSI отсутствует или нет, как это сделать?

+1

Что вы подразумеваете под "Timestamping"? Какое свойство Get-AuthenticodeSignature сопоставляется? –

+0

@Shay Levy: В Signtool.exe мы подпишем и отметьте метку времени. [Если msi подписан] Если мы щелкнем правой кнопкой мыши по msi и увидим свойства, у него появится вкладка под названием «Цифровая подпись». Если вы нажмете на вкладке «Цифровая подпись», у нее будет столбец времени. Теперь он пуст для меня. У меня нет точного свойства, которое соответствует этому. – Samselvaprabu

+0

См. Это [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, предоставленное PowerShell MVP Vadims Podans. Get-AuthenticodeSignatureEx добавляет свойство SigningTime к результату, значение - это время как обобщенное время (а не локальное время), вы всегда можете вызвать ToLocalTime() для объекта datetime, чтобы получить результат в вашем часовом поясе. Вы можете использовать следующую команду, чтобы быстро протестировать его:

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 
      } 
     }  
    } 
} 
Смежные вопросы