powershell - 如何按模板和到期日期过滤 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
某种方式过滤结果。有什么帮助吗?
解决方案
我没有对此进行测试,但假设你的意思是你只想要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
!)。
推荐阅读
- docker - 远程 Docker 端口转发
- mainframe - 未收到预期的延续
- unit-testing - 如何在单元测试期间使用 vue-test-utils 和 jest 模拟 mixin?
- javascript - 页面加载后如何加载 Google Adsense?| 角 6
- c# - 如何在不和谐的 C# 中踢人
- asp.net-web-api - 添加迁移在 Visual Studio 2017 中不起作用
- c - 如何在 C 程序中鼓励未定义的行为/乱序执行?
- php - 得到警告 mysqli_fetch_assoc() 期望参数 1 是 mysqli_result,给定数组
- android - 从与 ViewPager 连接的片段获取数据到 Activity 的问题
- python - RecursionError:与进行二分搜索相比,超出了最大递归深度