首页 > 解决方案 > 如何按模板和到期日期过滤 x509 证书以仅保留新证书?

问题描述

获取用户 AD 证书的另一个问题。这个问题都是关于过滤输出数据的。我们有几个用于不同目的的证书模板(智能卡、VPN 等),并且在 AD 中仍然存在按时间过期的证书。如何过滤每个用户的证书列表?我只需要留下每个模板的最新证书。广告请求示例:

$user = Get-ADUser username -Properties "Certificates"
$Cert = $user.certificates | foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_} | select @{n='Fullname';e={$_.subject -replace '^.*?CN=|,.*$'}}, @{n='subject';e={$_.subject -replace '^CN=|^E=|,.*$'}}, Notafter, thumbprint, @{N="Template";E={($_.Extensions | 
            ?{$_.oid.Friendlyname -match "Certificate Template Information|Certificate Template Name"}).Format(0) `
                -replace "(.+)?=(.+)\((.+)?", '$2'}}

$Cert

输出为 3 个证书,例如:

Fullname   : Full User Name
subject    : subject@domain.com
NotAfter   : 30.05.2019 11:25:45
Thumbprint : hash_1
Template   : temaplate_1

Fullname   : Full User Name
subject    : subject@domain.com
NotAfter   : 02.04.2019 16:56:24
Thumbprint : hash_2
Template   : **template_2**

Fullname   : Full User Name
subject    : subject@domain.com
NotAfter   : 16.05.2018 14:54:22
Thumbprint : hash_3
Template   : **template_2**

如何过滤我的输出以仅保留每个模板的最新证书,例如。hash_1 和 hash_2?

组对象看起来不错,但我该如何继续

$Cert | Group-Object subject | fl


Name   : subject@domain.com
Count  : 3
Group  : {@{Fullname=Full User Name; subject=subject@domain.com; NotAfter=30.05.2019 11:25:45; Thumbprint=hash_1; Template=temaplate_1}, @{Fullname=Full User Name; subject=subject@domain.com; NotAfter=02.04.2019 16:56:24; Thumbprint=hash_2; Template=template_2}, @{Fullname=Full User Name; subject=subject@domain.com; NotAfter=16.05.2018 14:54:22; Thumbprint=hash_3; Template=template_2}}
Values : {subject@domain.com}

我认为可以使用Where-Object某种方式过滤结果。有什么帮助吗?

标签: powershell

解决方案


我没有对此进行测试,但假设你的意思是你只想要NotAfter没有过去的证书,那么这应该会有所帮助:

(Get-ADUser username -Properties "Certificates").certificates |
    ForEach-Object {
        New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_
    } | Select-Object @{n='Fullname';e={$_.subject -replace '^.*?CN=|,.*$'}}, 
                      @{n='subject';e={$_.subject -replace '^CN=|^E=|,.*$'}}, 
                      Notafter, 
                      thumbprint,
                      @{N="Template";E={($_.Extensions | 
                            Where-Object {$_.oid.Friendlyname -match "Certificate Template Information|Certificate Template Name"}).Format(0) -replace "(.+)?=(.+)\((.+)?", '$2'}} |
            Where-Object {[DateTime]::Parse($_, (New-Object CultureInfo("en-GB", $false))) -lt [DateTime]::Now}

[DateTime]::Parse()没有直接工作,因为它假设了美国文化,所以我强迫它采用不同的文化。您可以改为将其更改为您自己的文化(除非它是en-US!)。


推荐阅读