Public/Connect-DPATarget.ps1

# .ExternalHelp IdentityCommand.DPA-help.xml
function Connect-DPATarget {
    [CmdletBinding()]
    param(
        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'DPA-RDP'
        )]
        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-RDP'
        )]
        [switch]$RDP,

        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'DPA-SSH'
        )]
        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-SSH'
        )]
        [switch]$SSH,

        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'DPA-SSH'
        )]
        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-SSH'
        )]
        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'DPA-RDP'
        )]
        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-RDP'
        )]
        [String]$targetAddress,

        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-SSH'
        )]
        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-RDP'
        )]
        [String]$targetUser,

        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-SSH'
        )]
        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'DPA-RDP'
        )]
        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-RDP'
        )]
        [String]$targetDomain,

        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-SSH'
        )]
        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-RDP'
        )]
        [String]$logicalName,

        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $true,
            ParameterSetName = 'Vaulted-RDP'
        )]
        [bool]$elevatedPrivileges

    )

    BEGIN {
        $Properties = @{}
    }#begin

    PROCESS {

        $URI = "$($ISPSSSession.tenant_url)/api/adb/sso/acquire"

        switch ($PSCmdlet.ParameterSetName) {
            { $PSItem -match 'RDP$' } {
                #Get request parameters
                $boundParameters = $PSBoundParameters | Get-Parameter -ParametersToRemove RDP

                #Create Request Object
                $Properties.Add('service', 'DPA-RDP')
                $Properties.Add('tokenResponseFormat', 'extended')
                $Properties.Add('tokenType', 'rdp_file')
                $Properties.Add('tokenParameters', $boundParameters)

                switch ($boundParameters.keys) {
                    #values for RDP filename
                    'targetAddress' {
                        $name_address = " _a $targetAddress"
                    }
                    'targetDomain' {
                        $name_domain = " _d $targetDomain"
                    }
                }

                #Create body
                $body = $Properties | ConvertTo-Json

                #Send request
                $result = Invoke-IDRestMethod -Uri $URI -Method POST -Body $body

                break
            }

            { $PSItem -match 'SSH$' } {
                #Get session data for username and url
                $SessionData = Get-DPAModuleData
                $URI = [System.Uri]$SessionData.tenant_url
                $UserName = $((Get-DPAModuleData).user)
                #get subdomain & SSH GW address from URI host
                $Subdomain = $($URI.Host.Split('.')[0])
                $SSHGateway = $($URI.Host.Replace('dpa', 'ssh'))

                #Build connection string elements if parameters provided
                switch ($PSBoundParameters) {
                    ( { $PSItem.ContainsKey('targetUser') }) {
                        $ConnectAsUser = "@$targetUser"
                    }
                    ( { $PSItem.ContainsKey('targetDomain') }) {
                        $ConnectAsDomain = "`#$targetDomain"
                    }
                    ( { $PSItem.ContainsKey('logicalName') }) {
                        $logicalNetwork = "`#$logicalName"
                    }
                }

                #build connection string for ZSP & vaulted credential ssh access
                $ConnectionString = "$UserName`#$Subdomain$ConnectAsUser$ConnectAsDomain@$targetAddress$logicalNetwork@$SSHGateway"

                Write-Debug $ConnectionString

                $result = $ConnectionString
                break
            }

        }

        if ($null -ne $result) {
            switch ($PSCmdlet.ParameterSetName) {
                { $PSItem -match 'RDP$' } {
                    #invoke an rdp connection using rdp file saved to temp directory
                    $Path = [System.IO.Path]::GetTempPath()
                    $FileName = "dpa$name_address$name_domain.rdp"
                    $FilePath = Join-Path $Path $FileName
                    $RDPFileContents = $result.token.text
                    try {
                        Set-Content -Value $RDPFileContents -Path $FilePath -Force -ErrorAction Stop
                        Get-Item -Path $FilePath -ErrorAction Stop | Invoke-Item
                    } catch {
                        throw $PSItem
                    }
                    break
                }

                { $PSItem -match 'SSH$' } {
                    #invoke ssh session using constructed connection string
                    ssh $result
                    break
                }
            }

        }

    }#process

    END { }#end

}