Zusammenstellung freier Microsoft eBooks

Im Blog von Eric Ligman finden sich Zusammenstellungen zahlreicher freier Microsoft eBooks in englischer Sprache.

Large collection of Free Microsoft eBooks for you, including: SharePoint, Visual Studio, Windows Phone, Windows 8, Office 365, Office 2010, SQL Server 2012, Azure, and more.

Another large collection of Free Microsoft eBooks and Resource Kits for you, including: SharePoint 2013, Office 2013, Office 365, Duet 2.0, Azure, Cloud, Windows Phone, Lync, Dynamics CRM, and more.

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