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