Zertifikate von Remote Computern auslesen

Mit folgendem Skript ist es möglich, für  Remote Computer den Status der installierten Zertifikate auszulesen.

param ( [Parameter(ValuefromPipeLinebyPropertyName=$true)]
 [Alias("Name")]
 [String]$ComputerName=$env:computername
 )
 begin {
 # Funktion, die das Ausgabeobjekt erstellt
 function getNewObject {
   param  ([String]$Computename,
   [System.Security.Cryptography.X509Certificates.X509Certificate]$cert
   )
   $obj = new-object -typeName PsObject -property @{
        computername = $Computername
        thumbprint = $NULL
        serialNumber = $NULL
        notbefore = $NULL
        notAfter   = $NULL
        subject    = $NULL
        issuer    = $NULL
        KeyUsage   = $NULL
        Domains    = $NULL
        hasPrivatekey = $false
        friendlyName = $NULL
        message = $NULL
        isvalid  = $false
        ExpiresInDays = 0
    }
    if ($cert) {
        $isValid = (($cert.NotBefore -le (get-date)) -and ((get-date) -le ($cert.NotAfter)))
        $ExpiresInDays = new-timespan (get-Date) $cert.notafter
        $obj.Thumbprint = $cert.Thumbprint
        $obj.notbefore  = $Cert.Notbefore
        $obj.notafter  = $Cert.Notafter
        $obj.subject   = $Cert.Subject
        $obj.issuer    = $cert.IssuerName.Name
        $obj.keyUsage  = [System.String]::join(",",$cert.enhancedKeyUsagelist)
        $obj.Domains  = [System.String]::join(",",$cert.DNSNameList)
        $obj.SerialNumber = $cert.SerialNumber
        $obj.friendlyName = $Cert.FriendlyName
        $obj.hasPrivatekey = $cert.hasPrivateKey
        $obj.IsValid = $isValid
        $obj.expiresinDays = $ExpiresInDays.Days
     }
     return $obj
 } # EOF GetNewObject
 #  Store und Name 
    [System.Security.Cryptography.X509Certificates.StoreName]$StoreName = 'My'
    [System.Security.Cryptography.X509Certificates.StoreLocation]$StoreLocation  = 'LocalMachine'
 } # EOF Begin
 process {
    try {
       $CertStore = new-object System.Security.Cryptography.X509Certificates.X509Store -ArgumentList "\\$($ComputerName)\$($StoreName)", $Storelocation
       $Flags = [System.Security.Cryptography.X509Certificates.OpenFlags]'ReadOnly'
       $CertStore.Open($Flags) | out-null
    } catch {
       $obj = getNewObject -computerName $Computername
       $obj.Message = $_.tostring() # fetch error
       return $obj
    }
    foreach ($certificate in $certStore.Certificates) {
       $obj = getNewObject -computername $Computername -cert $Certificate
       write-output $obj
    }
 } # end Process
 end {} 

Aufruf für einen oder mehrere Computer:

.\getcerts.ps1 –computername Server01 # für alle Coputer in einer Active Directory  Domain Get-adcomputer –filter * | select name | .\getcerts.ps1

Das Skript erstellt je Zertifikat ein Objekt, das die wichtigsten Angaben zu einem Zertifikat enthält, um dessen Gültigkeit und die Notwendigkeit einer möglichen Erneuerung beurteilen zu können. Das Attribut isvalid gibt an, ob das Zertifikate noch gültig ist, ExpiresInDays gibt die Anzahl der Tage an, die das Zertifikat noch gültig ist.

Aus der Ausgabe des Skripts lässt sich mit einfachen Mitteln eine Datei erstellen, die für jeden Computer eine Liste der installierten Zertifikate und deren Ablaufdatum angibt. Dabei interessieren der Computername, das Ablauflaufdatum, der Fingerabdruck (thumbprint), die ausstellende Zertifizierungsstelle, der verwendete Subjekt, ob das Zertifikat noch gültig ist und wie lange es noch gültig ist:

Get-adcomputer –filter * | select name | .\getcerts.ps1 | select computername,thumbprint,notafter,issuer,subject,isvalid,ExpiresInDays | export-csv certificates.csv –delimiter ";" –encoding UTF8 -notypeInformation

Mit anderen Auswahlen aus dem Active Directory oder z.B. eine Eingabelist in Form einer Textdatei lassen sich die zu überprüfenden Rechner gezielt auswählen.
 

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on pinterest
Pinterest
Share on email
Email

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Scroll to Top