簡體   English   中英

如何按模板和到期日期過濾x509證書,僅保留新證書?

[英]How can I filter x509 certificates by template and expiration date to leave only fresh ones?

獲取用戶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過濾結果。 有什么幫助嗎?

我還沒有測試過,但是假設您的意思是您只想要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 !)。

您可以使用Group-Object通過兩個屬性(Subject和Template) Group-Object進行分組, NotAfter對每個組進行排序,然后選擇第一個元素。

$x | Group-Object -Property Subject, Template |
    ForEach-Object {
        $_.Group | 
        Sort-Object -Property NotAfter -Descending | 
        Select-Object -First 1
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM