Suchen und löschen Sie doppelte Stammzertifikate

1890
Andrew

Wir befinden uns in einer getrennten Domäne und haben gerade aktualisierte Stammzertifikate über Gruppenrichtlinien implementiert. Ich habe jetzt jedoch festgestellt, dass es im User Store eine Reihe doppelter Stammzertifikate gibt (und viele mehr für meinen, da ich meinen Laptop gelegentlich online gestellt habe).

Ich suche nach einem Powershell-Skript, das den Stammzertifikatspeicher durchläuft und etwaige Duplikate darin löscht.

Ich habe das bis jetzt bekommen:

$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("Root","LocalMachine") $store.Open("ReadWrite") $rootcerts = Get-Childitem 'cert:\LocalMachine\root' -Recurse $ht = @{} $rootcerts | foreach {$ht["$_"] += 1} $duplicates = $ht.keys | where {$ht["$_"] -gt 1} 

aber dann, wie man die Duplikate löscht, hat mich verloren.

1
Haben Sie überprüft, ob Sie tatsächlich Duplikate finden? Mathias R. Jessen vor 8 Jahren 0

1 Antwort auf die Frage

0
Ritch Melton

Anstatt eine Zählung basierend auf dem cert-Objekt zu aktualisieren, müssen Sie während der Iteration weitere Informationen zum Zertifikat speichern. Ich entschied mich dafür, eine zusätzliche Karte mit Fingerabdrücken als Schlüssel und die cert-Objekte als Werte zu erstellen. Die Suche erfolgt also zunächst nach Betreff und dann nach Fingerabdruck.

Ich entferne dann die ältesten Zertifikate und lasse das neueste zurück.

$ht = @{} Get-ChildItem -Recurse Cert:\LocalMachine\My | Where-Object { $_.Issuer -like "*MyIssuer*" } | ForEach-Object { $subject = $_.Subject if (!$ht.ContainsKey($subject)) { $ht[$subject] = @{} } $ht[$subject]["$($_.Thumbprint)"] = $_ }  $ht.Keys | ForEach-Object { $dupes = ($ht[$_] | Where-Object { $_.Count -gt 1 }) if ($dupes) { $dupes.GetEnumerator() | Sort-Object [DateTime]"$" -Descending | Select-Object -ExpandProperty Value -Skip 1 | ForEach-Object { if (Test-Path $_.PSPath) { Remove-Item -Path $_.PSPath -DeleteKey } } } }