[英]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.