Tags: PowerShell, Datei-Management
Um binäre Daten zu verschicken, werden sie häufig als Base64 kodiert. Umgekehrt exportieren manche Programme ihre Daten nur im Base64-Format, so dass man sie erst in Klartext umwandeln muss. Beide Aufgaben lassen sich in PowerShell mit Hilfe von .NET-Klassen erledigen.
Ein gängiges Anliegen besteht darin, in einem Binärformat vorliegende Zertifikate mit Base64 zu kodieren, um sie etwa in einer Web-basierten Management-Umgebung zum Download per Copy & Paste anzubieten. Dies lässt sich auch mit PowerShell bewerkstelligen.
Byte-weises Einlesen von Binärdateien
Im ersten Schritt liest man den Inhalt der Datei mit Get-Content ein, wobei man ihn nicht wie üblich als Array von Strings erfasst, sondern als Bytes. Das Ergebnis übersetzt man dann in die Base64-Darstellung:
$b = Get-Content -Encoding Byte -Path .\cert.pfx
[Convert]::ToBase64String($b) > .\cert.b64
Dieses Beispiel speichert die eingelesenen Bytes in der Variablen $b zwischen und übergibt sie dann der .NET-Konvertierungsfunktion ToBase64String(). Der Output gelangt schließlich über einen Redirect in die Datei cert.b64.
Für den umgekehrten Weg liest man die Base64-kodierte Datei ein, wandelt sie wieder in ein Byte-Array um und schreibt dieses zurück in eine Binärdatei:
$dec = [Convert]::FromBase64String((Get-Content -Path .\cert.b64))
[IO.File]::WriteAllBytes(".\neu.pfx", $dec)
Passwörter lesbar machen
Eine andere Anwendung könnte beispielsweise darin bestehen, die gespeicherten FTP-Server von Filezilla zu exportieren und die in der XML-Datei enthaltenen Passwörter lesbar zu machen. In diesem Fall benötigt man nicht den Umweg über Dateien und kann die Umwandlung direkt auf der Befehlszeile erledigen:
$pwd = [Convert]::FromBase64String("RWluIFRlc3Q=")
[System.Text.Encoding]::UTF8.GetString($pwd)
FromBase64String() liefert ein Array von Bytes, das erst mit Hilfe von UTF8.GetString() zu einer Zeichenkette umgewandelt wird.
Hat man das umgekehrte Anliegen und will einen String mit Base64 kodieren, dann erledigt man das mit einem Aufruf nach diesem Muster:
$pwd =[System.Text.Encoding]::UTF8.GetBytes("Ein Test")
[Convert]::ToBase64String($pwd)
Das Kommando wandelt die eingegebene Zeichenkette "Ein Test" in Bytes um und übergibt das Resultat der Funktion ToBase64String().
URL-Kodierung
Eine ebenfalls häufig benötigte Kodierung ist jene für URLs, besonders dann, wenn diese von einem Script erzeugt werden. Diese Aufgabe kann in PowerShell anstehen, wenn man Web-Inhalte über Invoke-WebRequest herunterladen möchte. In diesem Fall können Leer- oder andere Zeichen zu Syntaxfehlern führen.
Die URL-Codierung ist wesentlich unkomplizierter als jene für Base64 und Bedarf nur eines Funktionsaufrufs:
[uri]::EscapeDataString('http://Ungültige URL/')
Das Ergebnis dieses Befehls ist
http%3A%2F%2FUng%C3%BCltige%20URL%2F
Den Weg zurück erlaubt die Funktion UnescapeDataString().
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links