Найти и удалить дубликаты корневых сертификатов
Мы находимся в автономном домене и только что внедрили обновленные корневые сертификаты через групповую политику. Однако теперь я обнаружил, что в хранилище пользователей есть несколько дублированных корневых сертификатов (и еще много для моего, поскольку я время от времени подключал свой ноутбук к сети).
Я ищу скрипт 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 ответ
Вместо того, чтобы обновлять счет на основе объекта сертификата, вам нужно сохранить больше информации о сертификате во время итерации. Я решил создать дополнительную карту отпечатков пальцев в качестве ключей и объекты сертификатов в качестве значений. Таким образом, поиск сначала по предмету, а затем по отпечатку пальца.
Затем я удаляю самые старые сертификаты и оставляю самые новые.
$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]"${Value.GetDateTimeString()}" -Descending |
Select-Object -ExpandProperty Value -Skip 1 |
ForEach-Object {
if (Test-Path $_.PSPath) {
Remove-Item -Path $_.PSPath -DeleteKey
}
}
}
}