Доброго вам дня.
Пишу небольшой командлет для себя, который будет запрашивать сертификаты от имени пользователя (On Behalf Of) у центра сертификации AD CS. Хочу реализовать функционал передачу ему параметра "имя пользователя" по конвейеру объектом ADUser, при этом сохранив возможность указания и простого имени пользователя строкой.
Сейчас это сделано так:
function Enroll-OnBehalfOf() {
[CmdLetBinding()]
Param (
[Parameter(Position=0)][string]$Identity,
[Parameter(ValueFromPipeline)][Microsoft.ActiveDirectory.Management.ADUser]$Users,
[ValidateSet('OnBehalfofDirectumUserSignatureandEncrypt2003')][Parameter(Mandatory=$True)][string]$TemplateName
)
PROCESS {
if ($Identity.Length -eq 0) {
$SamAccountName = $Users.SamAccountName
} else {
$SamAccountName = $Identity
}
# Получаем объект сертификата Request Agent, который нужно предварительно себе выдать (шаблон "Агент подачи заявок" или "Enrollment Agent")
$signer = New-Object -ComObject X509Enrollment.CSignerCertificate
$cert = Get-ChildItem -Path "Cert:\CurrentUser\My" | Where-Object {$_.Extensions | Where-Object {($_.Oid.Value -eq "2.5.29.37") -and ($_.EnhancedKeyUsages["1.3.6.1.4.1.311.20.2.1"])}}
# Справка по Intialize https://msdn.microsoft.com/en-us/library/aa377669(v=vs.85).aspx
if ($cert) {
$signer.Initialize(0, 0, 0xc, $cert.Thumbprint)
} else {
Write-Host "У вас нет сертификата 'Агента подачи заявок'"
break
}
# Создаем запрос нового сертификата
$pkcs10 = New-Object -ComObject X509Enrollment.CX509CertificateRequestPkcs10
# Используем шаблон "OnBehalfofDirectumUserSignatureandEncrypt2003"
$pkcs10.InitializeFromTemplateName(0x1, $TemplateName)
$pkcs10.Encode()
# Упаковка в PKCS7 (судя по всему, от имени можно запросить только так)
$pkcs7 = New-Object -ComObject X509enrollment.CX509CertificateRequestPkcs7
$pkcs7.InitializeFromInnerRequest($pkcs10)
$pkcs7.RequesterName = "$env:USERDOMAIN\$($SamAccountName)"
$pkcs7.SignerCertificate = $signer
$Request = New-Object -ComObject X509Enrollment.CX509Enrollment
$Request.InitializeFromRequest($pkcs7)
$Request.Enroll()
}
}
Работает как надо, но мне хочется оставить один параметр Identity, но чтобы он мог принимать объекты ADUser и отказаться от куска:
if ($Identity.Length -eq 0) {
$SamAccountName = $Users.SamAccountName
} else {
$SamAccountName = $Identity
}