public/Get-VPASPlatformDetailsSearch.ps1
<#
.Synopsis GET PLATFORM DETAILS VIA SEARCHQUERY CREATED BY: Vadim Melamed, EMAIL: vpasmodule@gmail.com .DESCRIPTION USE THIS FUNCTION TO GET DETAILS ABOUT A PLATFORM IN CYBERARK VIA SEARCHQUERY .LINK https://vpasmodule.com/commands/Get-VPASPlatformDetailsSearch .PARAMETER token HashTable of data containing various pieces of login information (PVWA, LoginToken, HeaderType, etc). If -token is not passed, function will use last known hashtable generated by New-VPASToken .PARAMETER SearchQuery Search string to find target resource via username, address, safe, platform, etc. Comma separated for multiple fields, or to search all pass a blank value like so: " " .PARAMETER InputParameters HashTable of values containing the parameters required to make the API call .EXAMPLE $PlatformDetailsSearchJSON = Get-VPASPlatformDetailsSearch -SearchQuery {SEARCHQUERY VALUE} .EXAMPLE $InputParameters = @{ SearchQuery = "VPASPlatform" } $PlatformDetailsSearchJSON = Get-VPASPlatformDetailsSearch -InputParameters $InputParameters .OUTPUTS If successful: { "value": [ { "general": { "id": "WinDomainTextRecording", "name": "WinDomainTextRecording", "systemType": "Windows", "active": false, "description": "Testing API Text Recording", "platformBaseID": "WinDomain", "platformType": "regular" }, "properties": { "required": " ", "optional": " " }, "linkedAccounts": [ "@{name=LogonAccount; displayName=Logon Account}", "@{name=ReconcileAccount; displayName=Reconcile Account}" ], "credentialsManagement": { "allowedSafes": ".*", "allowManualChange": true, "performPeriodicChange": false, "requirePasswordChangeEveryXDays": 90, "allowManualVerification": true, "performPeriodicVerification": false, "requirePasswordVerificationEveryXDays": 7, "allowManualReconciliation": true, "automaticReconcileWhenUnsynched": false }, "sessionManagement": { "requirePrivilegedSessionMonitoringAndIsolation": true, "recordAndSaveSessionActivity": true, "PSMServerID": "PSMServer_123abc" }, "privilegedAccessWorkflows": { "requireDualControlPasswordAccessApproval": false, "enforceCheckinCheckoutExclusiveAccess": false, "enforceOnetimePasswordAccess": false } }, { "general": { "id": "WinDomain", "name": "Windows Domain Account", "systemType": "Windows", "active": true, "description": "", "platformBaseID": "WinDomain", "platformType": "regular" }, "properties": { "required": " ", "optional": " " }, "linkedAccounts": [ "@{name=LogonAccount; displayName=Logon Account}", "@{name=ReconcileAccount; displayName=Reconcile Account}" ], "credentialsManagement": { "allowedSafes": ".*", "allowManualChange": true, "performPeriodicChange": false, "requirePasswordChangeEveryXDays": 90, "allowManualVerification": true, "performPeriodicVerification": false, "requirePasswordVerificationEveryXDays": 7, "allowManualReconciliation": true, "automaticReconcileWhenUnsynched": false }, "sessionManagement": { "requirePrivilegedSessionMonitoringAndIsolation": true, "recordAndSaveSessionActivity": true, "PSMServerID": "PSMServer_123abc" }, "privilegedAccessWorkflows": { "requireDualControlPasswordAccessApproval": false, "enforceCheckinCheckoutExclusiveAccess": false, "enforceOnetimePasswordAccess": false } } ] } --- $false if failed #> function Get-VPASPlatformDetailsSearch{ [OutputType('System.Collections.Hashtable',[bool])] [CmdletBinding(DefaultParameterSetName='Set1')] Param( [Parameter(Mandatory=$true,ParameterSetName='Set1',ValueFromPipelineByPropertyName=$true,HelpMessage="Enter wildcard search to query Platforms (for example: Win)")] [String]$SearchQuery, [Parameter(Mandatory=$true,ParameterSetName='InputParameters',ValueFromPipelineByPropertyName=$true,HelpMessage="Hashtable of parameters required to make API call, refer to get-help -examples for valid inputs")] [hashtable]$InputParameters, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)] [hashtable]$token ) Begin{ $tokenval,$sessionval,$PVWA,$Header,$ISPSS,$IdentityURL,$EnableTextRecorder,$AuditTimeStamp,$NoSSL,$VaultVersion,$HideWarnings,$AuthenticatedAs,$SubDomain,$EnableTroubleshooting = Get-VPASSession -token $token $CommandName = $MyInvocation.MyCommand.Name $log = Write-VPASTextRecorder -inputval $CommandName -token $token -LogType COMMAND } Process{ try{ if($PSCmdlet.ParameterSetName -eq "InputParameters"){ $KeyHash = @{ set1 = @{ AcceptableKeys = @("SearchQuery") MandatoryKeys = @("SearchQuery") } } $CheckSet = Test-VPASHashtableKeysHelper -InputHash $InputParameters -KeyHash $KeyHash if(!$CheckSet){ $log = Write-VPASTextRecorder -inputval "FAILED TO FIND TARGET PARAMETER SET" -token $token -LogType MISC Write-Verbose "FAILED TO FIND TARGET PARAMETER SET" Write-VPASOutput -str "FAILED TO FIND TARGET PARAMETER SET...VIEW EXAMPLES BELOW:" -type E $examples = Write-VPASExampleHelper -CommandName $CommandName return $false } else{ foreach($key in $InputParameters.Keys){ Set-Variable -Name $key -Value $InputParameters.$key } } } }catch{ $log = Write-VPASTextRecorder -inputval $_ -token $token -LogType ERROR $log = Write-VPASTextRecorder -inputval "REST API COMMAND RETURNED: FALSE" -token $token -LogType MISC Write-Verbose "FAILED TO RETRIEVE PLATFORM DETAILS" Write-VPASOutput -str $_ -type E return $false } try{ Write-Verbose "MAKING API CALL TO CYBERARK" try{ if($NoSSL){ Write-Verbose "NO SSL ENABLED, USING HTTP INSTEAD OF HTTPS" $uri = "http://$PVWA/PasswordVault/API/Platforms?Search=$SearchQuery" } else{ Write-Verbose "SSL ENABLED BY DEFAULT, USING HTTPS" $uri = "https://$PVWA/PasswordVault/API/Platforms?Search=$SearchQuery" } $log = Write-VPASTextRecorder -inputval $uri -token $token -LogType URI $log = Write-VPASTextRecorder -inputval "GET" -token $token -LogType METHOD if($sessionval){ $response = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method GET -ContentType "application/json" -WebSession $sessionval } else{ $response = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method GET -ContentType "application/json" } Write-Verbose "PARSING DATA FROM CYBERARK" $output = @() foreach($rec in $response.Platforms){ if($SearchQuery -eq " "){ $output += $rec } else{ $recplatformid = $rec.general.id $recname = $rec.general.name if($recplatformid -match $SearchQuery -or $recname -match $SearchQuery){ $output += $rec } } } }catch{ Write-Verbose "GET ALL PLATFORMS API FAILED: $_" Write-Verbose "RUNNING Get-VPASAllTargetPlatforms INSTEAD" Write-VPASOutput -str "FAILED TO GET ALL PLATFORMS, RUNNING Get-VPASAllTargetPlatforms INSTEAD" -type M Write-VPASOutput -str "KEEP IN MIND THE RETURN JSON SYNTAX DIFFERS FOR Get-VPASAllTargetPlatforms" -type M if($NoSSL){ Write-Verbose "NO SSL ENABLED, USING HTTP INSTEAD OF HTTPS" $uri = "http://$PVWA/PasswordVault/API/Platforms/Targets?Search=$SearchQuery" } else{ Write-Verbose "SSL ENABLED BY DEFAULT, USING HTTPS" $uri = "https://$PVWA/PasswordVault/API/Platforms/Targets?Search=$SearchQuery" } $log = Write-VPASTextRecorder -inputval $uri -token $token -LogType URI $log = Write-VPASTextRecorder -inputval "GET" -token $token -LogType METHOD if($sessionval){ $response = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method GET -ContentType "application/json" -WebSession $sessionval } else{ $response = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method GET -ContentType "application/json" } Write-Verbose "PARSING DATA FROM CYBERARK" $output = @() foreach($rec in $response.Platforms){ if($SearchQuery -eq " "){ $output += $rec } else{ $recplatformid = $rec.PlatformID $recname = $rec.Name if($recplatformid -match $SearchQuery -or $recname -match $SearchQuery){ $output += $rec } } } } $outputlog = @{ value = $output } | ConvertTo-Json | ConvertFrom-Json $outputreturn = @{ value = $output } $log = Write-VPASTextRecorder -inputval $outputlog -token $token -LogType RETURNARRAY Write-Verbose "RETURNING PLATFORM DETAILS JSON" return $outputreturn }catch{ $log = Write-VPASTextRecorder -inputval $_ -token $token -LogType ERROR $log = Write-VPASTextRecorder -inputval "REST API COMMAND RETURNED: FALSE" -token $token -LogType MISC Write-Verbose "UNABLE TO RETRIEVE PLATFORM DETAILS FOR SEARCHQUERY: $SearchQuery" Write-VPASOutput -str $_ -type E return $false } } End{ $log = Write-VPASTextRecorder -inputval $CommandName -token $token -LogType DIVIDER } } |