Как я могу отфильтровать сертификаты x509 по шаблону и сроку годности, чтобы оставить только свежие? - PullRequest
0 голосов
/ 12 июня 2018

Еще одна проблема с получением пользовательских сертификатов AD.Этот вопрос все о фильтрации выходных данных.У нас есть несколько шаблонов сертификатов для разных целей (смарт-карты, VPN и т. Д.), И время от времени сертификаты с истекшим сроком действия все еще существуют в AD.Как я могу отфильтровать список сертификатов каждого пользователя?Мне нужно оставить только последние сертификаты каждого шаблона .Пример запроса 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 для фильтрации результатов.Любая помощь?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вы можете сгруппировать объект по двум свойствам (Тема и Шаблон) с помощью Group-Object, отсортировать каждую группу по NotAfter и выбрать первый элемент.

$x | Group-Object -Property Subject, Template |
    ForEach-Object {
        $_.Group | 
        Sort-Object -Property NotAfter -Descending | 
        Select-Object -First 1
    }
0 голосов
/ 12 июня 2018

Я не проверял это, но если предположить, что вам нужны только сертификаты, у которых 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!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...