Windows PowerShellAutomatisieren der Verzeichnisverwaltung

Don Jones

Einer der missglückten Aspekte der ersten Version von Windows PowerShell ist der Zeitpunkt der Veröffentlichung. Das Windows PowerShell-Team stand mit der Lieferung des Produkts unter erheblichem Druck (die Veröffentlichung von Exchange Server 2007 hing praktisch von Windows PowerShell ab), und das Active

Directory-Team hatte zu der Zeit viel zu tun (Windows Server® 2008 befand sich auch schon in den Startlöchern). Daher wurde Windows PowerShell mit unterdurchschnittlichen Active Directory®-Verwaltungsfunktionen geliefert.

Nur der Klarheit halber: Es ist nicht so, dass Windows PowerShell® überhaupt keine Active Directory-Features enthält. In der Tat hat das Windows PowerShell-Team in letzter Minute einen heroischen Kraftakt an den Tag gelegt, um eine annehmbare Unterstützung für ADSI (Active Directory Services Interface) einzuarbeiten, eine für die Skripterstellung geeignete Technologie, die Benutzern von VBScript bereits bekannt ist.

Funktionsweise von ADSI

ADSI ähnelt in seiner Funktionsweise der Windows®-Verwaltungsinstrumentation (Windows Management Instrumentation, WMI). Sie erstellen eine Abfrage, die Sie mithilfe einer besonderen Syntax schreiben. Die Abfrage wird an einen Remotecomputer (z. B. einen Domänencontroller) weitergeleitet und dann ausgeführt. Das Ergebnis der Abfrage ist ein Active Directory-Objekt oder eine Sammlung von Objekten (z. B. ein Benutzer oder eine Gruppe), und Sie erhalten einen Verweis zum entsprechenden Objekt, mit dem Sie dann arbeiten können. Sie können die Objekteigenschaften ändern oder Methoden ausführen, um Ihre Änderungen zu speichern, neue Objekte zu erstellen, Objekte zu löschen und so weiter. Zum Erstellen eines Benutzers beispielsweise fragen Sie die Organisationseinheit oder den Container ab, in dem Sie den Benutzer platzieren wollen. Das zurückgegebene Objekt enthält eine Create-Methode, die zum Erstellen des Benutzers verwendet werden kann.

Grundsätzlich ist das Verwenden von ADSI in Windows PowerShell einfach und übersichtlich. Zum Beispiel wird durch diesen Befehl ein Benutzer abgerufen und sein Company-Attribut angezeigt:

$user = [ADSI]"LDAP://cn=Ringo,ou=Singers,dc=company,dc=pri"
$user.Get("Company")

Sie können den Benutzer zu Get-Member leiten, um seine Eigenschaften und Methoden anzuzeigen. Leider zählt die Implementierung dieser Verzeichnisobjekte nicht zu den Stärken von Windows PowerShell 1.0. Wie in Abbildung 1 dargestellt, zählt die Shell die Verzeichnisattribute des Objekts nicht auf, und sie zeigt auch die Methoden des Objekts, zum Beispiel die verwendete Get-Methode, nicht an.

Abbildung 1 Leiten des Benutzers zu Get-Member zur Anzeige seiner Eigenschaften

Abbildung 1** Leiten des Benutzers zu Get-Member zur Anzeige seiner Eigenschaften **(Klicken Sie zum Vergrößern auf das Bild)

Dieser Support wurde im Community Technology Preview (CTP) von Windows PowerShell 2.0 teilweise verbessert. Im Endeffekt macht das zugrunde liegende Microsoft® .NET Framework es Administratoren nicht einfach, die gewünschten Informationen anzuzeigen. Das Framework wurde immerhin ursprünglich für Entwickler entworfen. Das andere Problem besteht darin, dass das Windows PowerShell-Team zwar seinen Teil beitragen kann, eine optimale Active Directory-Unterstützung aber von dem Team bereitgestellt werden sollte, das sich am besten mit Verzeichnissen auskennt: dem Active Directory-Team. Dies wird mit der Zeit sicher geschehen, schließlich ist Windows PowerShell ja noch ein relativ neues Tool. Doch wie gehen Sie in der Zwischenzeit vor?

Vielleicht erinnern Sie sich, dass das Verwenden der ADSI-Technologien in einem Artikel der Windows PowerShell-Ausgabe vom Juni 2007 behandelt wurde (technetmagazine.com/issues/2007/06/PowerShell). Es empfiehlt sich, diesen Artikel noch einmal zu lesen, wenn Sie weitere Einzelheiten zu diesem „systemeigenen“ Verfahren wünschen. In dieser Ausgabe sollen einige andere Ansätze erläutert werden.

Ein umfangreiches Ökosystem

Der Windows PowerShell-Architekt Jeffrey Snover bezieht sich häufig auf das umfangreiche Ökosystem, das Windows PowerShell umgibt. Das heißt praktisch, dass das Team gute Arbeit geleistet und sichergestellt hat, dass die Funktionen von Windows PowerShell von beliebigen Personen erweitert werden können, nicht nur von Programmierern bei Microsoft. Eine Reihe von Unternehmen, darunter VMWare, IBM, Citrix und Foundry, ist bereits dabei und erstellt systemeigene Windows PowerShell-Cmdlets, die Ihnen ermöglichen, die jeweiligen Produkte von der Befehlszeile aus zu verwalten.

Eines meiner Lieblingsbeispiele für dieses umfangreiche Ökosystem ist die Quest-Software. Das Unternehmen bietet einen Satz von kostenlosen, nichtgewerblichen Cmdlets für die Active Directory-Verwaltung an. Sie können diese Cmdlets unter quest.com/powershell herunterladen. Ein weiteres Produkt von Quest ist PowerGUI (powergui. org), eine kostenlose, nichtgewerbliche grafische Benutzeroberfläche, die über der Windows PowerShell-Oberfläche installiert wird und für diejenigen ideal ist, die sich noch nicht an eine vollständige Befehlszeilenoberfläche wagen. PowerGUI erleichtert es außerdem, das Verwenden von Active Directory-Verwaltungs-Cmdlets zu erlernen. Eins steht fest: Verwenden werden Sie sie auf jeden Fall. Diese Cmdlets ermöglichen Ihnen eine bequeme und leistungsstarke Active Directory-Verwaltung, die einfach beispiellos ist. (Wenn Sie mehr über PowerGUI lesen wollen, empfiehlt sich der im Januar 2008 veröffentlichte Toolbox-Artikel, den Sie unter technetmagazine.com/issues/2008/01/Toolbox finden.)

Die Windows PowerShell-Funktionsweise

Wann immer Cmdlets zur Anwendung kommen, haben Sie es ganz und gar mit Windows PowerShell zu tun. Sie müssen sich nicht mit herkömmlichen Skripts oder komplizierten Programmierobjekten abgeben. Hier ist meine absolute Lieblingszeile. Es handelt sich um eine einzige Befehlszeile, die eine CSV-Datei importiert und die darin enthaltenen Informationen verwendet, um Dutzende oder sogar Hunderte neuer Active Directory-Benutzer zu erstellen:

Import-CSV 'C:\provision1.csv' |
ForEach-Object {New-QADUser -organizationalUnit 'company.pri/Singers' -name ($_.'First Name' + '.' + $_.'Last Name') 
-samAccountName $_.'Logon name' -city $_.city -title $_.'Job title' -department $_.department} 

Dies ist zwar ein langer Befehl, aber er ist erstaunlich leistungsfähig. Am Anfang steht Import-CSV, ein systemeigenes Shell-Cmdlet, das eine CSV-Datei liest und Objekte zurückgibt. Jede Zeile in der CSV-Datei ist ein einzelnes Objekt, und die Spalten der CSV-Datei werden zu Eigenschaften des Objekts. In der hier verwendeten Datei „Provision1.csv“ handelt es sich bei den Spaltennamen um „Anmeldename“ und „Vorname“ – das ist interessant, weil die Spaltennamen nicht direkt Active Directory-Benutzerattributen zugeordnet werden. Meiner Erfahrung nach ist es bei solchen Dateien üblich, eher vertraute Spaltennamen zu verwenden, anstatt Namen, die sich spezifisch auf Active Directory beziehen. Zum Beispiel kann es vorkommen, dass Sie diese Datei von jemandem in der Personalabteilung Ihres Unternehmens erhalten, und die Person wird wahrscheinlich nicht wissen, dass „Nachname“ das sn-Attribut in Active Directory ist.

Wenn alle Daten in der CSV-Datei importiert und in Objekte umgewandelt wurden, werden diese Objekte zum ForEach-Object-Cmdlet geleitet, das innerhalb der geschweiften Klammern in meiner Lieblingszeile für jedes Objekt einen Codeblock ausführt. Das heißt, dass dieses Skript für jede Zeile in der CSV-Datei einmal ausgeführt wird. Innerhalb des Skripts ist die besondere Variable „$_“ ein Verweis zum aktuellen Objekt bzw. zur aktuellen Zeile der CSV-Datei.

Wie Sie sehen, wird hier für jedes Objekt das New-QADUser-Cmdlet ausgeführt. Dabei handelt es sich um eins der Cmdlets im Quest-Add-In, von denen es mindestens ein Dutzend gibt. Beachten Sie den Namen „QADUser“. Das Q steht, wie Sie sicher schon erraten haben, für Quest (Suche). Durch diese Benennungskonvention wird ein Konflikt mit dem letztendlichen New-ADUser-Cmdlet vermieden, das wahrscheinlich zu den zukünftigen Entwürfen des Microsoft Active Directory-Teams gehören wird. Wenn beide Cmdlets gleichzeitig in der Shell geladen werden, können sowohl Sie als auch die Shell die Cmdlets problemlos unterscheiden.

Die restliche Zeile besteht aus Parametern für das New-QADUser-Cmdlet. Am Anfang wird die Organisationseinheit angegeben, also der Ort, an dem alle neuen Benutzer erstellt werden müssen. Als Nächstes folgt das name-Attribut, das hier folgendermaßen festgelegt wurde: die Inhalte der First Name-Spalte, ein Punkt und dann die Inhalte der Last Name-Spalte.

An dieser Stelle soll noch eine interessante Tatsache erwähnt werden: Der City-Parameter ändert tatsächlich das l-Attribut (oder Locality-Name) in Active Directory. Das Cmdlet akzeptiert auch einen Parameter namens „l“, mit dem dasselbe erzielt wird. Größtenteils können Parameter, die Active Directory-Attribute bezeichnen, sowohl den Attributnamen als auch die Textbeschriftung des Tools „Active Directory-Benutzer und -Computer“ verwenden.

Die alternative Windows PowerShell-Funktionsweise

Bei Active Directory handelt es sich um einen hierarchischen Speicher, und eine der Stärken von Windows PowerShell ist die Möglichkeit, einen hierarchischen Speicher als Laufwerk verfügbar zu machen. Auf diese Weise können Sie einen Ihnen vertrauten Satz von Befehlen wie „Dir“, „Del“, „Ren“, „Copy“ und so weiter verwenden, um eine Reihe verschiedener Speicher zu verwalten. Leider wurde Windows PowerShell 1.0 nicht mit einem PSDrive-Anbieter für Active Directory geliefert, was bedeutet, dass die Shell keine Möglichkeit hat, Active Directory selbst als Laufwerk verfügbar zu machen.

Glücklicherweise kommt mit den PowerShell-Communityerweiterungen wieder das umfangreiche Ökosystem ins Spiel. Dies ist ein kostenloses Open-Source-Add-In, das unter codeplex.com/powershellcx verfügbar ist. Nach der Installation des Add-Ins ermöglichen Ihnen die PowerShell Communityerweiterungen, die Shell an Ihren Domänennamen zu leiten, um das Verzeichnis so zu verwalten, als ob es ein Laufwerk wäre:

CD COMPANY:
CD SINGERS
DIR

Diese Befehle werden zur COMPANY-Domäne, werden zur Singers-Organisationseinheit und werden dann als eine Liste von Objekten angezeigt (siehe Abbildung 2). Von dort können Befehle wie „Del“ zum Löschen eines Benutzers, „Md“ zum Erstellen einer neuen Organisationseinheit und so weiter verwendet werden. Es gibt einige Probleme mit dem Communityerweiterungs-PSDrive-Anbieter. Dabei geht es im Grunde darum, dass die erwartete Funktionalität doch nicht verfügbar ist, weil die Zuordnungen nicht mit der Funktionsweise von Active Directory übereinstimmen. Außerdem müssen Sie äußerst vorsichtig sein: Durch Ändern des Stamms Ihrer Domäne und Ausführen von „del * -recurse“ werden tatsächlich alle Objekte in der Domäne gelöscht, vorausgesetzt, Sie haben die Berechtigung dazu. Es gibt keine Standardeinstellung, die nachfragt, ob Sie „dies wirklich vornehmen möchten“. Die Befehlszeile ist leistungsfähig, doch diese Leistung ist für jemanden, der nicht sachkundig und vorsichtig ist, mit Risiken verbunden.

Abbildung 2 Verwenden der PowerShell-Communityerweiterungen zum Steuern der Shell und zur Verzeichnisverwaltung

Abbildung 2** Verwenden der PowerShell-Communityerweiterungen zum Steuern der Shell und zur Verzeichnisverwaltung **(Klicken Sie zum Vergrößern auf das Bild)

Setzen Sie Windows PowerShell noch heute ein

Ich werde von meinen Studenten immer gefragt, auf welche Weise sie Windows PowerShell sofort verwenden können. Immerhin wurde nicht jedes Microsoft-Produkt neu entworfen, damit es mit Windows PowerShell verwendet werden kann, und es taucht vielleicht der Gedanke auf, dass vor dem eigentlichen Einsatz von Windows PowerShell noch einiges passieren muss.

Tatsache ist, dass schon eine ganze Menge passiert ist. Obwohl Active Directory von Microsoft noch nicht für die Befehlszeilenverwaltung ausgestattet wurde, haben andere bereits einen Anfang gemacht und recht gute Erfolge damit erzielt. Sie können Windows PowerShell für viele Verwaltungsaufgaben verwenden, einschließlich des Automatisierens einiger der zeitaufwändigsten und lästigsten Aufgaben, z. B. das Erstellen von Batches neuer Benutzer. Der Trick besteht darin, in Erfahrung zu bringen, was zurzeit in der Community vor sich geht, um mehr Nutzen aus Windows PowerShell zu ziehen. (Zu empfehlen ist PowerShellCommunity.org, eine Website, die unter anderem von Microsoft gesponsert wird und an deren Verwaltung ich beteiligt bin.) Mit den richtigen in Windows PowerShell geladenen Tools können Sie bereits jetzt Skripts für einige der zeitaufwändigsten und mühsamsten Verwaltungsaufgaben erstellen und Ihre Rolle als Administrator sehr viel effizienter gestalten.

Don Jones ist Mitautor von Windows PowerShell: TFM, 2nd Edition, Autor von VBScript, WMI, and ADSI Unleashed und Leiter von PowerShellCommunity.org.

© 2008 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig.