Public/Commands/Invoke-JCCommand.ps1
Function Invoke-JCCommand () { [CmdletBinding(DefaultParameterSetName = 'NoVariables')] param ( [Parameter(Mandatory, ValueFromPipelineByPropertyName, Position = 0, HelpMessage = 'When creating a JumpCloud command that can be run via the Invoke-JCCommand function the command must be configured for ''Launch Event - Event type: Run on Trigger (webhook)'' During command configuration a ''Trigger Name'' is required. The value of this trigger name is what must be populated when using the Invoke-JCCommand function. To find all JumpCloud Command triggers run: PS C:\> Get-JCCommand | Where-Object launchType -EQ ''trigger'' | Select-Object name, trigger You can leverage the pipeline and Parameter Binding to populate the -trigger Parameter. This is shown in EXAMPLES 2 and 3.')] [String]$trigger, [Parameter(ParameterSetName = 'Variables', HelpMessage = 'Denotes the number of variables you wish to send to the JumpCloud command. This parameter creates two dynamic parameters for each variable added. -Variable_1Name = the variable name -Variable1_Value = the value to pass. See EXAMPLE 2 above for full syntax.')] [int]$NumberOfVariables ) DynamicParam { $ParameterSetName = $PSCmdlet.ParameterSetName If ((Get-PSCallStack).Command -like '*MarkdownHelp') { $ParameterSetName = 'Variables' $NumberOfVariables = 2 } If ($ParameterSetName -eq 'Variables') { $dict = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary [int]$NewParams = 0 [int]$ParamNumber = 1 while ($NewParams -ne $NumberOfVariables) { $attr = New-Object System.Management.Automation.ParameterAttribute $attr.Mandatory = $true $attr.HelpMessage = 'Enter a variable name' $attr.ValueFromPipelineByPropertyName = $true $attrColl = New-Object System.Collections.ObjectModel.Collection[System.Attribute] $attrColl.Add($attr) $param = New-Object System.Management.Automation.RuntimeDefinedParameter("Variable$ParamNumber`_name", [string], $attrColl) $dict.Add("Variable$ParamNumber`_name", $param) $attr1 = New-Object System.Management.Automation.ParameterAttribute $attr1.Mandatory = $true $attr1.HelpMessage = 'Enter the Variables value' $attr1.ValueFromPipelineByPropertyName = $true $attrColl1 = New-Object System.Collections.ObjectModel.Collection[System.Attribute] $attrColl1.Add($attr1) $param1 = New-Object System.Management.Automation.RuntimeDefinedParameter("Variable$ParamNumber`_value", [string], $attrColl1) $dict.Add("Variable$ParamNumber`_value", $param1) $NewParams++ $ParamNumber++ } return $dict } } begin { Write-Verbose 'Verifying JCAPI Key' if ($JCAPIKEY.length -ne 40) { Connect-JCOnline } Write-Verbose 'Populating API headers' $hdrs = @{ 'Accept' = 'application/json' 'X-API-KEY' = $JCAPIKEY } if ($JCOrgID) { $hdrs.Add('x-org-id', "$($JCOrgID)") } Write-Verbose 'Initilizing resultsArray' $resultsArray = @() Write-Debug $PSCmdlet.ParameterSetName } process { if ($PSCmdlet.ParameterSetName -eq 'Variables') { $Variables = @{ } $VariableArrayList = New-Object System.Collections.ArrayList foreach ($param in $PSBoundParameters.GetEnumerator()) { if ($param.Key -like "Variable*") { $RawObject = [pscustomobject]@{ ObjectNumber = ($Param.key).Split('_')[0] Type = ($Param.key).Split('_')[1] Value = $Param.value } $VariableArrayList.Add($RawObject) | Out-Null $UniqueVariables = $VariableArrayList | Select-Object ObjectNumber -Unique } } foreach ($O in $UniqueVariables) { $Props = $VariableArrayList | Where-Object ObjectNumber -EQ $O.ObjectNumber $VariableName = $Props | Where-Object Type -EQ 'Name' $VariableValue = $Props | Where-Object Type -EQ 'Value' $Variables.add($VariableName.value, $VariableValue.value) } } $URL = "$JCUrlBasePath/api/command/trigger/$trigger" Write-Verbose $URL if ($Variables) { $CommandResults = Invoke-RestMethod -Method POST -Uri $URL -Headers $hdrs -Body:($Variables | ConvertTo-Json) -UserAgent:(Get-JCUserAgent) } else { $CommandResults = Invoke-RestMethod -Method POST -Uri $URL -Headers $hdrs -UserAgent:(Get-JCUserAgent) } $resultsArray += $CommandResults } end { return $resultsArray } } |