PowerShell Cmdlet zum Auslesen der Anmeldeinformationen aus der “Windows Anmeldeinformationsverwaltung”

Will man PowerShell-Operationen automatisieren benötigt man gelegentlich Anmeldeinformationen, welche dann irgendwie im Script zur Verfügung gestellt werden müssen. Normalerweise erledigt man dies über Get-Credential, welches allerdings immer eine Benutzerabfrage bedingt und in einem automatisch ablaufenden Script nutzlos ist.

Der einfachste (aber auch unsicherste) Weg ein Passwort auszulesen ist folgender:

$password = ConvertTo-SecureString <plaintextpassword> -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential <username>, $password

Dass dies nicht der bevorzugte Weg ist, sieht man am Umstand, dass der Paramter –Force angegeben werden muss, da ansonsten folgender Fehler ausgegeben wird: “Nur-Text-Eingaben können vom System nicht geschützt werden.”
Und wenn man (hoffentlich) etwas nachdenkt, ist dieses Verhalten auch vollkommen verständlich, denn wer will schon seine Passwörter im Klartext in einer Textdatei hinterlegen.
Auf der anderen Seite ist es doch immer wieder praktisch Logininformationen eines Systems zu ermitteln, indem man Dateien mit den klingenden Namen config.(php|asp|*), connection.(php|asp|*), usw.. durchstöbert. Zwinkerndes Smiley

Nun gibt es zwei Möglichkeiten Passwörter sicher zu hinterlegen

  1. Das Password wird verschlüsselt im Script selbst hinterlegt oder in einer Datei ausgelagert.
  2. Die Anmeldeinformationen werden im “Windows Credential Manager” (das ist die englische Bezeichnung für die Windows Anmeldeinformationsverwaltung) hinterlegt.

Methode 1: PowerShell “out-of-the-box”

Das Password wird in eine Date gespeichert:

// Die Login-Informationen werden abgefragt
$credential = Get-Credential
// Das Password wird in einer Datei gespeichert
$credential.Password | ConvertFrom-SecureString | Set-Content <file>

Das Auslesen des Passwortes wird dann folgendermaßen erledigt:

$password = Get-Content <file> | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential(<username>, $password)

Dieses PSCredential kann man dann den Cmdlets übergeben, welche die Anmeldeinforationen benötigen (z.B. Enter-PSSesssion <server> –Credential $credential).

Zu beachten ist, dass diese Methode nur funktioniert, wenn das Passwort auf demselben Computer ausgelesen wird, auf welchem es auch erstellt wurde, da für die Verschlüsselung/Entschlüsselung der MachineKey verwendet wird.

Damit die Methode über mehrere Computer funktioniert, kann man entweder den MachineKey der Computer angleichen (!) oder ConvertFrom-SecureString und ConvertTo-SecureString einen –Key oder -SecureKey übergeben, welcher dann wiederum sicher aufbewahrt werden sollte, und da man dies mit Methode 1 endlos wiederholen müsste, würde sich Methode 2 anbieten. Zwinkerndes Smiley

Methode 2: “Windows Anmeldeinformationsverwaltung”

Informationen zur Windows Anmeldeinformationverwaltung (englisch: Windows Credential Manager) findet man hier: http://windows.microsoft.com/de-DE/windows7/What-is-Credential-Manager

Hinterlegt werden diese Anmeldeinformationen über Systemsteuerung/Benutzerkonten/Anmeldeinformationsverwaltung. Dabei wird eine Internet- oder Netzwerkadresse (welche später als Schlüssel dient) das Login und das Passwort hinterlegt.

Leider bietet PowerShell keine Möglichkeiten diese Anmeldeinformationen nativ auszulesen. Aus diesem Grund habe ich ein PowerShell Cmdlet erstellt, welches diese Aufgabe übernimmt.

Die Datei findet man hier:

Die Verwendung gestaltet sich dann wie folgt:

$credential = .\Get-CredentialFromWindowsCredentialManager.ps1 <internet- oder netzwerkadresse>
Enter-PSSession <server> –Credential $credential

Die Anmeldeinformationen sind lokal und Benutzerbezogen, das heißt natürlich, sie sind bei Bedarf für ein weiteres Benutzerkonto oder auf einem weiteren Rechner ebenfalls im Windows Credential Manager des jeweiligen Benutzerkontos zu hinterlegen.

About these ads
Tagged , , ,

2 thoughts on “PowerShell Cmdlet zum Auslesen der Anmeldeinformationen aus der “Windows Anmeldeinformationsverwaltung”

  1. skyerjoe says:

    Hallo

    Irgendwie verstehe ich diese Zeile nicht so ganz:

    $credential = New-Object System.Management.Automation.PsCredential(, $password)

    Was muss ich hier bei username eintragen ….

    grüße skyerjoe

    • tobiburger says:

      Hier musst du den Benutzernamen eintragen, mit welchem du das Cmdlet ausführen willst.

      $credential = New-Object System.Management.Automation.PsCredential("skyerjoe", $password)

      Anschließend kannst du das “credential” Objekt verwenden

      Invoke-WebRequest -Credential $credential -Uri "http://webserver/service"

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 36 other followers

%d bloggers like this: