Base64- und URL-Codierung in PowerShell

    Base64-Codierung in PowerShellUm binäre Daten zu ver­schicken, werden sie häufig als Base64 kodiert. Umge­kehrt expor­tieren manche Programme bestimmte Daten nur im Base64-Format, so dass man sie erst in Klar­text umwan­deln muss. Beide Auf­gaben 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-Konvertierungs­funktion 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.

    Umwandlung von Base64-kodierten Inhalten in einen String mit PowerShell.

    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().

    Keine Kommentare