使用PowerShell删除过期证书

5

我有一个简单的脚本来显示服务器上的所有证书,我想将该脚本扩展为然后删除所有过期的证书

我尝试了几个来自MS和第三方的脚本来查找和删除证书,但它们在使用时都没有成功

我正在使用的第一个代码是:

Get-ChildItem Cert:\ -Recurse

这个PowerShell脚本会显示服务器上的所有证书。

以下是每个证书的示例输出。 我想针对NotAfter字段,并使脚本删除早于今天日期的证书。

主题: 颁发者: Thumbprint: 友好名称: NotBefore: NotAfter: 扩展

我还希望对一组服务器执行此操作,让脚本在文本文档中的每个服务器上运行,查询所有证书,然后删除已过期的证书并继续处理下一个服务器。

我看到了一些目标日期的代码,如下所示:

ForEach-Object -begin { $now = get-date } -process { if ($PSItem.NotAfter -lt $now ) { $PSItem } } | Remove-Item

我希望脚本能够查询服务器的证书,然后删除已过期的证书。

2个回答

7
您需要的是这个。这对您来说应该完美地起作用。您的逻辑已经接近,只是执行似乎有点偏差。
$ListOfServers = Get-Content "c:\temp\serv.txt"

Foreach($Server in $ListOfServers) {
    Invoke-Command -ComputerName $Server -ScriptBlock {
        # Get Certificate list and assign to a variable
        $Certs = Get-ChildItem "Cert:\LocalMachine\My" -Recurse

        # Loop through each object in $Certs
        Foreach($Cert in $Certs) {
            # If The objects property "NotAfter" is older than the current time, delete
            If($Cert.NotAfter -lt (Get-Date)) {
                $Cert | Remove-Item
            }
        }
    }
}

根据评论编辑,防止意外破坏所有证书。

获取所有证书存储位置的列表。

(Get-ChildItem -Path "Cert:" -Recurse `
    | Where-Object {($_).GetType().Name -eq 'X509Store'}).Name

请注意,您不应在个人(我的)证书存储之外执行脚本。操作系统需要一些已过期的CA证书。 - Crypt32
好的,我已经编辑了答案以确保只返回\My证书。 - Drew
@aztech 我添加了一行代码,可以让你获取证书存储的名称。 - Drew
非常完美,谢谢。最后一个问题,如果我想对文本文件中列出的一组服务器运行脚本,我该怎么做,因为它已经有一个foreach语句了,我不确定在哪里放置另一个foreach语句。 - aztech
@crypt32,您提到不要在MY位置运行此程序,而操作系统仍需要一些过期的证书,这些过期的证书是否在特定存储中?我应该在哪里找到它们?我是为了自己的学习而问。 - aztech
显示剩余4条评论

0

function Remove-expired-personal-certs { Get-ChildItem Cert:\CurrentUser\My | ForEach-Object {if ($.NotAfter -lt (Get-Date)) {Remove-Item -LiteralPath $.pspath }} }


根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接