Functions/Accounts/Set-PASAccount.ps1
# .ExternalHelp psPAS-help.xml function Set-PASAccount { [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "Gen2SingleOp")] param( [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true )] [ValidateNotNullOrEmpty()] [Alias("id")] [string]$AccountID, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen2SingleOp" )] [ValidateSet("add", "replace", "remove")] [Alias("Operation")] [string]$op, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen2SingleOp" )] [string]$path, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen2SingleOp" )] [string]$value, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen2MultiOp" )] [hashtable[]]$operations, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen1" )] [string]$Folder, [parameter( Mandatory = $true, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen1" )] [Alias("Name")] [string]$AccountName, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen1" )] [string]$DeviceType, [Alias("PolicyID")] [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen1" )] [string]$PlatformID, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen1" )] [string]$Address, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen1" )] [string]$UserName, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen1" )] [string]$GroupName, [parameter( Mandatory = $false, ValueFromPipelinebyPropertyName = $true, ParameterSetName = "Gen1" )] [string]$GroupPlatformID, [parameter( Mandatory = $false, ValueFromPipelineByPropertyName = $false, ParameterSetName = "Gen1" )] [hashtable]$Properties = @{ }, [parameter( Mandatory = $false, ValueFromPipeline = $false, ParameterSetName = "Gen2SingleOp" )] [parameter( Mandatory = $false, ValueFromPipeline = $false, ParameterSetName = "Gen2MultiOp" )] [parameter( Mandatory = $false, ValueFromPipeline = $true, ParameterSetName = "Gen1" )] [PSObject]$InputObject ) BEGIN { }#begin PROCESS { #Get all parameters that will be sent in the request $boundParameters = $PSBoundParameters | Get-PASParameter -ParametersToRemove InputObject, AccountID switch ($PSCmdlet.ParameterSetName) { { $PSItem -match "Gen2" } { Assert-VersionRequirement -RequiredVersion 10.4 #Create URL for Request $URI = "$Script:BaseURI/api/Accounts/$AccountID" #Define method for request $Method = "PATCH" #Define type of output object $Type = "psPAS.CyberArk.Vault.Account.V10" if ($PSCmdlet.ParameterSetName -match "Gen2MultiOp") { $boundParameters = $boundParameters["operations"] } #Do Not Pipe into ConvertTo-JSON. #Correct JSON Format is only achieved when the array is not sent along the pipe $body = ConvertTo-Json @($boundParameters) } "Gen1" { #Create URL for Request $URI = "$Script:BaseURI/WebServices/PIMServices.svc/Accounts/$AccountID" #Define method for request $Method = "PUT" #Define type of output object $Type = "psPAS.CyberArk.Vault.Account" if ($PSBoundParameters.ContainsKey("Properties")) { #Format "Properties" parameter value. #Array of key=value pairs required for JSON convertion $boundParameters["Properties"] = [Collections.Generic.List[String]]@($boundParameters["Properties"].getenumerator() | ForEach-Object { $_ }) } If (($InputObject) -and (($InputObject | Get-Member).TypeName -eq "psPAS.CyberArk.Vault.Account")) { #If InputObject is psPAS.CyberArk.Vault.Account #*i.e. receiving pipeline from Get-PASAccount #Get all existing properties as defined by input object: #Process Pipeline input object properties $InputObject | #exclude properties output by get-pasaccount not applicable to set-pasaccount request Select-Object -Property * -ExcludeProperty Name, PolicyID, Safe | #get all remaining noteproperties Get-Member -MemberType "NoteProperty" | #For each property ForEach-Object { #Initialise hashtable $ExistingProperty = @{ } #if property is not bound to function parameter by name, if (!(($PSBoundParameters.ContainsKey($($_.Name))) -or ( #if not being explicitly updated. $($Properties).ContainsKey($($_.Name))))) { [hashtable]$ExistingProperty.Add($($_.Name), $($InputObject.$($_.Name))) #Add to Properties node of request data [array]$boundParameters["Properties"] += $ExistingProperty.GetEnumerator() | ForEach-Object { $_ } #*any existing properties of an account not sent in a "set" request will be cleared on the account. #*This ensures correctly formatted request with all existing account properties included #*when function is sent data via the pipeline. } } } #Create body of request $body = @{ "Accounts" = $boundParameters #ensure nodes at all required depths are included in the JSON object } | ConvertTo-Json -Depth 3 break } } if ($PSCmdlet.ShouldProcess($AccountID, "Update Account Properties")) { #send request to PAS web service $Result = Invoke-PASRestMethod -Uri $URI -Method $Method -Body $Body -WebSession $Script:WebSession If ($null -ne $result) { switch ($PSCmdlet.ParameterSetName) { "Gen1" { $Return = $Result.UpdateAccountResult ; break } default { $Return = $Result } } $Return | Add-ObjectDetail -typename $Type -PropertyToAdd @{ "AccountID" = $AccountID } } } }#process END { }#end } |