Mehr Power für die Shell

Windows PowerShell ist nicht nur ein wahres Eldorado für Kommandozeilen-Fetischisten, sondern wird die Administration von Microsoft-Systemen in naher Zukunft erheblich erleichtern.

Artikel erschienen in Swiss IT Magazine 2006/11

     

Zugegeben, der Name Windows PowerShell erinnert eher an ein Expansion Pack für Windows XP oder an eine bekannte Tankstellenkette. Doch hinter der neuen PowerShell steckt eine enorm leistungsfähige Technologie, die mit an Sicherheit grenzender Wahrscheinlichkeit in einigen Jahren in grossen Unternehmen, die Windows-Netzwerke betreiben, zum Standard gehören wird. Das Thema Betriebssystem-Shells wurde von den Redmondern jahrelang sträflich vernachlässigt. Für die Umsetzung von administrativen Scripts standen bislang entweder eine Stapelsprache zur Auswahl, die in ihren Ursprüngen noch auf früheste DOS-Versionen zurückgeht, oder ein zwar irgendwie flexibler, aber alles andere als anwenderfreundlicher Scripting Host, der seit Windows 2000 zwar ein fester Bestandteil des Betriebssystems ist, seitdem aber auch nicht weiterentwickelt wurde. Dass in diesem Bereich offenbar die Uhren generell etwas langsamer gehen, macht die Vorgeschichte der PowerShell deutlich. Erstmals wurde sie unter dem Codenamen «Monad» auf einer grossen Entwicklerkonferenz im Jahre 2003 als die neue Shell für das künftige «Longhorn» vorgestellt. Kurz danach gab es zwar die ersten Previews, doch dann wurde es längere Zeit still um Monad. Erst Ende April dieses Jahres kam wieder Bewegung in die ganze Sache, als auf dem Microsoft Management Summit 2006 nicht nur der Release Candidate 1 freigegeben (Download via www.microsoft.com/technet/scriptcenter/hubs/msh.mspx
), sondern auch die Verfügbarkeit der finalen Version für Herbst versprochen wurde.


Eine für alle

Die neue Power Shell (PS) soll sowohl für das Betriebssystem als auch für kommende Serverversionen von Exchange, MOM usw. zuständig sein. Bei Exchange 2007 kann über die PowerShell, als Alternative zur GUI, die komplette Administration erledigt werden. Der grosse Vorteil der PowerShell ist die Vereinheitlichung. In der Vergangenheit standen Administratoren mit VBScript, JScript oder Perl verschiedene Scriptsprachen zur Auswahl, deren Funktionalität durch COM-Komponenten und Bibliotheken ergänzt wurde. Erweitert wurde dieser bunte «Zoo» zueinander nicht kompatibler Lösungen durch verschiedene Nischenprodukte wie KiXtart, AutoIt oder WinBatch. In Zukunft wird es mit der PowerShell eine einheitliche und alles umfassende Lösung geben.


Die ersten Schritte

Die PowerShell wird über das Startmenü oder über «Powershell.exe» gestartet (ein Umstand, der für einige Kritik gesorgt hat, da offenbar vielen Anwendern ein kurzer Name wie Psh.exe sehr viel lieber wäre). Auf den ersten Blick macht die PowerShell, die in einem typischen Kommandozeilenfenster läuft, einen eher unspektakulären Eindruck. Die Entwickler haben sich grosse Mühe gegeben, den Anwendern eine vertraute Umgebung zu präsentieren. Der Umstand, dass etwa nach Eingabe von Dir die Dateien des aktuellen Verzeichnisses aufgelistet werden, bedeutet aber nicht, dass aus Kompatibilitätsgründen die alten Shell-Befehle übernommen wurden. Dir ist lediglich ein Alias für set-location, einer von Hunderten von Befehlen, die CommandLets (CmdLets) genannt werden und den Befehlsumfang der Shell ausmachen. Der folgende Befehl zum Beispiel gibt eine Liste aller lokalen Prozesse zurück:



get-process





Möchte man nur bestimmte Prozesse, muss der Befehl lediglich erweitert werden:



get-process -processname svchost



Die PS ist ein Eldorado für Abkürzungsfanatiker. Die obige Abfrage liesse sich auch ein wenig ausführlicher formulieren:



get-process | where-object {$_.processname -eq 'svchost'}



Dabei ist where-object nicht irgendeine Option, sondern ein weiteres CmdLet, und der Pipe-Operator gibt nicht einfach die Namen der Prozesse weiter, sondern Prozess-Objekte. Dieser «Objekt-Pipe-Operator» ist die grösste Stärke der Windows PowerShell, denn er bedeutet eine enorme Flexibilität. Gleichzeitig ist das Denken in Objekten die grösste Hürde, die Anwender nehmen müssen, die keine Erfahrung mit objektorientierten Programmiersprachen haben. Im obigen Fall steht $_ für das aktuelle Prozessobjekt und processname ist folglich eine von vielen Eigenschaften, deren Wert über eq mit einem Namen verglichen wird. Eine Liste aller Eigenschaften gibt der folgende Befehl zurück:



get-process lsass | get-member -membertype property



Zuerst wird über get-process lsass das Process-Objekt des Lsass-Prozesses geholt (der natürlich vorhanden
sein muss). Dieses wird über den Pipe-Operator an das get-member CmdLet weitergereicht, das mit membertype als Option aufgerufen wird. Na­türlich beschränken sich die CmdLets nicht auf das Abfragen von ­Informationen, der folgende
Befehl beendet alle Prozesse,
die einen bestimmten Namen tragen:



Get-Process | where { $_.Name -eq "calc" } | stop-process



Auch hier wieder das gleiche Muster: Die gefilterten Prozesse werden einfach dem stop-process-cmdlet zugeführt. Grundsätzlich liesse sich das natürlich auch mit den üblichen Kommandozeilentools, etwa aus dem NT Ressource Kit, erledigen, doch diese Variante wäre bei weitem nicht so flexibel und erweiterbar. Sollen die gefilterten Prozesse mehrfach angesprochen werden, müssen sie nicht jedes Mal erneut abgerufen werden, es wird eine Variable definiert:



$a = Get-Process | where { $_.Name -eq "calc" }



$a (Variablen beginnen stets mit einem $-Zeichen) steht für alle Prozess-Objekte, so dass der Befehl



$a | stop-process



alle Prozesse beendet, die über $a zusammengefasst werden. Erfahrene Anwender benutzen allerdings eher den Alias, da dieser ein wenig kürzer ist:



$a | kill



Nach den exakt gleichen Regeln werden Dienste, Netzwerkverbindungen, Drucker, kurz alles das behandelt, was über ein CmdLet angesprochen werden kann. Es überrascht nicht, dass sich auch WMI-Abfragen (mit get-WmiObject win32_BIOS) sehr viel einfacher erledigen lassen als zum Beispiel beim WSH.
Allerdings gibt es, anders als man es vermuten könnte, keine Abhängigkeiten zu WMI, ADSI und anderen Microsoft-Technologien. Auch hier handelt es sich um reguläre CmdLets. Soll eine
x-beliebige Anwendung auf diese Weise angesprochen werden können, muss sich nur jemand die Mühe machen und ein neues CmdLet programmieren. Dies ist aber weniger eine Aufgabe für Administratoren, sondern für professionelle Entwickler.


Namenskonventionen

Jedes CmdLet besitzt einen eindeutigen Namen, der sich stets aus einem Verb und einem Hauptwort zusammensetzt, die durch einen Bindestrich voneinander getrennt werden. Aus Konsistenzgründen ist das Hauptwort dabei immer im Singular gehalten. Gross-/Kleinschreibung wird nicht unterschieden. Optionen wird grundsätzlich ein Bindestrich vorgestellt. Diese Konsistenz zieht sich wie ein roter Faden durch alle Bereiche und ist, neben dem Pipe-Operator und der universellen Erweiterbarkeit, der dritte grosse Pluspunkt der PS. Wer mag, kann für bestehende CmdLets Aliase einrichten, um Tipparbeit zu sparen. Eines der wichtigsten CmdLets am Anfang ist get-help (z.B. get-help get-process). Es liefert eine Beschreibung zu dem als Parameter übergebenen CmdLet. Wird kein Parameter angegeben, zeigt get-help eine Liste aller Elemente an, zu denen es eine Hilfe anbieten kann. Eine Liste aller verfügbaren Kommandos liefert Get-Command (z.B. Get-Command | More).


Navigation durch die Registry

Die Idee der Vereinheitlichung zieht sich durch alle Bereich der PS. Grundsätzlich kann alles, was eine hierarchische Struktur besitzt (Dateisystem, Active Directory, Microsoft-Excange-Server-Ablage, Registry usw). auf die exakt gleiche Weise angesprochen werden. Der Befehl Cd hklm: macht den HKLM-Schlüssel zum «aktuellen Verzeichnis», der Befehl Dir würde entsprechend alle Unterschlüssel auflisten, der Befehl Dir Software\Microsoft entsprechend die Unterschlüssel dieses Schlüssels. Die Navigation durch die Registry über Befehle wie Cd oder Dir (es sind lediglich Aliase) klingt am Anfang vielleicht nach einer verrückten Idee, sie ist aber überaus logisch aus der Perspektive der PS und nebenbei enorm praktisch.


Security und Erweiterbarkeit

Die Sicherheit spielt bei der Windows PowerShell natürlich eine zentrale Rolle. Das Fiasko mit dem Scripting Host, der in vielen Unternehmen als Sicherheitsrisiko eingestuft und standardmässig deaktiviert wurde, soll sich nicht wiederholen. Per Richtlinie lässt sich erreichen, dass sich nur Scripts mit einem Zertifikat ausführen lassen. Ein Doppelklick auf eine PS-Scriptdatei führt nicht zu deren Ausführung.
Die Windows PowerShell basiert komplett auf dem .Net Framework 2.0, wenngleich dieser Umstand nur selten direkt in Erscheinung tritt. Die Klassen der PowerShell stehen über verschiedene Namespaces zur Verfügung, die Teil der kommenden Windows-API WinFX sein werden. Die leichte Erweiterbarkeit und die offenen Schnittstellen über Klassen werden dazu führen, dass es in Kürze eine Vielzahl von Shell-Erweiterungen geben wird. Auch GUI-Elemente können sehr praktisch sein, um Eingaben entgegenzunehmen oder den Fortschritt einer Operation anzuzeigen.


«Playstation» für Administratoren

Die PowerShell 1.0 soll im Herbst 2006 als Download zur Verfügung stehen. Auch GUI-Erweiterungen für die PowerShell sind von Microsoft geplant, sie werden als MMC- Snap-Ins zur Verfügung stehen. Die PowerShell soll den WSH nicht ersetzen, vorhandene WSH-Skripts können in der PowerShell ausgeführt werden. Auch wenn die PowerShell ein technologischer Durchbruch für Windows-Administratoren ist, werden sich die Anwender zunächst an sie gewöhnen müssen. Vor allem bei Admins mit einer heimlichen Obsession für Unix wird sie es naturgemäss schwer haben, da sie bei rein oberflächlicher Betrachtung zunächst als ein weiterer «Nachbau» bekannter Shells wie Bash erscheinen wird. Dass es etwas komplett Neues ist, wird beim Ausprobieren der ersten Beispiele aber sehr schnell deutlich werden.






Wie lässt sich die PowerShell mit anderen Scripting-Umgebungen oder modernen Scriptsprachen wie Python oder Ruby vergleichen? Im Prinzip gar nicht, da die PS in erster Linie eine Shell und die eingebaute Skriptsprache nur eine Option ist. Auch die .Net-Programmiersprache C#, in der CmdLets programmiert werden (alternativ steht natürlich auch Visual Basic zur Verfügung), tritt nicht direkt in Erscheinung. Administratoren können die Power der Shell nutzen, ohne sich dafür Programmierkenntnisse aneignen zu müssen, und können sich darauf beschränken, genau wie bei der Stapelsprache, Befehlsfolgen, die sie über die Tastatur eingeben würden, in einer Scriptdatei zusammenzufassen. Das ist gegenüber dem WSH ein enormer Fortschritt und ein riesiger Produktivitätsgewinn. Mit Freigabe des RC1 hat Microsoft sehr viel Know-how in Gestalt von Beispielen, WebCasts und Whitepapers zur Verfügung gestellt.
PS steht zwar nicht für «Playstation», aber die neue PowerShell von Microsoft könnte nicht nur auf Admins eine ähnliche Wirkung haben. Hat man das Prinzip der Objekt-Pipe erst einmal verstanden, macht es regelrecht süchtig, die unzähligen Möglichkeiten auszuprobieren.




Artikel kommentieren
Kommentare werden vor der Freischaltung durch die Redaktion geprüft.

Anti-Spam-Frage: Wieviele Fliegen erledigte das tapfere Schneiderlein auf einen Streich?
GOLD SPONSOREN
SPONSOREN & PARTNER