Menu

Virtual Geek

Tales from real IT system administrators world and non-production environment

Terraform String Encoding and Decoding with PowerShell

This is another script I have written to encode and decode string for Terraform using PowerShell GUI. These scripts helps me in the live demonstrations and PowerPoint to client about infrastructure as a code. Once script is executed in PowerShell GUI, it looks like below, It helps to Base64 Encode given string, In the same GUI, this helps to Decode encoded string back to human readable format string. I find this process very Simple and efficient.

A screenshot of a PowerShell GUI tool for encoding and decoding strings for Terraform. The tool shows how to use the base64encode and textdecodebase64 functions.

Earlier PowerShell GUI CodeSelf-Signed Certificates Made Easy with PowerShell GUI

Download Terraform Encode/Decode String Tool here or it is also available on github.com.

  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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#    .NOTES
#    --------------------------------------------------------------------------------
#     Generated on:            13-Sep-25 8:15 PM
#     Generated for:           Terrafrorm Encode/Decode String
#     PowerShell Version:      V7
#    --------------------------------------------------------------------------------
#    .DESCRIPTION
#        vcloud-lab.com Terraform Encode/Decode String

$assemblies = ('System.Windows.Forms', 'System.Data', 'System.Drawing', 'PresentationFramework')
$assemblies | Foreach-Object {[void][reflection.assembly]::Load($_)}
Add-Type -AssemblyName "System.Drawing", "System.Windows.Forms", "System.Data", "System.Design", "PresentationFramework"

[System.Windows.Forms.Application]::EnableVisualStyles()
$formEncodeDecodeString = New-Object 'System.Windows.Forms.Form'
$richtextbox = New-Object 'System.Windows.Forms.RichTextBox'
$statusstrip = New-Object 'System.Windows.Forms.StatusStrip'
$picturebox = New-Object 'System.Windows.Forms.PictureBox'
$textboxOutput = New-Object 'System.Windows.Forms.TextBox'
$buttonEncode = New-Object 'System.Windows.Forms.Button'
$radiobuttonDecode = New-Object 'System.Windows.Forms.RadioButton'
$radiobuttonEncode = New-Object 'System.Windows.Forms.RadioButton'
$textboxInput = New-Object 'System.Windows.Forms.TextBox'
$labelStringToEncode = New-Object 'System.Windows.Forms.Label'
$toolstripstatuslabel = New-Object 'System.Windows.Forms.ToolStripStatusLabel'
$InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'

$radiobuttonEncode_CheckedChanged={
    $labelStringToEncode.Text = 'String to Encode:'
    $buttonEncode.Text = 'Encode'
    $textboxInput.Text = 'Password123!'
    $textboxOutput.Text = 'UGFzc3dvcmQxMjMh'
}

$radiobuttonDecode_CheckedChanged={
    $labelStringToEncode.Text = 'String to Decode:'
    $buttonEncode.Text = 'Decode'
    $textboxInput.Text = 'UGFzc3dvcmQxMjMh'
    $textboxOutput.Text = 'Password123!'
}

$buttonEncode_Click={
    if ($radiobuttonEncode.Checked)
    {
        $originalString = $textboxInput.Text  #"Password123!"
        $bytes = [System.Text.Encoding]::UTF8.GetBytes($originalString)
        $encodedString = [System.Convert]::ToBase64String($bytes)
        #Write-Host "Encoded String (UTF8): $encodedString"
        $textboxOutput.Text = $encodedString
    }
    
    if ($radiobuttonDecode.Checked)
    {
        $error.Clear()
        try {
            $encodedString = $textboxInput.Text.Trim() #"UGFzc3dvcmQxMjMh" # Base64 for "Password123!" (UTF8)
            $decodedBytes = [System.Convert]::FromBase64String($encodedString)
            $decodedString = [System.Text.Encoding]::UTF8.GetString($decodedBytes)
            #Write-Host "Decoded String (UTF8): $decodedString"
            $textboxOutput.Text = $decodedString
        }
        catch {
            $textboxOutput.Text = 'Error: Invalid encoded string provided!'
        }
    }
}

$Form_StateCorrection_Load=
{
    $formEncodeDecodeString.WindowState = $InitialFormWindowState
}

$Form_Cleanup_FormClosed=
{
    try
    {
        $buttonEncode.remove_Click($buttonEncode_Click)
        $radiobuttonDecode.remove_CheckedChanged($radiobuttonDecode_CheckedChanged)
        $radiobuttonEncode.remove_CheckedChanged($radiobuttonEncode_CheckedChanged)
        $formEncodeDecodeString.remove_Load($formEncodeDecodeString_Load)
        $formEncodeDecodeString.remove_Load($Form_StateCorrection_Load)
        $formEncodeDecodeString.remove_FormClosed($Form_Cleanup_FormClosed)
    }
    catch { 
        Out-Null 
    }
    $formEncodeDecodeString.Dispose()
    $labelStringToEncode.Dispose()
    $textboxInput.Dispose()
    $radiobuttonEncode.Dispose()
    $radiobuttonDecode.Dispose()
    $buttonEncode.Dispose()
    $textboxOutput.Dispose()
    $picturebox.Dispose()
    $statusstrip.Dispose()
    $toolstripstatuslabel.Dispose()
    $richtextbox.Dispose()
}

$formEncodeDecodeString.SuspendLayout()
$picturebox.BeginInit()
$statusstrip.SuspendLayout()

$formEncodeDecodeString.Controls.Add($richtextbox)
$formEncodeDecodeString.Controls.Add($statusstrip)
$formEncodeDecodeString.Controls.Add($picturebox)
$formEncodeDecodeString.Controls.Add($textboxOutput)
$formEncodeDecodeString.Controls.Add($buttonEncode)
$formEncodeDecodeString.Controls.Add($radiobuttonDecode)
$formEncodeDecodeString.Controls.Add($radiobuttonEncode)
$formEncodeDecodeString.Controls.Add($textboxInput)
$formEncodeDecodeString.Controls.Add($labelStringToEncode)
$formEncodeDecodeString.AutoScaleDimensions = New-Object System.Drawing.SizeF(8, 17)
$formEncodeDecodeString.AutoScaleMode = 'Font'
$formEncodeDecodeString.ClientSize = New-Object System.Drawing.Size(467, 348)
$formEncodeDecodeString.FormBorderStyle = 'FixedDialog'
$formEncodeDecodeString.Name = 'formEncodeDecodeString'
$formEncodeDecodeString.Text = 'Encode/Decode String for Terraform'
$formEncodeDecodeString.add_Load($formEncodeDecodeString_Load)

$richtextbox.Location = New-Object System.Drawing.Point(13, 131)
$richtextbox.Margin = '4, 4, 4, 4'
$richtextbox.Name = 'richtextbox'
$richtextbox.ReadOnly = $True
$richtextbox.Size = New-Object System.Drawing.Size(435, 176)
$richtextbox.TabIndex = 8
$richtextbox.Text = 'How to encode and decode string in Terraform?

To encode string use below function:
base64encode("Password123!")     # Output: UGFzc3dvcmQxMjMh

To decode string use below function:
textdecodebase64("UGFzc3dvcmQxMjMh")     # Output: Password123!
'
[void]$statusstrip.Items.Add($toolstripstatuslabel)
$statusstrip.Location = New-Object System.Drawing.Point(0, 323)
$statusstrip.Name = 'statusstrip'
$statusstrip.Padding = '1, 0, 19, 0'
$statusstrip.Size = New-Object System.Drawing.Size(467, 25)
$statusstrip.TabIndex = 7
$statusstrip.Text = 'statusstrip'

$ImageString = @"
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
"@
$System_IO_MemoryStream = [System.IO.MemoryStream][System.Convert]::FromBase64String($ImageString)

$picturebox.Image = [System.Drawing.Image]::FromStream($System_IO_MemoryStream)
$System_IO_MemoryStream = $null

$picturebox.Location = New-Object System.Drawing.Point(371, 23)
$picturebox.Margin = '4, 4, 4, 4'
$picturebox.Name = 'picturebox'
$picturebox.Size = New-Object System.Drawing.Size(77, 66)
$picturebox.TabIndex = 6
$picturebox.TabStop = $False

$textboxOutput.Font = [System.Drawing.Font]::new('Microsoft Sans Serif', '12')
$textboxOutput.Location = New-Object System.Drawing.Point(13, 93)
$textboxOutput.Margin = '4, 4, 4, 4'
$textboxOutput.Name = 'textboxOutput'
$textboxOutput.ReadOnly = $True
$textboxOutput.Size = New-Object System.Drawing.Size(435, 30)
$textboxOutput.TabIndex = 5
$textboxOutput.Text = 'UGFzc3dvcmQxMjMh'
$textboxOutput.TextAlign = 'Center'

$buttonEncode.Location = New-Object System.Drawing.Point(263, 54)
$buttonEncode.Margin = '4, 4, 4, 4'
$buttonEncode.Name = 'buttonEncode'
$buttonEncode.Size = New-Object System.Drawing.Size(100, 30)
$buttonEncode.TabIndex = 4
$buttonEncode.Text = 'Encode'
$buttonEncode.UseVisualStyleBackColor = $True
$buttonEncode.add_Click($buttonEncode_Click)

$radiobuttonDecode.Location = New-Object System.Drawing.Point(107, 54)
$radiobuttonDecode.Margin = '4, 4, 4, 4'
$radiobuttonDecode.Name = 'radiobuttonDecode'
$radiobuttonDecode.Size = New-Object System.Drawing.Size(86, 31)
$radiobuttonDecode.TabIndex = 3
$radiobuttonDecode.Text = 'Decode'
$radiobuttonDecode.UseVisualStyleBackColor = $True
$radiobuttonDecode.add_CheckedChanged($radiobuttonDecode_CheckedChanged)

$radiobuttonEncode.Checked = $True
$radiobuttonEncode.Location = New-Object System.Drawing.Point(13, 54)
$radiobuttonEncode.Margin = '4, 4, 4, 4'
$radiobuttonEncode.Name = 'radiobuttonEncode'
$radiobuttonEncode.Size = New-Object System.Drawing.Size(86, 31)
$radiobuttonEncode.TabIndex = 2
$radiobuttonEncode.Text = 'Encode'
$radiobuttonEncode.UseVisualStyleBackColor = $True
$radiobuttonEncode.add_CheckedChanged($radiobuttonEncode_CheckedChanged)

$textboxInput.ImeMode = 'NoControl'
$textboxInput.Location = New-Object System.Drawing.Point(138, 23)
$textboxInput.Margin = '4, 4, 4, 4'
$textboxInput.Name = 'textboxInput'
$textboxInput.Size = New-Object System.Drawing.Size(225, 23)
$textboxInput.TabIndex = 1
$textboxInput.Text = 'Password123!'

$labelStringToEncode.AutoSize = $True
$labelStringToEncode.Location = New-Object System.Drawing.Point(13, 26)
$labelStringToEncode.Margin = '4, 0, 4, 0'
$labelStringToEncode.Name = 'labelStringToEncode'
$labelStringToEncode.Size = New-Object System.Drawing.Size(117, 17)
$labelStringToEncode.TabIndex = 0
$labelStringToEncode.Text = 'String to Encode:'

$toolstripstatuslabel.Name = 'toolstripstatuslabel'
$toolstripstatuslabel.Size = New-Object System.Drawing.Size(160, 20)
$toolstripstatuslabel.Text = 'Powered by vcloud-lab.com'
$statusstrip.ResumeLayout()
$picturebox.EndInit()
$formEncodeDecodeString.ResumeLayout()

$InitialFormWindowState = $formEncodeDecodeString.WindowState
$formEncodeDecodeString.add_Load($Form_StateCorrection_Load)
$formEncodeDecodeString.add_FormClosed($Form_Cleanup_FormClosed)
$formEncodeDecodeString.ShowDialog() | Out-Null

When working with Terraform you can use below code to encode and decode given string.

locals {
  original_string = "Password123!" // The string you want to encode
  encoded_string  = base64encode(local.original_string)
}

output "encoded_output" {
  value = local.encoded_string
}

########################################################################################

locals {
  existing_encoded_string   = "UGFzc3dvcmQxMjMh" // This is "Password123!" Base64 encoded
  decoded_string   = textdecodebase64(local.existing_encoded_string, "UTF-8")
}

output "decoded_output" {
  value = local.decoded_string
}

######################################## Result ###############################################

terraform plan

Changes to Outputs:
  + decoded_output = "Password123!"
  + encoded_output = "UGFzc3dvcmQxMjMh"

You can apply this plan to save these new output values to the Terraform state, without changing any real infrastructure.
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Useful Articles
Get Nutanix virtual machine details using PowerShell #AHV #AOS
From Manual to Automated - Managing Dell iDRAC Power via Redfish API and PowerShell
Turn Your PowerShell Into a Web Server: Instantly Share Local HTML & Files!
Monitoring Dell Server Health Using RACADM CLI: Sensor Info from iDRAC
PowerShell Create and Export Self-Signed RSA Certificates (PFX, CER, PEM)
How to create byte array in PowerShell
Automate Intune MDM Device Sync: A PowerShell Script for Microsoft Graph API
Streamlining Intune MDM Device Management with Microsoft Graph and PowerShell
PowerShell & Microsoft Graph API: Automate Full Intune Devices Sync more than 1000 Pagination
Self-Signed Certificates Made Easy with PowerShell GUI

Go Back

Comment

Blog Search

Page Views

13869636

Archive

Follow me on Blogarama