Как использовать передачу параметров конвейером в PowerShell?

Доброго вам дня.
Пишу небольшой командлет для себя, который будет запрашивать сертификаты от имени пользователя (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
        }
  • Вопрос задан
  • 537 просмотров
Пригласить эксперта
Ответы на вопрос 1
[CmdLetBinding()]
Param (
    [Parameter(Position = 0)][string]$Identity = $User.Name,
    [Parameter(ValueFromPipeline, Mandatory)]$User
)

Write-Output $Identity


Вывод:
PS C:\> $User = @{}
PS C:\> $User.Name = 'Hal9000'
PS C:\> C:\Temp\test.ps1 -User $User
Hal9000
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы