Im Blog von Eric Ligman finden sich Zusammenstellungen zahlreicher freier Microsoft eBooks in englischer Sprache.
Monat: Oktober 2012
SecureString in einen String umwandeln (PowerShell)
Benutzereingaben lassen sich mit dem Cmdlet Read-Host verarbeiten. Zur Eingabe von sensiblen Daten – wie z.B. Passwörter – bietet die Verwendung des Parameters AsSecureString die Möglichkeit, dass statt dem Klartext während der Eingabe Sternchen angezeigt werden und der Text als sicherer Text im Arbeitsspeicher abgelegt wird. Damit ist dieser vor Hackerangriffen besser geschützt.
$password = Read-Host –AsSecureString –Prompt „Passwort“
Hierdurch enthält die Variable $password nach der Eingabe durch den Benutzer keinesfalls das Passwort im Klartext – vielmehr handelt es sich um ein Objekt vom Typ System.Security.SecureString. Damit wird das Kennwort in verschlüsselter Form gespeichert und kann als Parameter an andere Funktionen auf sichere Weise weitergegeben werden.
Jedoch gibt es manchmal Situationen, bei denen man das Kennwort doch irgendwie benötigt, weil keine Methode zur Übergabe eines SecureString existiert. So ohne weiteres kommt man aber nicht an das Kennwort ran…
Als erstes ist der SecureString mit der SecureToBSTR()-Methode in einen BSTR umzuwandeln. Durch diese Methode wird für den Inhalt des verwalteten SecureString-Objekt ein BSTR im nicht-verwalteten Speicher reserviert und der Inhalt der sicheren Zeichenfolge kopiert. Zurückgeliefert wird die Adresse (vom Typ System.IntPtr) im nicht-verwalteten Speicher. Anschließend wird aus dem BSTR mit PtrToStringAuto() der Inhalt in einen String umgewandelt. Nun hat man das Passwort.
Da durch SecureToBSTR() Speicher im nicht-verwalteten Speicher reserviert wird, muss dieser durch den Aufruf der Methode ZeroFreeBSTR() wieder freigegeben werden. Dazu setzt diese Methode den Inhalt des BSTR auf Null und gibt dann den BSTR frei.
# Paßwort abfragen
$password=Read-Host -AsSecureString -Prompt „Passwort“
# Ausgabe der Paßwortlänge
„Paßwortlänge:“ + $password.Length
# Ausgabe der Variablen $password liefert ‚System.Security.SecureString‘ !
$password
# Umwandeln des SecureString in einen BSTR
$bstr=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
# $bstr ist ein System.IntPtr
„BSTR:“ + $bstr
# Paßwort aus dem BSTR ermitteln
$retpwd=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
# Ausgabe des Paßwort
„Passwort ist:“ + $retpwd
# Freigabe des BSTR Speicherbereich im nicht-verwalteten Speicher
[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
# Erneuter Versuch das Paßwort auszulesen
$retpwd = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
„Passwort ist:“ + $retpwd
Aktuelles Verzeichnis ermitteln oder setzen (C#)
Im Namensraum System.IO liegt die statische Klasse Directory. Mit der Methode SetCurrentDirectory(string path) lässt sich das aktuelle Verzeichnis setzen und mit GetCurrentDirectory() wird ein String mit dem aktuellen Verzeichnis zurückgeliefert.
using System.IO;
Console.WriteLine(Directory.GetCurrentDirectory());
Directory.SetCurrentDirectory(„C:\\Test“);
Credential Objekte (Windows PowerShell)
Credential-Objekte stellen Anmeldeinformationen der Kombination von Benutzername und Kennwort dar. Eine einfache Möglichkeit ein Credential-Objekt zu erhalten, ist das Cmdlet Get-Credential. Mit diesem Cmdlet wird ein Benutzer zur Eingabe von Benutzername und Kennwort aufgefordert.
Nach Eingabe der Anmeldeinformation und Bestätigung wird ein Credential-Objekt zurückgeliefert. Bei einem Abbruch der Eingabe hingegen wird kein Credential-Objekt geliefert.
In der PowerShell 3.0 wurde das Cmdlet erweitert. So lässt sich beispielsweise mit dem Parameter Message ein Text angeben der dem Benutzer während der Eingabe der Anmeldeinformationen angezeigt werden soll.
Das Credential-Objekt besitzt die Eigenschaften UserName und Password. Während UserName als Klartext gespeichert wird, erfolgt die Speicherung des Passworts in verschlüsselter Form als so genannter SecureString. Ein SecureString ist vom Typ System.Security.SecureString und stellt eine sichere Zeichenfolge dar. Die Verschlüsselung erfolgt per Vorgabe über die Windows Data Protection API. Es besteht aber auch die Möglichkeit Verschlüsselungsschlüssel mit einer Länge von 128, 192 oder 256 Bits zu übergeben und mit dem Rijndael-Verschlüsselungsalgorithmus zu verschlüsseln.
Credential-Objekte lassen sich ferner programmgesteuert erzeugen.
$mycred = New-Object System.Management.Automation.PSCredential($username, $spwd)
Das Kennwort muss hier als SecureString übergeben werden, da es ansonsten zu einer Fehlermeldung kommt. Die Konvertierung von verschlüsselten Zeichenfolgen oder Klartext in einen SecureString lässt sich mit dem Cmdlet ConvertTo-SecureString bewerkstelligen.
Der Parameter AsPlainText ermöglicht die Übergabe eines Klartextes. Zur Konvertierung in eine sichere Zeichenfolge muss zusätzlich aber auch der Parameter Force verwendet werden. Ohne die Verwendung von Force kommt es zu einer Fehlermeldung, da ein Schutz durch das System bei dieser Vorgehensweise nicht gewährleistet werden kann.
$spwd = ConvertTo-SecureString „P@ssw0rd“ -AsPlainText -Force
Eine weitere – und auch sicherere Variante – ist die Verwendung des Cmdlet Read-Host unter Verwendung des Parameters AsSecureString. So wird die Eingabe durch den Benutzer angefordert und in einer sicheren Zeichenfolge gespeichert.
$spwd = Read-Host –AsSecureString –Prompt „Passwort eingeben“
Es gibt natürlich weitere Möglichkeiten. So wäre es auch denkbar, dass das Kennwort aus einer Datei ausgelesen wird. Ein SecureString lässt sich nämlich mit dem Cmdlet ConvertFrom-SecureString in eine verschlüsselte Standardzeichenfolge konvertieren, die dann in einer Datei gespeichert werden kann. Nach dem Einlesen kann die verschlüsselte Standardzeichenfolge wiederum in einen SecureString konvertiert werden.
Hat man nun Benutzernamen und Kennwort, lässt sich mit dem Cmdlet New-Object ein Credential-Objekt anlegen
$cred = New-Object System.Management.Automation.PSCredential($username, $spwd)
Nun besitzt man ein Objekt mit Anmeldeinformationen, welches für weitere Arbeiten verwendet werden kann, z.B.
Get-WmiObject Win32_DiskDrive –Computername dc01 –Credential $cred
Kommentare in der Windows PowerShell
Kommentare werden mit der Raute (#) begonnen. Alles was hinter der Raute steht, wird ignoriert. Ab PowerShell 2.0 sind auch mehrzeilige Kommentare möglich. Ein mehrzeiliger Kommentar wird mit <# eingeleitet und mit #> beendet.
# Kommentarzeile
Get-ChildItem -Filter *.docx # Word-Dokumente auflisten
<#
Dies ist
ein mehrzeiliger
Kommentar.
#>