Public/Set-ALHSavedCredential.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
<#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
    Object
 
    .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)]
        [ValidateNotNull()]
        [System.IO.FileInfo]
        $Path,

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

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

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

        [Parameter(Mandatory, 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