Powershell: Aus Einzeilern werden Power-Tools

6. Februar 2013

Wie aus einzeiligen Powershell-Kommandos komplette Verwaltungswerkzeuge entstehen – das verdeutlicht Mark Minasi in diesem Beitrag. Dabei sollte der Administrator allerdings nicht die Sicherheitsvorkehrungen außer Acht lassen, denn ansonsten kann man beim allzu sorglosen Umgang mit dem Active Directory schnell das gesamte Konstrukt destabilisieren.

Im Beitrag Powershell: Filter-Aktion-Duett im Einsatz hat der Autor demonstriert, wie sich mit dem Filter-Aktion-Duett sehr mächtige Powershell-Einzeiler erstellen lassen. Dabei wurde mit einem „sehr knapp gehaltenen Skript“ gezeigt, wie man alle Benutzerkonten finden kann, über die sich seit mehr als 120 Tagen kein Anwender mehr angemeldet hat, und dann auch gleich noch diese Konten deaktivieren lassen.

Dabei wurde mit dem Cmdlet search-adaccount die betreffenden Konten gesucht (gefiltert) und dann auf diese Gruppe dann eine bestimmte Aktion ausgeführt – in diesem Fall das „disable-adaccount“. In diesem Folgebeitrag wird nun verdeutlicht, wie sich dieser Ansatz weiter ausbauen lässt.

Bei den Aktionen stehen natürlich weitaus mehr Optionen als das Deaktivieren von Konen zur Verfügung. Dabei sind vor allem die folgenden Aktionen zu nennen:

  • Enable-adaccount: Dieser Befehl aktiviert ein zuvor deaktiviertes Konto erneut.
  • Unlock-adaccount: Dieses Kommando entsperrt ein gesperrtes Konto.
  • Clear-ADAccountExpiration: Es ist bei einem Konto im Active Directory (AD) möglich, einen Zeitpunkt vorzugeben, an dem das Konto nicht mehr gültig ist. Diese Charakteristik des AD-Kontos lässt sich mit dem Cmdlet Clear-ADAccountExpiration wieder aufheben.

Nach diesen Aussagen wird man sich unter Umständen wundern, dass es kein Kommando „lock-account“ (oder ähnlich) gibt. Doch wie so oft lassen sich diese zuvor genannten Befehle auch ohne zusätzliche Parameter oder Folgebefehle verwenden:

enable-adaccount PatriceM
unlock-adaccount EdDantes

Doch diese „Aktions-Cmdlets“ haben auf sich allein gestellt nur wenig Nutzen. Die Angelegenheit wird immer nützlicher, wenn es dazu einen Filter gibt.
Angenommen es wurde ein ganzer Satz von Konten in der Organisationseinheit (OU) der „Bibliothekare“ (die „Librarians“) des Unternehmens bigfirm.com gesperrt. Dann lassen sich alle Koten wieder mit Hilfe des folgenden Befehls entsperren:

get-aduser -f * -searchbase "ou=librarians,dc=bigfirm,dc=com"| unlock-adaccount

Oder aber es wurde aus Versehen für eine Menge von Benutzerkonten vorgegeben, dass das Kennwort niemals abläuft und man möchte dann zum Beispiel für diese Konten vorgeben, dass sie erst mal gesperrt werden, bis herausgefunden wurde, wie es zu diesem Versehen gekommen ist. Dann hilft das folgende Kommando weiter:

search-adaccount -PasswordNeverExpires | disable-adaccount

Doch ehe der Administrator  dieses Kommando ohne lange nachzudenken ausführt, sollte er sich einer Sache bewusst sein: Derartige Power Tools – auch wenn es sich dabei nur um einen Powershell-Einzeiler handelt – sind mit größter Vorsicht zu verwenden. Sie sind schnell hingeschrieben, doch wenn etwas schief geht, dann wird es zu viel Ärger kommen.

Immer erst den Filter testen

Daher lautet bei einem Filter-Aktions-Duett ein wichtiger Hinweis: Immer zuerst den Filter für sich allein testen (also ohne die Aktion gleich auszuführen). Danach kann sich der Administrator recht sicher sein, dass alles richtig läuft. Im konkreten Fall würde das bedeuten, dass der Administrator zuerst den folgenden Befehl absetzt:

search-adaccount –PasswordNeverExpires

Das Deaktivieren der so gefundenen Konten (mit disable-adaccount) sollte zunächst noch nicht ausgeführt werden. Denn das Ergebnis zeugt unter Umständen, dass es viele “unschuldige” Konten gibt, bei denen das Kennwort niemals abläuft.

Denn eigentlich sucht man ja nur die Benutzerkonten, auf die dieser Filter zutrifft. Doch auch das last sich schnell machen:

search-adaccount -PasswordNeverExpires -usersonly

Daher sollte man es sich unbedingt angewöhnen, zuerst den Filter allein aufzurufen und dann die Ergebnisse zu überprüfen. Falls sehr viele Resultate geliefert werden, kann man die Ausgabe noch über die Pipeline in das Cmdlet „ou-gridview“ der Powershell geben. Es stellt die Ergebnisse dann in einer tabellarischen Darstellung (wie bei einem Spreadsheet) dar.

Eine weitere Möglichkeit, um die Sicherheit der eigenen Powershell-Tools zu erhöhen, ist das Hinzufügen von „-confirm“. Nahezu ein jedes „Aktions-Kommando“ verfügt über diesen Parameter. Im zuvor gezeigten Beispiel könnte der verantwortungsbewusste Administrator etwas mehr Sicherheit ins Spiel bringen, wenn er diese Hilfestellung hinzufügt, wie es das folgende Beispiel zeigt:

search-adaccount -PasswordNeverExpires -usersonly| disable-adaccount -confirm

Für alle bisher gezeigten Beispiel wurde vorausgesetzt, dass die Cmdlets von einem Benutzer mit „Domänenadministrator-Rechten“ eingegeben wurden. Sollte das nicht der Fall sein, müsste man den betreffenden Benutzer entsprechend „hochstufen“.

Das lässt sich mit dem Parameter „-credential“ erzielen: Findet die Powershell diesen Parameter, zeigt sie einen Anmeldedialog an, über den man die Anmeldeinformationen eines Domänenadministrators dann eingeben kann.

Mark Minasi/rhh

Lesen Sie auch