Functions/Connections/New-PASPSMSession.ps1
# .ExternalHelp psPAS-help.xml function New-PASPSMSession { [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'PSMConnectPrerequisites', Justification = "False Positive")] [CmdletBinding(SupportsShouldProcess)] [Alias("Get-PASPSMConnectionParameter")] param( [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [ValidateNotNullOrEmpty()] [string]$AccountID, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$userName, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [securestring]$secret, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$address, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$platformID, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$extraFields, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$reason, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$TicketingSystemName, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$TicketId, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$ConnectionComponent, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [ValidateSet("Yes", "No")] [string]$AllowMappingLocalDrives, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [ValidateSet("Yes", "No")] [string]$AllowConnectToConsole, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [ValidateSet("Yes", "No")] [string]$RedirectSmartCards, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$PSMRemoteMachine, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [string]$LogonDomain, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [ValidateSet("Yes", "No")] [string]$AllowSelectHTML5, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "PSMConnect" )] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "AdHocConnect" )] [ValidateSet("RDP", "PSMGW")] [string]$ConnectionMethod, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true )] [ValidateScript( { Test-Path -Path $_ -IsValid })] [string]$Path ) BEGIN { $AdHocParameters = [Collections.Generic.List[String]]@("ConnectionComponent", "reason", "ticketingSystemName", "ticketId", "ConnectionParams") }#begin PROCESS { #Get all parameters that will be sent in the request $boundParameters = $PSBoundParameters | Get-PASParameter -ParametersToRemove AccountID, ConnectionMethod, Path #Nest parameters "AllowMappingLocalDrives", "AllowConnectToConsole","RedirectSmartCards", #"PSMRemoteMachine", "LogonDomain" & "AllowSelectHTML5" under ConnectionParams Property $boundParameters = $boundParameters | ConvertTo-ConnectionParam switch ($PSCmdlet.ParameterSetName) { "PSMConnect" { Assert-VersionRequirement -RequiredVersion 9.10 #Create URL for Request $URI = "$Script:BaseURI/API/Accounts/$($AccountID)/PSMConnect" #Create body of request $body = $boundParameters | ConvertTo-Json $ShouldProcess = $AccountID break } "AdHocConnect" { Assert-VersionRequirement -RequiredVersion 10.5 #Create URL for Request $URI = "$Script:BaseURI/API/Accounts/AdHocConnect" #Include decoded password in request $boundParameters["secret"] = $(ConvertTo-InsecureString -SecureString $secret) #Connection parameters are included under the PSMConnectPrerequisites property of the JSON body, for each one specified $boundParameters.keys | Where-Object { $AdHocParameters -contains $PSItem } | ForEach-Object { $PSMConnectPrerequisites = @{ } } { #add key=value to hashtable $PSMConnectPrerequisites.Add($PSItem, $boundParameters[$PSItem] ) } { if ($PSMConnectPrerequisites.keys.count -gt 0) { #If PSMConnectPrerequisites have been specified, add PSMConnectPrerequisites to boundParameters $boundParameters["PSMConnectPrerequisites"] = $PSMConnectPrerequisites } } #Create body of request $body = $boundParameters | Get-PASParameter -ParametersToRemove $AdHocParameters | ConvertTo-Json -Depth 4 $ShouldProcess = $userName break } } $ThisSession = $Script:WebSession #if a connection method is specified If ($PSBoundParameters.ContainsKey("ConnectionMethod")) { #The information needs to passed in the header if ($PSBoundParameters["ConnectionMethod"] -eq "RDP") { #RDP accept "application/json" response $Accept = "application/octet-stream" } elseif ($PSBoundParameters["ConnectionMethod"] -eq "PSMGW") { Assert-VersionRequirement -RequiredVersion 10.2 #PSMGW accept * / * response $Accept = "* / *" } #add detail to header $ThisSession.Headers["Accept"] = $Accept } if ($PSCmdlet.ShouldProcess($ShouldProcess, "New PSM Session")) { #send request to PAS web service $result = Invoke-PASRestMethod -Uri $URI -Method POST -Body $body -WebSession $ThisSession } If ($null -ne $result) { If (($result | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name) -contains "PSMGWRequest") { #Return PSM GW URL Details $result } Else { #Save the RDP file to disk Out-PASFile -InputObject $result -Path $Path } } } #process END { }#end } |