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.