Я совсем новичок в Powershell, и проблема в том, что я немного не понимаю, как искать различные свойства, и мне трудно найти примеры, соответствующие моим потребностям.
С учетом сказанного мне нужно выполнить поиск в Active Directory, чтобы найти пользовательские сертификаты S/MIME, срок действия которых истекает, выданные определенным центром сертификации.
Что у меня уже есть:
$Mail = [email protected]
$allProfileCerts = Get-ADUser -Server example.com:3268 -Filter {EmailAddress -eq $Mail} -Properties Certificates | select Certificates
Результат:
Handle Issuer Subject
------ ------ -------
1625625266096 CN=<CA1> [email protected], CN=Test User, OU=Normal, OU=Users, OU=EXAMPLE, ...
1625625265968 CN=<CA2> [email protected], CN=Test User, O=Example Company, ...
1625625271728 CN=<CA1> CN=Test User, OU=Normal, OU=Users, OU=EXAMPLE, ...
Я подумал, что следующим шагом может быть:
$allProfileCerts.Certificates | foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_}
Результаты содержат более подробную информацию (отредактировано для удаления PII):
EnhancedKeyUsageList : {Secure Email (1.3.6.1.5.5.7.3.4)}
DnsNameList : {Test User}
SendAsTrustedIssuer : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId :
Archived : False
Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...}
FriendlyName :
IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter : 29/05/2021 10:47:00
NotBefore : 11/12/2018 09:47:00
HasPrivateKey : False
PrivateKey :
PublicKey : System.Security.Cryptography.X509Certificates.PublicKey
RawData : {48, 130, 8, 51...}
SerialNumber : <snip>
SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm : System.Security.Cryptography.Oid
Thumbprint : <snip>
Version : 3
Handle : 1625625266096
Issuer : <ISSUER1>
Subject : <subject>
EnhancedKeyUsageList : {Secure Email (1.3.6.1.5.5.7.3.4)}
DnsNameList : {Test User}
SendAsTrustedIssuer : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId :
Archived : False
Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...}
FriendlyName :
IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter : 30/08/2020 14:00:00
NotBefore : 30/08/2018 02:00:00
HasPrivateKey : False
PrivateKey :
PublicKey : System.Security.Cryptography.X509Certificates.PublicKey
RawData : {48, 130, 5, 127...}
SerialNumber : <snip>
SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm : System.Security.Cryptography.Oid
Thumbprint : <snip>
Version : 3
Handle : 1625625265968
Issuer : <ISSUER2>
Subject : <subject>
EnhancedKeyUsageList : {Encrypting File System (1.3.6.1.4.1.311.10.3.4)}
DnsNameList : {Test User}
SendAsTrustedIssuer : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId :
Archived : False
Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...}
FriendlyName :
IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter : 09/04/2020 15:57:37
NotBefore : 22/10/2017 15:57:37
HasPrivateKey : False
PrivateKey :
PublicKey : System.Security.Cryptography.X509Certificates.PublicKey
RawData : {48, 130, 8, 4...}
SerialNumber : <snip>
SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm : System.Security.Cryptography.Oid
Thumbprint : <snip>
Version : 3
Handle : 1625625271728
Issuer : <ISSUER1>
Subject : <subject>
Я также понял, что могу легко фильтровать по дате, используя Where-Object NotAfter...
(поправьте меня, если я ошибаюсь в этом :)), но ради любви к миру я не могу понять, как фильтровать EnhancedKeyUsageList : {Secure Email (1.3.6.1.5.5.7.3.4)}
. Я думаю, что это массив (в любом данном сертификате может быть более одного EKU), но как я могу фильтровать по элементам массива?
Бонусный вопрос: если у меня есть:
$oneCert = $allProfileCerts.Certificates | foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_} | Where-Object SerialNumber -Match "<SN>"
Как мне тогда получить доступ к полю «NotAfter»? Пробовал $oneCert."NotAfter"
, $oneCert["NotAfter"]
, $oneCert | % NotAfter
, $oneCert | select -expandproperty "NotAfter"
- не работает :/
РЕДАКТИРОВАТЬ: код, который работает, на основе предложения @tomalak:
Get-ADUser -Server $Server -Filter {EmailAddress -eq $Mail} -Property Certificates |
ForEach-Object {
# ...we have "user" objects here
Write-Host $_
$_.Certificates |
foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_} |
Where-Object {
$_.EnhancedKeyUsageList.FriendlyName -eq "Secure Email"
}
} |
ForEach-Object {
# ...we have "certificate" objects here
Write-Host $_.Issuer
}
EnhancedKeyUsageList
, я не знаю, почему. 19.03.2019