使用Powershell删除过期的证书

使用Powershell删除过期的证书,powershell,certificate,ssl-certificate,x509certificate,client-certificates,Powershell,Certificate,Ssl Certificate,X509certificate,Client Certificates,我有一个简单的脚本来显示服务器上的所有证书,我想扩展该脚本,然后删除所有过期的证书 我已经尝试了MS和第三方的几个脚本,以找到一个删除证书的方法,但没有成功地使它们正常工作 我使用的第一个代码是: 获取子项证书:\-递归 此Powershell脚本显示服务器上的所有证书 下面是每个证书的输出示例。我想以NotAfter字段为目标,让脚本删除证书(如果它比今天的日期旧) 主题: 发行人: 指纹: FriendlyName: 不在此之前: 注: 扩展 我还希望对服务器列表执行此操作,让脚本在文本文档

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

我已经尝试了MS和第三方的几个脚本,以找到一个删除证书的方法,但没有成功地使它们正常工作

我使用的第一个代码是:

获取子项证书:\-递归

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

下面是每个证书的输出示例。我想以NotAfter字段为目标,让脚本删除证书(如果它比今天的日期旧)

主题: 发行人: 指纹: FriendlyName: 不在此之前: 注: 扩展

我还希望对服务器列表执行此操作,让脚本在文本文档中的每台服务器上运行,查询所有证书,然后删除过期的证书并移动到下一台服务器

我见过一些针对日期的代码,如下所示:

ForEach对象-开始{$now=get date}-处理{if($PSItem.NotAfter-lt$now){$PSItem}}}删除项


我想让脚本出去查询一个服务器证书,然后删除过期的证书

你想要的就是这个。这对你来说应该很合适。你的逻辑很接近,只是执行似乎有点不对劲

$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证书。很好。此后,我编辑了答案,以确保只返回
\My
证书。这对证书\个人\证书非常有效,如果我想在其他文件夹(如受信任的根证书颁发机构或其他任何文件夹)中执行相同操作,我将使用什么名称来代替我的证书,是否有一个列表,其中包含每个脚本的名称,我可以将其添加到脚本中?感谢您抽出时间回答我的问题,并分享您的知识,我非常感谢it@aztech我已经添加了一个一行程序,可以让您获得证书商店的名称。非常好用,谢谢。最后一个问题是,如果我想对文本文件上列出的一组服务器运行脚本,我该如何做呢?因为它已经有一个foreach语句在其中,我不知道在哪里放置另一个foreach语句