public/Export-VPASPlatform.ps1

<#
.Synopsis
   EXPORT PLATFORM FROM CYBERARK
   CREATED BY: Vadim Melamed, EMAIL: vpasmodule@gmail.com
.DESCRIPTION
   USE THIS FUNCTION TO EXPORT A PLATFORM FROM CYBERARK
.LINK
   https://vpasmodule.com/commands/Export-VPASPlatform
.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 HideOutput
   Suppress any output to the console
.PARAMETER Directory
   Location where the exported files should be placed
.PARAMETER PlatformName
   Unique target PlatformName that will be exported
.PARAMETER InputParameters
   HashTable of values containing the parameters required to make the API call
.EXAMPLE
   $ExportPlatformStatus = Export-VPASPlatform -PlatformName {PLATFORMNAME VALUE}
.EXAMPLE
   $ExportPlatformStatus = Export-VPASPlatform -PlatformName {PLATFORMNAME VALUE} -Directory {C:\ExampleDir}
.EXAMPLE
   $InputParameters = @{
        PlatformName = "TargetPlatformID"
        Directory = "C:\temp\platformExports"
        HideOutput = $true|$false
   }
   $ExportPlatformStatus = Export-VPASPlatform -InputParameters $InputParameters
.OUTPUTS
   $true if successful
   ---
   $false if failed
#>

function Export-VPASPlatform{
    [OutputType([bool])]
    [CmdletBinding(DefaultParameterSetName='Set1')]
    Param(

        [Parameter(Mandatory=$true,ParameterSetName='Set1',ValueFromPipelineByPropertyName=$true,HelpMessage="PlatformID of target platform to be exported (for example: WinSeverLocal)")]
        [String]$PlatformName,

        [Parameter(Mandatory=$false,ParameterSetName='Set1',ValueFromPipelineByPropertyName=$true)]
        [String]$Directory,

        [Parameter(Mandatory=$false,ParameterSetName='Set1',ValueFromPipelineByPropertyName=$true)]
        [Switch]$HideOutput,

        [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 = @("PlatformName","Directory","HideOutput")
                        MandatoryKeys = @("PlatformName")
                    }
                }
                $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 EXPORT PLATFORM"
            Write-VPASOutput -str $_ -type E
            return $false
        }

        try{

            if($NoSSL){
                Write-Verbose "NO SSL ENABLED, USING HTTP INSTEAD OF HTTPS"
                $uri = "http://$PVWA/PasswordVault/API/Platforms/$PlatformName/Export"
            }
            else{
                Write-Verbose "SSL ENABLED BY DEFAULT, USING HTTPS"
                $uri = "https://$PVWA/PasswordVault/API/Platforms/$PlatformName/Export"
            }
            $log = Write-VPASTextRecorder -inputval $uri -token $token -LogType URI
            $log = Write-VPASTextRecorder -inputval "POST" -token $token -LogType METHOD

            if([String]::IsNullOrEmpty($Directory)){
                $curUser = $env:UserName
                $outpath = "C:\Users\$curUser\AppData\Local\VPASModuleOutputs"
                Write-Verbose "NO DIRECTORY SPECIFIED, USING THE FOLLOWING OUTPUT DIRECTORY:"
                Write-Verbose $outpath
            }
            else{
                Write-Verbose "SUPPLIED DIRECTORY VALUE: $Directory"
                $outpath = $Directory
            }


            if(Test-Path -Path $outpath){
                write-verbose "$outpath EXISTS"
            }
            else{
                write-verbose "$outpath DOES NOT EXIST, CREATING DIRECTORY"
                $MakeDirectory = New-Item -Path $outpath -Type Directory
            }

            Write-Verbose "MAKING API CALL TO CYBERARK"

            if($sessionval){
                $response = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method POST -ContentType "application/json" -WebSession $sessionval -OutFile "$outpath\$PlatformName.zip"
            }
            else{
                $response = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method POST -ContentType "application/json" -OutFile "$outpath\$PlatformName.zip"
            }
            Write-Verbose "SUCCESSFULLY EXPORTED $PlatformName TO $outpath"
            if(!$HideOutput){
                Write-VPASOutput -str "SUCCESSFULLY EXPORTED $PlatformName TO $outpath" -type M
            }
            $log = Write-VPASTextRecorder -inputval "$PlatformName EXPORTED TO $outpath" -token $token -LogType MISC
            $log = Write-VPASTextRecorder -inputval "REST API COMMAND RETURNED: TRUE" -token $token -LogType MISC
            return $true

        }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 EXPORT $PlatformName"
            Write-VPASOutput -str $_ -type E
            return $false
        }
    }
    End{
        $log = Write-VPASTextRecorder -inputval $CommandName -token $token -LogType DIVIDER
    }
}