functions/utility/Invoke-PSCUCMAxlQuery.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
function Invoke-PSCUCMAxlQuery { <# .SYNOPSIS Invoke an AXL Query .DESCRIPTION Invoke an AXL Query against the connected server. .PARAMETER Entity AXL Entity to invoke. .PARAMETER Parameters Parameters for the AXL Entity. .PARAMETER EnableException Replaces user friendly yellow warnings with bloody red exceptions of doom! Use this if you want the function to throw terminating errors you want to catch. .PARAMETER OutputXml Output XML for the query instead of invoking it. .PARAMETER WhatIf What If? .PARAMETER Confirm Confirm... .EXAMPLE Invoke-PSCUCMAxlQuery -Entity getUser -Parameters @{ name = 'administrator' } -OutputXML Outputs the XML that would be sent to CUCM server. .NOTES OutputXML does *not* need a connected CUCM server to run. #> [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Low")] param ( [Parameter(Mandatory = $true)] [string] $Entity, [Parameter(Mandatory = $true)] [hashtable] $Parameters, [switch] $EnableException, [switch] $OutputXml ) $AXLVersion = Get-PSFConfigValue -FullName pscucm.axlversion Write-PSFMessage -Level Debug -Message "AXL Version: $AXLVersion" if (-not $OutputXml) { Write-PSFMessage -Level Verbose -Message "Attempting to query $Entity" -Target $Parameters $EnableException = $EnableException -or $(Get-PSFConfigValue -FullName pscucm.enableexception) if (-not (Get-PSFConfigValue -FullName pscucm.connected)) { Stop-PSFFunction -Message "Unable to process AXL request. Not connected." -EnableException $EnableException return } $Server = Get-PSFConfigValue -FullName pscucm.server Write-PSFMessage -Level Debug -Message "Querying $Server" $Credential = Get-PSFConfigValue -FullName pscucm.credential Write-PSFMessage -Level Debug -Message "Using username: $($Credential.Username)" } $object = @{ 'soapenv:Header' = '' 'soapenv:Body' = @{ "ns:$entity" = $Parameters } } $body = ConvertTo-XMLString -InputObject $object -ObjectName "soapenv:Envelope" -RootAttributes @{"xmlns:soapenv"="http://schemas.xmlsoap.org/soap/envelope/"; "xmlns:ns"="http://www.cisco.com/AXL/API/$AXLVersion"} Write-PSFMessage -Level Debug -Message "Generated XML for Entity: $Entity" -Target $body if (-not $OutputXml) { if ($PSCmdlet.ShouldProcess($Server, "Execute AXL query $Entity")) { $CUCMURL = "https://$Server/axl/" $headers = @{ 'Content-Type' = 'text/xml; charset=utf-8' } $IRMParams = @{ Headers = $headers Body = $body Uri = $CUCMURL Method = 'Post' Credential = $Credential } if (Get-PSFConfigValue -FullName pscucm.skipcertificatecheck) { if ($PSVersionTable.PSVersion.Major -ge 6) { $IRMParams.SkipCertificateCheck = $true } else { [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} } } try { Invoke-WebRequest @IRMParams | Select-XML -XPath '//return' | Select-Object -ExpandProperty Node } catch { $ErrorMessage = $_.ErrorDetails.message $PSFMessage = "Failed to execute AXL entity $Entity." if (($null -ne $ErrorMessage) -and ($_.Exception.Response.StatusCode -eq 'InternalServerError')) { if ($PSVersionTable.PSVersion.Major -ge 6) { $null = $ErrorMessage -match "(\d+)(.*)$Entity" $axlcode = $Matches[1] $axlMessage = $Matches[2] } else { $axlcode = ($ErrorMessage | select-xml -XPath '//axlcode' | Select-Object -ExpandProperty Node).'#text' $axlMessage = ($ErrorMessage | select-xml -XPath '//axlmessage' | Select-Object -ExpandProperty Node).'#text' } $PSFMessage += " AXL Error: $axlMessage ($axlcode)" } Stop-PSFFunction -Message $PSFMessage -ErrorRecord $_ -EnableException $EnableException -Target $body return } } } else { $body } } |