Powershell: Filter-Aktion-Duett im Einsatz

1. Februar 2013

Die Struktur der Namensgebung für ein Powershell-Cmdlets ist recht simpel: Erst kommt das Verb, das eine Aktion bezeichnet, und danach das Hauptwort, das für eine Objektgattung steht. Anhand des Beispiels “disable-adaccount” zeigt der Autor, wie sich damit schlägkräftige “Einzeiler” konstruieren lassen.

Dabei lautet das Motto: Erst die passenden Objekte auswählen und dann darauf die gewünschte Aktion ausführen – dieser Ansatz ist bei der Powershell über das “Filter-Aktion-Duett” machbar. Mit den hier gezeigten “Einzeilern” kann der Administrator viele Aktionen ausführen und muss sich nicht mehr durch aufwändige GUI-Dialoge quälen.

Die volle Power  beim Einsatz der Powershell im Bereich der Verwaltung des Active Directory (AD) ergibt sich aus der Kombination von Cmdlets: Es gilt dabei zuerst eine bestimmte Menge von Konten im AD zu bestimmen – wie etwa alle Benutzerkonten, über die sich seit 120 Tagen niemand mehr angemeldet hat, oder alle Mitglieder der Organisationseinheit „Personal“ oder alle Mitarbeiterkonten, deren Chef Sam Jones ist.

Im zweiten Schritt sind dann von einem weiteren Cmdlet auf diese Konten bestimmte Aktionen auszuführen: Man kann sie deaktivieren, oder sie müssen beim nächsten Anmeldevorgang ihr Kennwort ändern oder aber sie bekommen als neue Chefin ein gewisse Angelina Jolie zugewiesen. Man kann sich derartige Konstrukte auch als Filter-Aktion-Duett vorstellen.

In der Einfachheit liegt die Eleganz

Um die Benutzer herauszufinden, die in eine bestimmte Kategorie eingruppiert werden können, gibt es das Cmdlet get-aduser. Es kann sehr viele Aktionen ausführen – ist allerdings recht komplex zu bedienen. Mit einer einfacheren Syntax kommt dagegen das Cmdlet search-adaccount aus, doch dafür kann es deutlich weniger Dinge suchen, schafft das aber dann auch schneller. Ein weiteres einfacheres Cmdlet ist noch get-adgroupmember. Es verdeutlicht die Gruppenmitgliedschaften.

Doch in diesem kurzen Beitrag sollen auch Aktionen auf die so gefundenen Objekte ausgeführt werden. Ein typisches Cmdlet für eine Aktion ist das „disable-adaccount“. Um es zu verwenden, muss der Administrator lediglich das Cmdlet aufrufen und dann noch angeben, auf welches Objekt sich diese Aktion beziehen soll: Das kann ein DN (Distinguished Name) sein, oder eine GUID beziehungsweise SID oder ein „samaccountname“. Um zum Beispiel ein Konto zu deaktivieren, das den Anmeldenamen IvanVasilyevich4 besitzt, ist der folgende Befehl nötig:

disable-account -identity IvanVasilyevich4

Dieser Befehl dürften den meisten Administratoren bekannt vorkommen. Es handelt sich dabei um eine Befehlsstruktur, wie sie üblich ist: Zuerst kommt ein Verb (das „disable“) und dann folgt ein Hauptwort (das „account“). Und als Parameter akzeptiert das Cmdlet noch den ersten Parameter, der mit -identity eingeführt wird. Wer es kürzer haben möchte, der braucht nur die folgende Version des Befehls einzugeben:

disable-account IvanVasilyevich4

Doch dieser Befehl erscheint immer noch für viele als zu lang. Allein das Eintippen von Disable-Account will man schon nicht haben, selbst wenn sich mit der Autocompletion-Funktionalität etwas Schreibarbeit sparen lässt. Daher kann man mit dem Cmdlet Set-Alias eine Abkürzung definieren. Das sieht wie folgt aus:

set-alias disable-adaccount dacc

Danach wird der komplette Befehl nochmals kürzer:

dacc IvanVasilyevich4

Damit das alles wie gewünscht funktioniert, muss der Administrator das Kommando Set-Alias in seinem Profile abgelegt haben. Und es ergibt sich noch ein weiteres Problemfeld: Es wird mit dem „dacc“ ein Befehl eingegeben, den kein anderer auf den ersten Blick versteht.

Das kann man sicher so machen, doch die wahre Größe der Powershell zeigt sich erst, wenn man ein Powershell-Duett erzeugt. Das folgende Beispiel soll zeigen, was es damit auf sich hat:

search-adaccount -usersonly -accountinactive -timespan "120" | disable-adaccount

Diese Befehlszeile sieht zunächst einmal schlimm aus. Doch wer sich die einzelnen Bestandteile vor Augen führt, der wird schnell verstehen: Zuerst geht es um den linken Teil vor dem Pipe-Symbol:

search-adaccount -usersonly -accountinactive -timespan "120"

Wer sich schon etwas mit der Powershell befasst hat, der sollte herausbekommen, dass dieses Kommando alle Benutzer herausfindet, die sich seit 120 Tagen nicht mehr am System angemeldet haben.

Danach kommt das Pipe-Symbol (|). Damit wird die Powershell angewiesen, dass sie die Ausgabe des vorherigen Kommandos (also des Befehls, der links von dem Pipe-Symbol steht) als Eingabe in das nächste Kommando leitet. Somit warden also alle benutzer, die sich seit 120 Tagen nicht mehr am System angemeldet haben als Input (einer nach dem anderen) in das nächste Kommando geschickt.

Dieses Kommando macht nichts anders, als jedes der eingegebenen Konten zu deaktivieren. Das wird von dem Befehl rechts vom Pipe-Symbol ausgeführt:

disable-adaccount

Damit ist die komplette Aktion geklärt: Alle Benutzerkonten, über die seit 120 Tagen keine Anmeldung mehr erfolgt ist, werden deaktiviert.

An dieser Stelle kann an sich gut den Vorteil ausrechen, den der Einsatz der Powershell gegenüber dem Arbeiten mit einem GUI-basierten Tool bietet: Wer diese Aufgabe mithilfe der Verwaltungskonsole machen will, der muss eine sehr ausgefeilte LDAP-Anfrage an das AD stellen und dann die Ergebnisse alle auf einmal selektieren (etwa mit Ctrl+A). Das ist schon sehr schwierig zu machen.

Im Powershell-Ansatz ist der Befehl zwar etwas länger, doch letztendlich lässt sich alles in einem „Einzeiler“ abhandeln.

Mark Minasi

Lesen Sie auch