查找并删除重复的根证书

查找并删除重复的根证书

我们处于一个断开连接的域中,刚刚通过组策略实施了更新的根证书。不过,我现在发现,用户存储中有许多重复的根证书(我的根证书还有很多,因为我偶尔会将笔记本电脑上网)。

我正在寻找一个 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
                }
            }
    }
}

相关内容