Wer kennt das nicht: Man hätte gern ein PowerShell-Skript, das beim Login einige Anmeldungen automatisch durchführt. Das Skript selbst ist meist auch gar nicht das Problem. Man steht oft nur vor dem Problem, was mit den Passwörtern passiert.Diese als Klartext im Skript zu hinterlegen ist nicht gerade die schönste und sicherste Lösung. Jedes Mal nach dem Passwort gefragt werden ist allerdings auch nicht immer praktikabel.

Im Folgenden zeige ich, wie man ein Passwort sicher speichert, es wieder ausliest und dann in einem Skript verwendet.

Passwörter in der PowerShell - SecureString

Für das Verwenden von Passwörtern in der PowerShell hat Microsoft den SecureString vorgesehen. Er speichert das Passwort innerhalb der PowerShell-Session verschlüsselt. Um einen SecureString zu erzeugen, gibt es mehrere Möglichkeiten:

1.     Das Konvertieren von Klartext in einen SecureString

Hat man in einer Variable $password ein Klartextpasswort, kann man über folgenden Befehl das Passwort als SecureString in der Variable $securePass ablegen: $securePass = $password | ConvertTo-SecureString -AsPlainText -Force

2.     Die direkte Eingabe eines SecureStrings

Über $securePass  = Read-Host -AsSecureString kann man eine Benutzereingabe direkt als SecureString ablegen.

3.     Das Einlesen aus einer Datei

Wie beim Konvertieren aus einem Klartext, kann man auch beim Einlesen aus einer Datei direkt einen SecureString machen: $securePass = cat pass.txt | ConvertTo-SecureString

Das Speichern

Um den SecureString nun auch sicher zu speichern, kann man ihn einfach in eine Textdatei ausgeben. Um den SecureString $securePass verschlüsselt abzuspeichern nimmt man folgenden Befehl:

ConvertFrom-SecureString $securePass | Out-File pass.txt

Das Passwort wird nun nicht als Klartext gespeichert, sondern als kryptische Zahlen-Buchstaben-Kombination.

Das Laden

Um ein zuvor gespeichertes Passwort wieder in einen SecureString zu konvertieren, nimmt man den oben erwähnten Befehl $securePass = cat pass.txt | ConvertTo-SecureString

Zurück zum Klartext

Da viele externe Skripts den SecureString nicht unterstützen, muss man nun aus dem SecureString $securePass wieder Klartext $pass machen. Dies geht über einen kleinen Umweg über den Typ BSTR:

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass) $pass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

Nun hat man in $pass das Klartextpasswort wieder in einer Variable vorliegen und kann es wie gewohnt verwenden.