使用Powershell删除过期的证书

时间:2019-05-15 00:52:38

标签: powershell certificate ssl-certificate x509certificate client-certificates

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

我尝试过MS和第3方提供的一些脚本来查找删除证书,但运气不好,无法正常工作

我使用的第一个代码是:

Get-ChildItem证书:\-递归

此Powershell脚本显示服务器上的所有证书。

下面是每个证书的示例输出。我要定位到NotAfter字段并拥有脚本,然后删除证书(如果证书的日期比今天的日期晚)

主题: 发行人: 指纹: 友好名称: 之前没有: NotAfter: 扩展程序

我还想对服务器列表执行此操作,使脚本在文本文档中的每个服务器上运行,查询所有证书,然后删除已过期的证书,然后移至下一个服务器。

我已经看到一些针对日期的代码,如下所示:

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

我希望脚本退出并查询服务器证书,然后删除过期的证书

1 个答案:

答案 0 :(得分:1)

您所追求的是这个。这应该为您完美地工作。您在逻辑上很亲密,只是执行似乎有些偏离。

$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