Найти и удалить дубликаты корневых сертификатов

1742
Andrew

Мы находимся в автономном домене и только что внедрили обновленные корневые сертификаты через групповую политику. Однако теперь я обнаружил, что в хранилище пользователей есть несколько дублированных корневых сертификатов (и еще много для моего, поскольку я периодически подключал свой ноутбук к сети).

Я ищу скрипт powershell, чтобы пройти через хранилище корневых сертификатов и удалить там все дубликаты.

Я получил это до сих пор:

$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} 

но тогда как удалить дубликаты потерял меня.

1
Вы проверили, что вы действительно нашли дубликаты? Mathias R. Jessen 8 лет назад 0

1 ответ на вопрос

0
Ritch Melton

Instead of updating a count based off the cert object you need to save off more information about the certificate during your iteration. I chose to create an additional map of thumbprints as keys and the cert objects as values. So the lookup is first by subject, and then by thumbprint.

I then remove the oldest certs and leave the newest.

$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 } } } }