functions/Get-TssSecret.ps1

function Get-TssSecret {
    <#
    .SYNOPSIS
    Get a secret from Secret Server
 
    .DESCRIPTION
    Get a secret(s) from Secret Server
 
    .PARAMETER TssSession
    TssSession object created by New-TssSession
 
    .PARAMETER Id
    Secret ID to retrieve, accepts an array of IDs
 
    .PARAMETER Comment
    Comment to provide for restricted secret (Require Comment is enabled)
 
    .PARAMETER Raw
    Output the raw response from the REST API endpoint
 
    .EXAMPLE
    PS C:\> $session = New-TssSession -SecretServer https://alpha -Credential $ssCred
    PS C:\> Get-TssSecret -TssSession $session -Id 93
 
    Returns secret associated with the Secret ID, 93
 
    .EXAMPLE
    PS C:\> $session = New-TssSession -SecretServer https://alpha -Credential $ssCred
    PS C:\> Get-TssSecret -TssSession $session -Id 1723 -Comment "Accessing application Y"
 
    Returns secret associated with the Secret ID, 1723, providing required comment
 
    .NOTES
    Requires TssSession object returned by New-TssSession
    #>

    [cmdletbinding()]
    param(
        # TssSession object passed for auth info
        [Parameter(Mandatory,ValueFromPipeline)]
        [TssSession]$TssSession,

        # Return only specific Secret, Secret Id
        [Parameter(Mandatory,ValueFromPipelineByPropertyName,ParameterSetName = "norm")]
        [Alias("SecretId")]
        [int[]]
        $Id,

        # Provide comment for restricted secret
        [string]
        $Comment,

        # output the raw response from the API endpoint
        [switch]
        $Raw
    )
    begin {
        $tssParams = . $GetParams $PSBoundParameters 'Get-TssSecret'
        $invokeParams = @{ }
    }

    process {
        if ($tssParams.Contains('TssSession') -and $TssSession.IsValidSession()) {
            foreach ($secret in $Id) {
                $restResponse = $null
                $errorResponse = $null
                $uri = $TssSession.SecretServerUrl + ($TssSession.ApiVersion, "secrets", $secret.ToString() -join '/')
                if ($Comment) {
                    $uri = $uri, "restricted" -join "/"
                    $body = "{'comment':'$Comment', 'includeInactive':'$true'}"
                    $invokeParams.Uri = $Uri
                    $invokeParams.Method = 'POST'
                    $invokeParams.Body = $body
                } else {
                    $uri = $uri, "includeInactive=true" -join "?"
                    $invokeParams.Uri = $Uri
                    $invokeParams.Method = 'GET'
                }

                $invokeParams.PersonalAccessToken = $TssSession.AccessToken
                try {
                    $restResponse = Invoke-TssRestApi @invokeParams -ErrorAction Stop -ErrorVariable err
                } catch {
                    $apiError = $err | ConvertFrom-Json
                    if ($apiError.errorCode) {
                        throw "$($apiError.errorCode): $($apiError.message)"
                    } elseif ($apiError.message) {
                        throw $apiError.message
                    } else {
                        throw $err
                    }
                }

                if ($Raw) {
                    return $restResponse
                }
                if ($restResponse) {
                    $outSecret = [PSCustomObject]@{
                        PSTypeName                         = 'TssSecret'
                        Id                                 = $restResponse.id
                        Name                               = $restResponse.name
                        SecretTemplateId                   = $restResponse.secretTemplateId
                        SecretTemplateName                 = $restResponse.secretTemplateName
                        FolderId                           = if ($restResponse.folderId -eq -1) { $null } else { $restResponse.folderId }
                        Active                             = $restResponse.active
                        LauncherConnectSecretId            = if ($restResponse.launcherConnectAsSecretId -eq -1) { $null } else { $restResponse.launcherConnectAsSecretId }
                        IsRestricted                       = $restResponse.isRestricted
                        IsOutOfSync                        = $restResponse.isOutOfSync
                        OutOfSyncReason                    = $restResponse.outOfSyncReason
                        AutoChangeEnabled                  = $restResponse.autoChangeEnabled
                        AutoChangeNextPassword             = $restResponse.AutoChangeNextPassword
                        RequiresApprovalForAccess          = $restResponse.requiresApprovalForAccess
                        RequiresComment                    = $restResponse.requiresComment
                        CheckedOut                         = $restResponse.checkedOut
                        CheckoutEnabled                    = $restResponse.checkOutEnabled
                        CheckoutUserId                     = if ($restResponse.checkOutUserId -eq -1) { $null } else { $restResponse.checkOutUserId }
                        CheckoutUserDisplayName            = if ($restResponse.checkOutUserDisplayName -eq -1) { $null } else { $restResponse.checkOutUserDisplayName }
                        CheckoutIntervalMinutes            = if ($restResponse.CheckoutIntervalMinutes -eq -1) { $null } else { $restResponse.checkOutIntervalMinutes }
                        CheckoutChangePassword             = $restResponse.checkOutChangePasswordEnabled
                        AccessRequestWorkflowMapId         = if ($restResponse.accessRequestWorkflowMapId -eq -1) { $null } else { $restResponse.accessRequestWorkflowMapId }
                        ProxyEnabled                       = $restResponse.proxyEnabled
                        SessionRecordingEnabled            = $restResponse.sessionRecordingEnabled
                        RestrictSshCommands                = $restResponse.restrictSshCommands
                        AllowOwnersUnrestrictedSshCommands = $restResponse.allowOwnersUnrestrictedSshCommands
                        IsDoubleLock                       = $restResponse.isDoubleLock
                        DoubleLockId                       = if ($restResponse.doubleLockId -eq -1) { $null } else { $restResponse.doubleLockId }
                        EnableInheritsPermissions          = $restResponse.enableInheritPermissions
                        EnableInheritsSecretPolicy         = if ($restResponse.enableInheritSecretPolicy -eq -1) { $null } else { $restResponse.enableInheritSecretPolicy }
                        SiteId                             = $restResponse.siteId
                        SecretPolicyId                     = if ($restResponse.secretPolicyId -eq -1) { $null } else { $restResponse.secretPolicyId }
                        LastHeartbeatStatus                = $restResponse.lastHeartBeatStatus
                        LastHeartbeatCheck                 = [datetime]$restResponse.lastHeartBeatCheck
                        FailedPasswordChangeAttempts       = $restResponse.failedPasswordChangeAttempts
                        LastPasswordChangeAttempt          = [datetime]$restResponse.lastPasswordChangeAttempt
                        PasswordTypeWebscriptId            = if ($restResponse.passwordTypeWebScriptId -eq -1) { $null } else { $restResponse.passwordTypeWebScriptId }
                    }

                    $items = foreach ($itemDetail in $restResponse.items) {
                        [pscustomobject]@{
                            PSTypeName       = 'TssSecretItem'
                            ItemId           = $itemDetail.itemId
                            ItemValue        = $itemDetail.itemValue
                            FieldId          = $itemDetail.fieldId
                            FieldName        = $itemDetail.fieldName
                            Slug             = $itemDetail.slug
                            FieldDescription = $itemDetail.fieldDescription
                            IsFile           = $itemDetail.isFile
                            FileAttachmentId = $itemDetail.fileAttachmentId
                            FileName         = $itemDetail.fileName
                            IsNotes          = $itemDetail.isNotes
                            IsPassword       = $itemDetail.isPassword
                        }
                    }
                    $outSecret.PSObject.Properties.Add([PSNoteProperty]::new('Items',$items))
                    $outSecret
                }
            }
        } else {
            Write-Warning "No valid session found"
        }
    }
}