Schlagwort-Archive: PowerShell Framework

PowerShell ist ein plattformübergreifendes Framework und Skriptsprache von Microsoft zur Automatisierung, Konfiguration und Verwaltung von Systemen.

Text in Base64 und zurück Konvertieren in PowerShell

Base64 ist ein Format, das es erlaubt, Binärdaten in Text, und Text in Binärdaten zu Konvertieren, hier in der PowerShell. Die Base64-Codierung ist ein Prozess zum Konvertieren von Binärdaten in ein ASCII-Zeichenfolgeformat, und die Kodierung von 8-Bit-Binärdaten.

Base64 wandelt Daten (hauptsächlich Bilder) in Zeichen um, und zwar ursprünglich mit einem Satz von 64 Zeichen (Namensursprung), die sich in jedem ISO 8859-1 (auch bekannt als Latin-1) Zeichensatz wiederfinden und somit auch überall anzeigen lassen. Oder anders ausgedrückt: Aus einem Bild wird HTML-Code, denn inzwischen ist Base64 zum HTML-Standard geworden und es wird somit für Internetprojekte eingesetzt, vor allem eben für Inline-Grafiken.

Die Base64 Codierung wird auch häufig bei Mail-Systeme zum Versenden von E-Mail-Anhängen verwendet, da SMTP in seiner ursprünglichen Form nur für den Transport von 7-Bit-ASCII-Zeichen konzipiert war. Durch die Codierung eines Anhangs als Base64 vor dem Senden und die anschließende Decodierung beim Empfang wird sichergestellt, dass ältere SMTP-Server den Anhang nicht beeinträchtigen.

Text in Base64 Konvertieren in PowerShell

Die folgende Funktion Set-Base64 ermöglicht, ein Text in die Base64 Kodierung in der PowerShell zu konvertieren. Die Funktion Get-Base64 sorgt für das konvertieren zurück zum lesbaren Text.

Function Set-Base64
{
	param (
	[String]$arg
	)
	$textout = [System.Text.Encoding]::UTF8.GetBytes($arg)
	[Convert]::ToBase64String($textout)
}

Function Get-Base64
{
	param (
	[String]$arg
	)
	$textout = [Convert]::FromBase64String($arg)
	[System.Text.Encoding]::UTF8.GetString($textout)
}

Hinweis. wenn die Funktionen unter dem %userprofile%\Documents\WindowsPowerShell in die Datei Microsoft.PowerShell_profile.ps1 eingefügt wird, stehen die beiden Befehle in der PowerShell zur Ausführung zur Verfügung.

Base64 Code in Text Konvertieren

In der PowerShell konvertiert Set-Base64 den Text mit Übergabe in Base64 Kodierung, und mit Get-Base64 zurück in den lesbaren Text.

Text in Base64 und zurück konvertieren in PowerShell
Text in Base64 und zurück Konvertieren in PowerShell

Binärdatei in Base64 Codierung Umwandeln

Dateien und Bilder lassen sich in Base64 Text umwandeln, hierzu lässt sich das Powershell-Cmdlet Get-Content verwenden, mit dem Parameter -Encoding Byte und -Raw.

[convert]::ToBase64String((get-content -Path C:\temp\image.png -encoding byte -Raw))

Der Parameter -Raw sorgt dafür, dass die Datei komplett und nicht zeilenweise eingelesen wird, -Encoding Byte sagt PowerShell, dass es sich um eine Binärdatei handelt.

PowerShell: ToBase64String

Bilddatei in Base64 Text Konvertieren

Bilddatei in Base64 Kodierung umwandeln, hierzu wird der PowerShell Befehl convert mit Parameter verwenden, der Base64 Text wird in die Datei image.txt geschreiben.

[convert]::ToBase64String((get-content -Path C:\temp\image.png -encoding byte -Raw)) > C:\temp\image.txt
PowerShell: [convert]::ToBase64String

Woher wiss ich, ob es funktioniert?

Nehmen wir ein weiteres Beispiel mit der Bilddatei bluebox.png, die du auf dein Computer herunterladen kannst. Konvertiere jetzt einfach die kleine 10×10-Pixel Grafik mit dieser Befehlszeile in der PowerShell.

[convert]::ToBase64String((get-content -Path C:\temp\bluebox.png -encoding byte -Raw)) > C:\temp\img.txt

Erstelle als Nächstes eine HTML-Datei mit dem Inhalt wie unten gezeigt.

<div>
  <p>A blue box</p>
  <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYSURBVChTY2RQ+8+AGzBBaRxgZEozMAAAbOYBOV4WE6YAAAAASUVORK5CYII=" alt="Blue box" />
</div>

Füge den Inhalt aus der Datei C:\temp\img.txt ein und platziere den Base64 <img src="data:image/png;base64,code hier" alt="Blue box" />

Doppelklicke auf die soeben erstellte HTML-Datei. Wenn alles richtig gemacht wurde, wird im Browser ein kleines blaues Kästchen angezeigt.

Addendum

Base64 ist keine Verschlüsselungsmethode. Es ist lediglich ein Encoding-Verfahren, das dazu dient, binäre Daten in eine für den Menschen lesbare Form zu konvertieren. Es bietet keine Sicherheit oder Geheimhaltung der Daten.

Base64 kodiert binäre Daten, indem es sie in eine Zeichenfolge von ASCII-Zeichen umwandelt. Dies ist nützlich, wenn man binäre Daten in Umgebungen übertragen möchte, die nur Textdaten unterstützen, wie z.B. E-Mail-Systeme.

  E-Mail mit Anhang „content-transfer-encoding: base64“ senden im Beitrag hier.

Selbstsignierte Zertifikate mit PowerShell erstellen

Manchmal benötigen wir ein selbstsigniertes Zertifikat für Webseiten über HTTPS, insbesondere in Labs und zu Testzwecken, etwa um eine Web-App zu testen oder für das Intranet Portal. Dieses Tutorial zeigt hier mit Windows 11, die Vorgehensweise um einfach selbstsignierte Zertifikate in der PowerShell auszustellen und zu installieren.

Inhalt

Zuvor musste man sich mit makecert.exe behelfen welches ein Teil von Microsoft Windows SDK ist, um selbstsignierte Zertifikate auszustellen. Ab Windows 8 kann dies in der PowerShell erfolgen, so gibt es das cmdlet New-SelfSignedCertificate. Es lassen sich SSL/TLS-Zertifikate ausstellen, für die asymmetrischen Kryptografie, die Client- und Server-Authentifizierung oder die Code-Signierung.

Zertifikat erstellen mit New-SelfSignedCertificate

Öffne hierzu die PowerShell als Administrator und führe die folgenden Befehlszeilen aus.

New-SelfSignedCertificate -DnsName "localdomain.local", "dev.ops.local" -CertStoreLocation "cert:\LocalMachine\My"
$pass=ConvertTo-SecureString "pass123" -AsPlainText -force
$file="$env:temp\SelfSignedCert.pfx"
Export-PFXCertificate -cert cert:\LocalMachine\My\<Thumbprint output during first command> -file $file -Password $pass
Import-PfxCertificate -FilePath $file cert:\LocalMachine\root -Password $pass

In diesem Beispiel wird ein selbstsigniertes SSL-Serverzertifikat im Zertifikatsspeicher des Computers erstellt, wobei der alternative Antragstellername auf localdomain.local, dev.ops.local und der Antragsteller und Ausstellername auf localdomain.local festgelegt ist.

  Platzhalter mit dem tatsächlichen Fingerabdruck (Thumbprint) ersetzen, der anstelle von Thumbprint output during first command eingefügt wird.

Hinweis: Lege die PowerShell-Ausführungsrichtlinie von Restricted auf RemoteSigned oder Unrestricted fest, damit lokale PowerShell-Skripts ausgeführt werden können.

PS C:\> Set-ExecutionPolicy RemoteSigned

Nach erstellen des Zertifikats wird dieses in das PFX-Format exportiert um es anschließend in den Zertifikatsspeicher zu importieren.

Das Zertifikat das gerade ausgestellt wurde, findet man jetzt im Zertifikatsmanager (CERTLM.MSC) der Microsoft Management Console (mmc) unter Vertrauenswürdige Stammzertifizierungsstellen.

Zertifikate Lokaler Computer: CERTLM.MSC

Selbstsignierte Zertifikate automatisch erstellen

Das Automatische Erstellen des selbstsignierten Zertifikats ohne Eingaben, weitere Aktionen sind nicht erforderlich, es wird der Computername und, falls vorhanden, der Domänenname verwendet, um das selbstsignierte Zertifikat auszustellen.

New-SelfSignedCertificate -DnsName "$env:COMPUTERNAME.$env:USERDNSDOMAIN" -CertStoreLocation "cert:\LocalMachine\My"
$pass=ConvertTo-SecureString "pass123" -AsPlainText -force
$file="$env:temp\SelfSignedCert.pfx"
$thumbprint=Get-ChildItem -Path Cert:\LocalMachine\MY | Where-Object {$_.Subject -Match "$env:COMPUTERNAME.$env:USERDNSDOMAIN"} | Select-Object Thumbprint -ExpandProperty "Thumbprint"
Export-PFXCertificate -cert cert:\LocalMachine\My\"$thumbprint" -file $file -Password $pass
Import-PfxCertificate -FilePath $file cert:\LocalMachine\root -Password $pass

Der Fingerabdruck wird in Zeile 4 in die Variable „$thumbprint“ geschrieben, um ihn dann im Export Befehl übergeben zu können.

PS C:\> Get-ChildItem -Path Cert:\LocalMachine\MY | Where-Object {$_.Subject -Match "$env:COMPUTERNAME.$env:USERDNSDOMAIN"} | Select-Object Thumbprint

Mit diesem Befehl kann das gerade erstellte selbstsignierte Zertifikat zur Überprüfung angezeigt werden.

Wenn für das Zertifikat ein bestimmter Common Name (CN) benötigt wird, kann dieses Skript ausgeführt werden. Es fordert dazu auf ein Common Name einzugeben, um das selbstsignierte Zertifikat der URL entsprechend zu erstellen.

$CommonName=Read-Host -Prompt 'Enter a Common Name (CN)'
if ($CommonName) {
	Write-Output "Self-Signed Certificate [$CommonName] processing.."
} else {
	Write-Warning -Message "Missing Common Name (CN)!"
	Break;
}
New-SelfSignedCertificate -DnsName "$CommonName" -CertStoreLocation "cert:\LocalMachine\My"
$pass=ConvertTo-SecureString "pass123" -AsPlainText -force
$file="$env:temp\$CommonName.pfx"
$thumbprint=Get-ChildItem -Path Cert:\LocalMachine\MY | Where-Object {$_.Subject -Match "$CommonName"} | Select-Object Thumbprint -ExpandProperty "Thumbprint"
Export-PFXCertificate -cert cert:\LocalMachine\My\"$thumbprint" -file $file -Password $pass
Import-PfxCertificate -FilePath $file cert:\LocalMachine\root -Password $pass