Einführung in PowerShell – Rüstzeug für Systemadministratoren

Die Bedeutung von Systemadministratoren in Unternehmen darf man keinesfalls unterschätzen: Denn nur mit einer zuverlässigen und durchgängig funktionierenden IT-Infrastruktur kann eine Firma das Maximum ihrer wirtschaftlichen Leistungsfähigkeit erreichen. Dies erfordert, je nach Größe der jeweiligen Organisation, die Überwachung und Kontrolle von Dutzenden, wenn nicht sogar Hunderten von Rechnern gleichzeitig. Eine Mammutaufgabe, die nur geschultes Fachpersonal mit einem tiefen Einblick in systeminterne Zusammenhänge bewältigen kann.

Tritt nun bei mehreren Rechnern gleichzeitig ein Problem auf oder muss eine neue Sicherheitslösung schnellstmöglich auf das gesamte Netzwerk geladen werden, wäre es für einen Administrator weder zeiteffizient noch wirtschaftlich, jedes Gerät einzeln aufzusuchen und immer dieselben Handgriffe zu wiederholen. Die Windows PowerShell ermöglicht es, solche Prozesse immens zu beschleunigen und Routineaufgaben weitestgehend zu automatisieren. Dadurch wird die Arbeit des Systemadministrators deutlich vereinfacht. Was die Software noch alles kann, erfahren Sie ebenfalls in unserem Artikel.

Was ist Windows PowerShell?

Windows PowerShell ist, wie der Name schon sagt, eine sogenannte „Shell“. In der Informationstechnik versteht man darunter eine Schnittstelle zwischen einem Computer und seinem Benutzer. Der englische Begriff „Shell“ bedeutet „Muschelschale“, wird im übertragenden Sinne aber zur Bezeichnung einer äußeren Hülle verwendet. So auch in der Informatik: Dort bezeichnet man mit dem Begriff die sichtbare Benutzer-Oberfläche, über die man mit den systeminternen Funktionen eines Computers interagieren kann.

Shells sind in der Regel kommandoorientiert und werden deshalb ausschließlich per Tastatur und Texteingaben gesteuert. Sie bilden damit eine Alternative zu grafischen Benutzeroberflächen (graphical user interfaces, kurz: GUI), auf denen man vorrangig mit der Maus navigiert – wie beispielsweise dem Windows-Explorer. Da Shells darüber hinaus Zugang zu deutlich mehr und tieferliegenden Funktionen und Komponenten eines PCs gewähren, werden sie von vielen IT-Profis und Systemadministratoren bevorzugt.

Warum gibt es Windows PowerShell?

Bis vor kurzem waren bei DOS- beziehungsweise Windows-Betriebssystemen die Kommandozeile command.com und die Eingabeaufforderung cmd.exe die standardmäßig genutzten Shells. Mit ihnen können fortgeschrittene Computernutzer Konsolenanwendungen öffnen, Problembehebungen durchführen oder in den Laufwerken eines PCs navigieren. Über den Befehl netstat ist es zum Beispiel möglich, grundlegende Daten über sämtliche Netzwerkaktivitäten zu erhalten. Jedoch fielen command.com und cmd.exe schon immer durch zwei Probleme auf: Nicht alle Systemkomponenten sind über sie erreichbar und ihre Skriptsprachen gelten hinsichtlich ihrer Funktionalität als eingeschränkt. Somit galten sie schon seit geraumer Zeit als nicht so ausgereift wie die gängigen Linux- und Unix-Shells.

Bei den Entwicklern von Microsoft bestand daher schon seit den 90er-Jahren der Plan, diese Beschränkungen abzubauen. Im Laufe der Zeit entwickelten sie verschiedene Shells, mit denen dieses Vorhaben mal mehr, mal weniger gut gelang. Als besonders wegweisend entpuppte sich letztendlich Monad, das 2003 erstmals vorgestellt und drei Jahre später in PowerShell umbenannt wurde.

Durch Microsofts „Common Engineering Criteria“, laut denen seit 2009 alle Server-Produkte des Unternehmens die PowerShell unterstützen müssen, ist selbige zur zentralen Verwaltungs- und Automatisierungslösung in Windows avanciert. Ab Windows 2008 wurde sie optional, bei späteren Versionen dann standardmäßig mit dem Betriebssystem ausgeliefert und ist als Open-Source-Framework auch für frühere Windows-Versionen als Download verfügbar.

Im Jahr 2016 folgte dann der Entschluss, die Shell plattformunabhängig anzubieten. Microsofts Intention dahinter: PowerShell soll künftig auch abseits von Windows, also auf Linux und macOS, zum Universalwerkzeug für Systemadministratoren werden. Seitdem verbreitet sich die Shell immer stärker und findet stetig neue Anhänger. Zusammengefasst kann man also sagen, dass PowerShell den lange überfälligen Nachfolger der Eingabeaufforderung darstellt.

Was unterscheidet PowerShell von der Eingabeaufforderung?

Aber was genau hebt das neue Microsoft-Framework nun von der altbekannten Eingabeaufforderung ab? Um es einfach zu sagen: PowerShell hat alle Funktionen von cmd.exe, kann vieles davon sogar deutlich besser und erfüllt darüber hinaus weitere Aufgaben, die unter Windows bislang nicht denkbar waren.

PowerShell bietet prinzipiell dieselbe Bandbreite an Befehlen wie cmd.exe. Im Grunde lässt sich PowerShell mit ausreichenden Kenntnissen über die gängigen Standardbefehle also genauso verwenden wie die Eingabeaufforderung. Jedoch erlaubt sie darüber hinaus auch den Zugriff auf tiefergehende Windows-Interna, die mit cmd.exe bisher nicht ansteuerbar waren, zum Beispiel die Registry und die Windows Management Instrumentation (WMI). Die Kommandozeile von Windows PowerShell folgt darüber hinaus der klaren Logik einer konsistenten Befehlsstruktur und Syntax und ist in dieser Hinsicht sinnvoller aufgebaut als cmd.exe.

Ein weiteres Merkmal, das die Windows PowerShell besonders auszeichnet: Das Programm arbeitet im Gegensatz zur Eingabeaufforderung und zu Unix-ähnlichen Systemen vollständig objektbasiert, statt Ergebnisse von Befehlen nur in Textform (strings) auszugeben. Jedes Objekt verfügt sowohl über Eigenschaften (properties) als auch Methoden (methods), die vorgeben, wie es sich nutzen lässt. So repräsentiert beispielsweise das Windows-Prozessobjekt Eigenschaften wie Prozess-Namen und -IDs sowie Methoden zum Pausieren und Beenden von Prozessen.

Da die Ergebnisse von Befehlen grundsätzlich als .NET-Objekte ausgegeben werden, ist es in PowerShell per Pipelining möglich, deutlich komplexere Aufgaben zu erfüllen als mit cmd.exe. Das funktioniert, indem der Output eines Objekts in der Pipe als Input für das nächste Objekt genutzt wird. So kann man zum Beispiel große und komplexe Datenmengen nach Dateierweiterungen filtern und als übersichtliche Liste formatieren.

Windows PowerShell ist zudem nicht nur einfach eine Kommandozeile, sondern fungiert auch als umfangreiche und leistungsstarke Scripting-Umgebung. In dieser kann man sowohl eigene Befehle schreiben als auch mehrere Befehle zu komplexen Skripten zusammenfassen, durch die Systemmanagement-Aufgaben erleichtert werden. Per Remoting ist es außerdem möglich, Skripte ortsunabhängig auf beliebig vielen Systemen gleichzeitig laufen zu lassen und diese dadurch zu verwalten, einzurichten, zu erfassen und zu reparieren.

Diese Vielfalt an Möglichkeiten und Funktionen offenbart auch, was die vorrangige Zielgruppe von Windows PowerShell ist: IT-Profis und Systemadministratoren, die über fundierte Kenntnisse im Umgang mit Shells verfügen und bereit sind, sich zugunsten der deutlich höheren Effizienz in die Windows PowerShell einzuarbeiten. Für Nutzer, die hauptsächlich mit der grafischen Benutzeroberfläche von Windows arbeiten und nur sporadisch auf die Eingabeaufforderung zurückgreifen, bietet PowerShell hingegen keinen besonderen Mehrwert, zumal der Zeitaufwand für die Einarbeitung recht hoch ist.

Im Folgenden fassen wir die Vor- und Nachteile von Windows PowerShell gegenüber der Eingabeaufforderung noch einmal übersichtlich zusammen:

Was spricht für PowerShell? Was spricht gegen PowerShell?
✔ Sämtliche Befehle aus der Eingabeaufforderung verfügbar ✘ Komplex und hohe Lernkurve
✔ Zugriff auf tieferliegende Windows-Interna wie die Registry und WMI ✘ Richtet sich vorrangig an IT-Profis und Systemadministratoren
✔ Effizientere Bedienung dank konsistenter Befehlsstruktur und Syntax ✘ Kein gesteigerter Nutzen für GUI-Verwender, die nur selten auf die Eingabeaufforderung zurückgreifen
✔ Vollständige Objektorientierung erlaubt die Ausführung komplexerer Aufgaben durch Pipelining ✘ Umgewöhnung vonnöten
✔ Umfangreiche Scripting-Umgebung ermöglicht effiziente Automatisierung von Prozessen  
✔ Ortsunabhängige Administration multipler Systeme per Remoting  

Wie funktioniert Windows PowerShell?

PowerShell besteht im Grunde aus zwei Bestandteilen, nämlich der PowerShell Engine und der PowerShell Scripting Language. Beide lassen sich separat voneinander oder auch in Kombination miteinander nutzen, um das Maximum an Funktionalität aus dem Programm herauszuholen.

Die PowerShell-Engine

Über den Kommandozeileninterpreter (Englisch: command-line interpreter, kurz: CLI) von PowerShell erhält der Benutzer via Tastatureingaben Zugang zu betriebssysteminternen Funktionen. Die entsprechenden Befehle des Programms nennt man „Cmdlets“ (gesprochen „Commandlets“, was in etwa dem Wort „Befehlchen“ entspricht) genannt. Gemäß einer konsistenten Syntax werden sie stets aus einem Verb und einem Substantiv im Singular zusammengesetzt, zum Beispiel Stop-Process oder Sort-Object. Parameter werden in einem Cmdlet gemäß der Formel -Parameter [Wert] angegeben, zum Beispiel:

Get-EventLog System Newest 3 (zum Aufrufen der drei neuesten Einträge im System-Ereignisprotokoll)
Tipp

Zwar ist es Kanon bei PowerShell, Befehle mit großem Anfangsbuchstaben einzugeben, die Kleinschreibung funktioniert aber ebenso.

Die mehr als 100 Kern-Cmdlets umfassen auch häufig genutzte Standardbefehle aus der Eingabeaufforderung, die neben anderen als sogenannte „Aliase“ verfügbar sind und Umsteigern die ersten Schritte mit der neuen Shell erleichtern sollen. So hat der zum Wechseln eines Verzeichnisses gedachte Befehl cd beispielsweise das Äquivalent Set-Location, das exakt dieselbe Funktion erfüllt. Sämtliche vorgefertigten Aliase lassen sich mit dem Cmdlet Get-Alias anzeigen. Darüber hinaus kann man mit dem Cmdlet Set-Alias auch eigene Aliase erstellen. Mit der folgenden Pipe können Sie beispielsweise dem Befehl „notepad“ (für das Programm Notepad) das Alias „ed“ zuweisen, sodass zum Ausführen des Programms weniger Tastenanschläge vonnöten sind:

Set-Alias ed notepad (um Notepad mit dem Befehl ed zu öffnen)
Set-Alias scr1 C:\Users\IEUser\Desktop\script1.ps1 (um ein Skript mit der Abkürzung scr1 zu starten)

Die folgende Tabelle enthält einige Beispiele für häufig genutzte Cmdlets und ihre verwandten Aliase:

Alias Cmdlet Funktion
cd Set-Location Aktuelles Verzeichnis wechseln
dir Get-ChildItem Alle Elemente eines Ordners auflisten
gi Get-Item Ein bestimmtes Element aufrufen
ps Get-Process Alle Prozesse auflisten
gsv Get-Service Alle installierten Dienste auflisten
gm Get-Member Alle Eigenschaften und Methoden eines Objekts anzeigen
clear Clear-Host Den PowerShell-Host leeren

Die strikte und zugleich leichter nachzuvollziehende Befehlsstruktur von PowerShell ermöglicht es, effizienter zu arbeiten als in der Eingabeaufforderung. Noch mehr Zeit gewinnt man durch Option, halb ausgeschriebene Cmdlets mit der Taste [Tab] automatisch zu vervollständigen. In vielen Fällen erkennt das Programm sogar unvollständig eingetippte Befehle.

Cmdlets lassen sich sowohl einzeln ausführen als auch per Pipelining miteinander verknüpfen, sodass der Output eines Objekts vom nachfolgenden Objekt gelesen und weiterverwendet werden kann. Zum Hinzufügen zweier Cmdlets in dieselbe Pipeline verwenden Sie einfach das |-Symbol. Auf diese Weise kann man zum Beispiel alle verfügbaren Prozesse auflisten und im selben Zuge nach ihrer ID sortieren:

Get-Process | Sort-Object ID 

Variablen definiert man mit dem $-Symbol. Sie können wie üblich zur Speicherung von Outputs verwendet werden, um sie beim Pipelining zu einem späteren Zeitpunkt wiederaufzugreifen. PowerShell ist dadurch sogar in der Lage, die Ergebnisse mehrerer über eine Pipeline verknüpfter Befehle auf einmal zu speichern, zum Beispiel:

$a = (Get-Process | Sort-Object ID)

Die PowerShell Scripting Language

Vieles an der Skriptsprache von PowerShell mag einem von C# und anderen Skriptsprachen bekannt vorkommen. Mit ihr kann man nicht nur eigene Cmdlets schreiben (und bei Bedarf mit anderen Nutzern teilen), man kann auch mehrere Befehle in Folge in einer Skript-Datei mit dem Format .ps1 verpacken und damit den Funktionsumfang der Shell erweitern. Denkbar sind zahlreiche Anwendungsbeispiele: von der Ausführung simpler Routineaufgaben bis hin zur nahezu vollständigen Automatisierung von Überwachungs- und Kontrollprozessen. Skripte enthalten dabei immer eine Anwendungsbeschreibung und werden mit dem Präfix „.“ gefolgt vom vollständigen Dateipfad ausgeführt. Ein Beispiel:

.C:\Users\IEUser\Desktop\script1.ps1

Was sind typische Anwendungsbereiche der PowerShell?

Ausreichende Übung und Fachkenntnis vorausgesetzt, lassen sich mit PowerShell viele Systemverwaltungsaufgaben deutlich effizienter gestalten. Im Folgenden erläutern wir Ihnen vier typische Anwendungsbeispiele.

Verzeichnisorganisation: Mehrere Dateien zugleich umbenennen

Angenommen, Sie müssen etwa 1.000 Dokumente des Schemas Text (1).docx, Text (2).docx usw. so umbenennen, dass die Leerzeichen im Dateinamen durch Unterstriche ersetzt werden: Sich jedes Dokument einzeln vorzunehmen, wäre dann nicht ratsam. Stattdessen würden Sie wahrscheinlich eher mit cmd.exe arbeiten oder – noch besser – auf ein externes Tool zurückgreifen. Das Pipelining in PowerShell erlaubt aber noch mehr Flexibilität beim Umbenennen großer Datenmengen.

Begeben Sie sich dafür zuerst in das Verzeichnis, in dem sich die Dokumente befinden. Das geht ganz einfach mit dem Cmdlet Set-Location in Kombination mit dem vollständigen Dateipfad. Hier ein Beispiel:

Set-Location C:\Users\IEUser\Desktop\Text folder

Alternativ können Sie auch über den Windows-Explorer in das entsprechende Verzeichnis navigieren, in die Pfadleiste klicken und „powershell“ eingeben, um ein PowerShell-Fenster für das Verzeichnis zu öffnen. Mit folgendem Cmdlet nennen Sie dann die ausgewählten Dokumente um:

Get-ChildItem *docx | Rename-Item -NewName {$_.name -replace " ","_"}

Zur Erklärung: Get-ChildItem listet alle Dateien im Verzeichnis auf. Durch den Zusatz *docx werden nur die Word-Dokumente mit dem entsprechenden Format herausgefiltert – ebenfalls im Ordner befindliche PDF-Dokumente würden also nicht berücksichtigt werden. Mit dem |-Symbol fügen Sie einen weiteren Befehl zur Pipeline hinzu, nämlich Rename-Item, der signalisiert, dass etwas umbenannt werden soll. -NewName gibt den neuen Namen anhand eines Skriptblocks an, der mit der Variable $_.name arbeitet, die das aktuelle Objekt repräsentiert. Und .name ist die Eigenschaft mit dem Dateinamen. Zuletzt geben Sie mit dem Parameter -replace an, dass sämtliche Leerzeichen in Unterstriche umgewandelt werden sollen.

Datenerfassung: Laufende Dienste auf einem PC überprüfen

Vor der Implementierung einer neuen Sicherheitslösung im Netzwerk sollten Sie überprüfen, welche Dienste auf einem bestimmten PC bereits installiert sind. Grundwerkzeug dafür ist das Cmdlet Get-Service, mit dem sämtliche Dienste aufgelistet werden. Durch die Filterfunktionen in PowerShell können Sie sich auch nur eine Teilmenge der Ergebnisse anzeigen lassen – zum Beispiel sämtliche laufende Dienste. Das funktioniert mit folgendem Cmdlet:

Get-Service | Where-Object {$_.status -eq "running"}

Der Output von Get-Service wird hier an das Cmdlet Where-Object per Pipeline weitergeleitet. Where-Object filtert sämtliche Dienste nach ihrem Status (dargestellt durch die Variable $_.status und den Parameter -eq "running") und listet die laufenden Dienste auf. Je nach Bedarf können Sie die vorgefilterte Liste auch nach Display-Namen sortieren lassen, indem Sie ein weiteres Cmdlet zur Pipeline hinzufügen:

Get-Service | Where-Object {$_.status -eq "running"} | Sort-Object DisplayName
Tipp

Mit dem Pipeline-Zusatz more kann man die lange Dienst-Auflistung auch so umstrukturieren, dass man sie seitenweise durchblättern kann.

Fehlerdiagnose: Ereignisprotokoll nach Systemfehlern durchsuchen

Ereignisprotokolle (Englisch event logs) geben Systemadministratoren Aufschluss über Fehlermeldungen in Anwendungen, im Betriebssystem oder in den Sicherheitsfunktionen eines Geräts. Mit dem Befehl Get-EventLog können Sie diese Protokolle einsehen und verwalten. Wollen Sie beispielsweise einen Blick auf die Fehlermeldungen der Ereignisanzeige „System“ werfen, geben Sie Folgendes ein:

Get-EventLog System | Where-Object {$_.entryType -Match "Error"}

Gibt PowerShell zu viele Ergebnisse aus, sodass Sie die Übersicht verlieren, können Sie die Liste mit dem Parameter -Newest 100 auf die neuesten 100 System-Logeinträge beschränken, die anschließend nach Fehlern gefiltert werden:

Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"}

Detaillierte Informationen über einzelne Fehlermeldungen erhalten Sie, indem Sie den Output dieser Pipeline an das Cmdlet Format-List weiterleiten:

Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} | Format-List

Fernwartung: Dienste auf Remotecomputern kontrollieren

Die Windows Management Instrumentation (WMI) gewährt Zugriff auf nahezu alle Einstellungen und Funktionen von Windows-Computern und stellt damit das wichtigste Werkzeug zur Automatisierung von Prozessen und zur Fernwartung digitaler Arbeitsplätze dar. Das dazugehörige Cmdlet Get-WmiObject kann man auch für Remotecomputer anwenden, sodass Sie die Windows PowerShell auch als Systemverwaltungstool nutzen können. Benötigen Sie beispielsweise Informationen der Klasse Win32_BIOS über einen Rechner im Netzwerk (dargestellt mit dem Parameter -Rechnername), hilft Ihnen der folgende Befehl weiter:

Get-WmiObject Win32_Bios -Rechnername

Alternativ können Sie auch mit dem Parameter -Class gefolgt vom vollständigen Pfad der Klasse arbeiten:

Get-WmiObject -Rechnername -Class Win32_Service

Per Fernzugriff können Sie nun auf systeminterne Einstellungen des Fremdrechners zugreifen. Das nachfolgende Beispiel verdeutlicht, wie man die Methoden des Dienstes Windows Update Client abrufen kann, um herauszufinden, mit welchen Cmdlets sich dieser starten, stoppen und neu starten lässt:

Get-WmiObject -Rechnername -Class Win32_Service -Filter "Name='wuauserv'"

Wie Sie sehen, wird per Get-WmiObject -Rechnername zuerst der gewünschte Rechner angepeilt und dann die Klasse Win32_Service mithilfe des Parameters -Class ausgewählt. Aus den vorhandenen Diensten wird dann der Windows Update Client mit dem Kürzel wuauserv herausgefiltert. Mit dem bereits bekannten Cmdlet Get-Member und dem Parameter -Type Method erhalten Sie dann einen Überblick über sämtliche Methoden für wuauserv, die Sie zur vollen Kontrolle des Clients aus der Ferne befähigen:

Get-WmiObject -Rechnername -Class Win32_Service -Filter "Name='wuauserv'" | Get-Member -Type Method