functions/secrets/Export-TssSecretBulk.ps1

function Export-TssSecretBulk {
    <#
    .SYNOPSIS
    Export secrets in bulk
 
    .DESCRIPTION
    Exports the secrets of a folder to CSV or XML.
    By default the export runs synchronously and the file text is returned in ExportedSecretsFileText. -Job starts an export job instead and returns its ExportJobId; read its status and file with Get-TssSecretBulkExport.
    Secret Server asks for the login password of the current user again before an export: pass it as -Password. Secrets protected by DoubleLock also need -DoubleLockPassword.
    The user needs View on every secret in scope.
 
    .PARAMETER TssSession
    TssSession object created by New-TssSession for authentication
 
    .PARAMETER FolderId
    Folder ID to export. Use -1 for the root folder
 
    .PARAMETER ExportChildFolders
    Include the secrets of child folders
 
    .PARAMETER ExportFolderPath
    Add the folder path of each secret to the export
 
    .PARAMETER ExportTemplateName
    Add the secret template name of each secret to the export
 
    .PARAMETER ExportTotp
    Include TOTP settings
 
    .PARAMETER FileType
    File format of the export, Csv or Xml
 
    .PARAMETER Notes
    Note recorded with the export
 
    .PARAMETER Password
    Login password of the current user; Secret Server asks for it again before an export
 
    .PARAMETER DoubleLockPassword
    DoubleLock password, needed when secrets in scope are protected by DoubleLock
 
    .PARAMETER Job
    Start an export job (POST api/v2/secrets/export/job) instead of the synchronous export; returns the ExportJobId
 
    .EXAMPLE
    $session = New-TssSession -SecretServer https://alpha -Credential $ssCred
    $password = Read-Host -AsSecureString
    (Export-TssSecretBulk -TssSession $session -FolderId 7 -ExportChildFolders -ExportFolderPath -Password $password).ExportedSecretsFileText | Set-Content -Path ./secrets.csv
 
    Exports folder 7 and its child folders to secrets.csv
 
    .EXAMPLE
    $session = New-TssSession -SecretServer https://alpha -Credential $ssCred
    $password = Read-Host -AsSecureString
    $job = Export-TssSecretBulk -TssSession $session -FolderId -1 -ExportChildFolders -FileType Xml -Password $password -Job
    $job | Get-TssSecretBulkExport -TssSession $session -Status
 
    Starts an XML export job of every folder and checks its status
 
    .LINK
    https://thycotic-ps.github.io/thycotic.secretserver/commands/secrets/Export-TssSecretBulk
 
    .LINK
    https://github.com/thycotic-ps/thycotic.secretserver/blob/main/src/functions/secrets/Export-TssSecretBulk.ps1
 
    .NOTES
    Requires TssSession object returned by New-TssSession
    #>

    [CmdletBinding(DefaultParameterSetName = 'Default')]
    [OutputType('Thycotic.PowerShell.Secrets.BulkExport')]
    param (
        [Parameter(Mandatory, ValueFromPipeline, Position = 0)]
        [Thycotic.PowerShell.Authentication.Session]
        $TssSession,

        [Parameter(Mandatory)]
        [int]
        $FolderId,

        [switch]
        $ExportChildFolders,

        [switch]
        $ExportFolderPath,

        [switch]
        $ExportTemplateName,

        [switch]
        $ExportTotp,

        [ValidateSet('Csv', 'Xml')]
        [string]
        $FileType,

        [string]
        $Notes,

        [Parameter(Mandatory)]
        [securestring]
        $Password,

        [securestring]
        $DoubleLockPassword,

        [Parameter(Mandatory, ParameterSetName = 'Job')]
        [switch]
        $Job
    )
    begin {
        $tssParams = $PSBoundParameters
        $invokeParams = . $GetInvokeApiParams $TssSession
    }
    process {
        Get-TssInvocation $PSCmdlet.MyInvocation
        if ($tssParams.ContainsKey('TssSession') -and $TssSession.IsValidSession()) {
            Compare-TssVersion $TssSession '10.9.000000' $PSCmdlet.MyInvocation
            switch ($PSCmdlet.ParameterSetName) {
                'Job' {
                    $uri = ($TssSession.ApiUrl -replace '/api/v1$','/api/v2'), 'secrets', 'export', 'job' -join '/'
                    $body = @{ data = @{ } }
                    switch ($tssParams.Keys) {
                        'FolderId' {
                            $body.data.Add('folderId', $FolderId)
                        }
                        'ExportChildFolders' {
                            $body.data.Add('exportChildFolders', [boolean]$ExportChildFolders)
                        }
                        'ExportFolderPath' {
                            $body.data.Add('exportFolderPath', [boolean]$ExportFolderPath)
                        }
                        'ExportTemplateName' {
                            $body.data.Add('exportTemplateName', [boolean]$ExportTemplateName)
                        }
                        'ExportTotp' {
                            $body.data.Add('exportTotp', [boolean]$ExportTotp)
                        }
                        'FileType' {
                            $body.data.Add('exportFileType', $FileType)
                        }
                        'Notes' {
                            $body.data.Add('notes', $Notes)
                        }
                        'Password' {
                            $body.data.Add('password', [System.Net.NetworkCredential]::new('', $Password).Password)
                        }
                        'DoubleLockPassword' {
                            $body.data.Add('doubleLockPassword', [System.Net.NetworkCredential]::new('', $DoubleLockPassword).Password)
                        }
                    }
                    $invokeParams.Body = $body | ConvertTo-Json -Depth 100
                }
                default {
                    $uri = $TssSession.ApiUrl, 'secrets', 'export' -join '/'
                    $body = @{ data = @{ } }
                    switch ($tssParams.Keys) {
                        'FolderId' {
                            $body.data.Add('folderId', $FolderId)
                        }
                        'ExportChildFolders' {
                            $body.data.Add('exportChildFolders', [boolean]$ExportChildFolders)
                        }
                        'ExportFolderPath' {
                            $body.data.Add('exportFolderPath', [boolean]$ExportFolderPath)
                        }
                        'ExportTemplateName' {
                            $body.data.Add('exportTemplateName', [boolean]$ExportTemplateName)
                        }
                        'ExportTotp' {
                            $body.data.Add('exportTotp', [boolean]$ExportTotp)
                        }
                        'FileType' {
                            $body.data.Add('exportFileType', $FileType)
                        }
                        'Notes' {
                            $body.data.Add('notes', $Notes)
                        }
                        'Password' {
                            $body.data.Add('password', [System.Net.NetworkCredential]::new('', $Password).Password)
                        }
                        'DoubleLockPassword' {
                            $body.data.Add('doubleLockPassword', [System.Net.NetworkCredential]::new('', $DoubleLockPassword).Password)
                        }
                    }
                    $invokeParams.Body = $body | ConvertTo-Json -Depth 100
                }
            }
            $invokeParams.Uri = $uri
            $invokeParams.Method = 'POST'
            Write-Verbose "Performing the operation $($invokeParams.Method) $uri (request body not shown: it carries sensitive values)"
            try {
                $apiResponse = Invoke-TssApi @invokeParams
                if ($apiResponse.IsSuccessful -and $apiResponse.StatusCode -eq [System.Net.HttpStatusCode]::Accepted) {
                    $restResponse = $apiResponse.Content | ConvertFrom-Json
                } else {
                    $restResponse = . $ProcessResponse $apiResponse
                }
            } catch {
                Write-Warning 'Issue with Export-TssSecretBulk request'
                $err = $_
                . $ErrorHandling $err
            }
            if ($restResponse) {
                [Thycotic.PowerShell.Secrets.BulkExport](. $FilterTssResponse $restResponse ([Thycotic.PowerShell.Secrets.BulkExport]))
            }
        } else {
            Write-Warning 'No valid session found'
        }
    }
}