Public/Set-ALHSavedCredential.ps1

<#PSScriptInfo
 
.VERSION 1.2.0
 
.GUID f3d1fbcd-1063-4e97-b7ae-a03ddbec9827
 
.AUTHOR Dieter Koch
 
.COMPANYNAME
 
.COPYRIGHT (c) 2021-2023 Dieter Koch
 
.TAGS
 
.LICENSEURI https://github.com/admins-little-helper/ALH/blob/main/LICENSE
 
.PROJECTURI https://github.com/admins-little-helper/ALH
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
1.0.0
Initial release
 
1.1.0
Cleaned up code.
 
1.1.1
Fixed issue: Wrong paramter name for Out-File
 
1.2.0
Redesign and code cleanup.
 
1.2.1
Fixed issue when creating $Path failes.
 
#>



<#
 
.DESCRIPTION
Contains a function to store credentials in as secure string in a text file.
 
#>



function Set-ALHSavedCredential {
    <#
    .SYNOPSIS
        Saves credentials (username and password as secure string) in a text file.
 
    .DESCRIPTION
        Saves credentials (username and password as secure string) in a text file.
 
    .PARAMETER Path
        Folder in wich the credential files are stored.
 
    .PARAMETER FileNamePrefix
        Filename prefix to use for credential files.
 
    .PARAMETER Credential
        PSCredential object with username and password.
 
    .PARAMETER Identity
        Username for credentials.
 
    .PARAMETER Secret
        SecureString representing the password.
 
    .PARAMETER Force
        If specified, existing files will be overwritten.
 
    .PARAMETER AsJson
        If specified, the output will be saved in a json file, instead of a text file.
 
    .EXAMPLE
        Set-ALHSavedCredential -Path C:\Admin\Credentials -FileNamePrefix "CredsForApp1" -Identity "MyUserName"
 
        Save credentials for App1. The script will prompt for the password and hide typed characters.
 
    .EXAMPLE
        Set-ALHSavedCredential -Path C:\Admin\Credentials -FileNamePrefix "CredsForApp1" -Identity "MyUserName" -AsJson
 
        Save credentials for App1 in a single JSON file. The script will prompt for the password and hide typed characters.
 
    .EXAMPLE
        Set-ALHSavedCredential -Path C:\Admin\Credentials -FileNamePrefix "CredsForApp1" -Credential (Get-Credential) -AsJson
 
        Save credentials for App1 in a single JSON file. Username and password will be requested.
 
    .INPUTS
        Nothing
 
    .OUTPUTS
        PSCredential
 
    .NOTES
        Author: Dieter Koch
        Email: diko@admins-little-helper.de
 
    .LINK
        https://github.com/admins-little-helper/ALH/blob/main/Help/Set-ALHSavedCredential.txt
    #>


    [OutputType([PSCredential])]
    [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "default")]
    param
    (
        [Parameter(Mandatory = $true)]
        [ValidateNotNull()]
        [System.IO.FileInfo]
        $Path,

        [Parameter(Mandatory = $true)]
        [ValidateNotNull()]
        [String]
        $FileNamePrefix,

        [Parameter(Mandatory = $true, ParameterSetName = "PSCredential")]
        [ValidateNotNull()]
        [PSCredential]
        $Credential,

        [Parameter(Mandatory = $true, ParameterSetName = "IdentitySecret")]
        [ValidateNotNull()]
        [String]
        $Identity,

        [Parameter(Mandatory = $true, ParameterSetName = "IdentitySecret")]
        [ValidateNotNull()]
        [SecureString]
        $Secret,

        [Switch]
        $Force,

        [Switch]
        $AsJson
    )

    if ($PSCmdlet.ParameterSetName -eq "IdentitySecret") {
        $Credential = New-Object System.Management.Automation.PSCredential ($Identity, $Secret)
    }

    Write-Verbose -Message "Checking if path and filename already exist."
    if (Test-Path -Path $Path -ErrorAction SilentlyContinue) {
        Write-Verbose -Message "Path exists and is accessible."

        $FullPathFileIdentity = Join-Path -Path $Path -ChildPath "$($FileNamePrefix)_Identity.txt"
        $FullPathFileSecret = Join-Path -Path $Path -ChildPath "$($FileNamePrefix)_Secret.txt"
        $FullPathFilCredential = Join-Path -Path $Path -ChildPath "$($FileNamePrefix)_Credential.json"

        $FileList = @($FullPathFileIdentity, $FullPathFileSecret, $FullPathFilCredential)
        foreach ($File in $FileList) {
            if (Test-Path -Path $File) {
                if ($Force.IsPresent) {
                    Write-Warning -Message "File already exists and will be overwritten: [$File]"
                }
                else {
                    Write-Warning -Message "File already exists. Stopping here. To overwrite existing file use parameter '-Force': [$File]"
                    return $null
                }
            }
        }
    }
    else {
        Write-Verbose -Message "Path does not exist, trying to create it."

        try {
            $null = New-Item -Path $Path -ItemType Directory -Force -ErrorAction Stop
        }
        catch {
            Write-Error -Message "Error creating path [$Path]."
            return $null
        }
    }

    if ($AsJson.IsPresent) {
        [PSCustomObject]$MyCredentialObject = @{
            Username = $Credential.UserName
            Password = $Credential.Password | ConvertFrom-SecureString
        }

        Write-Verbose -Message "Saving credential to json file."
        $MyCredentialObject | ConvertTo-Json | Out-File -FilePath $FullPathFilCredential -Force -Encoding utf8
    }
    else {
        Write-Verbose -Message "Saving identity value to file."
        $Credential.UserName | Out-File -FilePath "$FullPathFileIdentity" -Force -Encoding utf8

        Write-Verbose -Message "Saving secret value to file."
        $Credential.Password | ConvertFrom-SecureString | Out-File -FilePath "$FullPathFileSecret" -Force -Encoding utf8
    }

    Write-Verbose -Message "Returning saved credentials."
    $GetSavedCredentialParams = @{
        Path           = $Path
        FileNamePrefix = $FileNamePrefix
    }
    if ($AsJson.IsPresent) { $GetSavedCredentialParams.AsJson = $true }
    $SavedCredential = Get-ALHSavedCredential @GetSavedCredentialParams
    return $SavedCredential
}

#region EndOfScript
<#
################################################################################
################################################################################
#
# ______ _ __ _____ _ _
# | ____| | | / _| / ____| (_) | |
# | |__ _ __ __| | ___ | |_ | (___ ___ _ __ _ _ __ | |_
# | __| | '_ \ / _` | / _ \| _| \___ \ / __| '__| | '_ \| __|
# | |____| | | | (_| | | (_) | | ____) | (__| | | | |_) | |_
# |______|_| |_|\__,_| \___/|_| |_____/ \___|_| |_| .__/ \__|
# | |
# |_|
################################################################################
################################################################################
# created with help of http://patorjk.com/software/taag/
#>

#endregion