Public/xcrypt/Get-SavedCredential.ps1

function Get-SavedCredential {
  <#
    .SYNOPSIS
        Get SavedCredential
    .DESCRIPTION
        Gets Saved Credential from credential vault
    .NOTES
        This function is not supported on Linux
    .LINK
        https://github.com/alainQtec/cliHelper.core
    .EXAMPLE
        Get-SavedCredential 'My App'
        Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
    #>

  [CmdletBinding(DefaultParameterSetName = 'default')]
  [OutputType([CredManaged])]
  param (
    # Target /title /name of the saved credential
    [Parameter(Position = 0, Mandatory = $false, ParameterSetName = '__AllParameterSets')]
    [Alias('Name', 'TargetName')][ValidateNotNullOrEmpty()]
    [string]$Target,

    # Username / Owner
    [Parameter(Position = 1, Mandatory = $false, ParameterSetName = 'default')]
    [Parameter(Position = 2, Mandatory = $false, ParameterSetName = 'byCrtyp')]
    [Alias('usrnm')][ValidateNotNullOrEmpty()]
    [string]$UserName,

    # Credential type.
    [Parameter(Position = 1, Mandatory = $false, ParameterSetName = 'byCrtyp')]
    [ValidateSet('Generic', 'DomainPassword', 'DomainCertificate', 'DomainVisiblePassword', 'GenericCertificate', 'DomainExtended', 'Maximum', 'MaximumEx')]
    [Alias('CredType')][ValidateNotNullOrEmpty()]
    [string]$Type = 'Generic'
  )

  begin {
    $CredentialManager = [CredentialManager]::new(); $Savd_Cred = $null
    $params = $PSCmdlet.MyInvocation.BoundParameters;
    $GetTargetName = [scriptblock]::Create({
        if ([Environment]::UserInteractive -and [Environment]::GetCommandLineArgs().Where({ $_ -like '-NonI*' }).Count -eq 0) {
          $t = Read-Host -Prompt "TargetName"
          if ([string]::IsNullOrWhiteSpace($t)) {
            throw 'Null Or WhiteSpace targetName is not valid'
          }
          $t
        } else {
          throw 'Please Input valid Name'
        }
      }
    )
  }

  process {
    $_Target = $(if ($params.ContainsKey('Target') -and [string]::IsNullOrWhiteSpace($Target)) {
        Invoke-Command -ScriptBlock $GetTargetName
      } elseif (!$params.ContainsKey('Target')) {
        Invoke-Command -ScriptBlock $GetTargetName
      } else {
        $Target
      }
    )
    $Savd_Cred = $(if ($PSCmdlet.ParameterSetName -eq 'default') {
        $CredentialManager.GetCredential($_Target, $UserName)
      } elseif ($PSCmdlet.ParameterSetName -eq 'byCrtyp') {
        if ($params.ContainsKey('type')) {
          $CredentialManager.GetCredential($_Target, $Type, $UserName)
        } else {
          $CredentialManager.GetCredential($_Target, $Type, $UserName)
        }
      }
    )
    if ([CredentialManager]::LastErrorCode.Equals([CredentialManager]::ERROR_NOT_FOUND)) {
      throw [CredentialNotFoundException]::new("$_Target not found.", [System.Exception]::new("Exception of type 'ERROR_NOT_FOUND' was thrown."))
    }
    if ([string]::IsNullOrWhiteSpace($Savd_Cred.target)) {
      Write-Warning "Could not resolve the target Name for: $_Target"
    }
  }

  end {
    return $Savd_Cred
  }
}