Windows PowerShell ist ein leistungsfähiges Tool zur Automatisierung von Aufgaben und zur Vereinfachung der Konfiguration. Damit lassen sich fast alle Aufgaben im Windows-Ökosystem automatisieren, auch für Active Directory und Exchange. Daher verwundert es nicht, dass PowerShell unter Systemadministratoren und erfahrenen Windows-Benutzern zu einem beliebten Tool geworden ist.
In unserem PowerShell-Tutorial haben wir Ihnen gezeigt, wie man die nützlichsten PowerShell-Tools verwendet. Nun ist es an der Zeit für den nächsten Schritt: diese Tools aus Skripten einsetzen, die mit nur einem Klick ausgeführt werden können. Dieses PowerShell-Skripting-Tutorial zeigt Ihnen, wie Sie einfache Skripte in PowerShell schreiben und ausführen, wodurch Sie letztendlich viel Zeit sparen können.
Die PowerShell-Sprache ist eine von Microsoft entwickelte proprietäre Programmiersyntax. In erster Linie dient sie dazu, Systemadministratoren die Automatisierung von Aktionen und Konfigurationen zu ermöglichen. Die Sprache basiert auf objektorientierten Standards, kann aber nur in Windows-Umgebungen verwendet werden. Sie ist Teil des .NET-Frameworks und enthält in der Regel C#-Code, der den Funktionen zugrundeliegt. C#-Kenntnisse sind allerdings keine Voraussetzung, um PowerShell zu erlernen. Am ehesten lässt sich die PowerShell-Sprache mit Perl vergleichen, das in ähnlichen Szenarien in Linux-Umgebungen eingesetzt wird.
In der PowerShell-Sprache wird jede einzelne Funktion als „Cmdlet“ bezeichnet. Ein Cmdlet hat eine oder mehrere Reihen von definierten Aktionen und kann ein .NET-Objekt zurückgeben. Einige der grundlegendsten Cmdlets, die in PowerShell vorkonfiguriert sind, dienen zur Navigation durch eine Verzeichnisstruktur und zum Verschieben oder Kopieren von Dateien.
Neue Cmdlet-Funktionen für PowerShell können in jedem Texteditor oder Textverarbeitungsprogramm geschrieben werden. Die neuesten Versionen des Windows-Betriebssystems enthalten jedoch ein Tool, das als „PowerShell ISE“ (Integrated Scripting Environment, zu Dt. integrierte Skriptingumgebung). Dieses macht das Skripting noch einfacher und robuster.
Wenn Sie die PowerShell ISE zum ersten Mal öffnen, fühlen Sie sich vielleicht an ein Eingabeaufforderungsfenster erinnert. Das Tool enthält jedoch viel mehr Funktionen und Unterstützungsfeatures für das Schreiben von Code. Die PowerShell ISE enthält eine beispielsweise eine vollständige Liste aller gängigen Module und Cmdlets, die Systemadministratoren oft benötigen. Wenn Sie bereit sind, eigene Cmdlet-Funktionen zu schreiben, können Sie mit dem Debugging-Tool in der PowerShell ISE Ihren Code testen, Bugs oder Probleme finden und diese dann beheben. Wie auch andere Coding-Umgebungen ist die PowerShell ISE hochgradig anpassbar. Die Benutzer können das Farbschema, die Schriftart und die Theme zum Schreiben von Skripten auswählen. Neue Skripte, die in der ISE erstellt werden, erhalten die Endung Dateierweiterung „.psi“. Diese kann ausschließlich in PowerShell-Umgebungen ausgeführt werden.
Die Skriptsprache in PowerShell wird Ihnen vertraut vorkommen, wenn Sie bereits mit der Windows-Eingabeaufforderung gearbeitet haben. Das Objekt- und Datenpiping funktionieren hier ähnlich, ebenso beispielsweise der Ping-Befehl:
Die in PowerShell verwendete Syntax ist jedoch meistens deutlich einfacher und leichter zu lesen als die in der Eingabeaufforderung verwendeten Befehle.
Obwohl Windows PowerShell für eine viele verschiedene Zwecke verwendet werden kann, liegt – zumindest für Anfänger – der Hauptnutzen von PowerShell-Skripten in der Systemautomatisierung für die folgenden Zwecke:
Unter Windows 10 lässt sich PowerShell am schnellsten über das Suchfeld starten. Geben Sie in der Taskleiste in das Suchfeld „PowerShell“ ein. Klicken oder tippen Sie dann auf das Ergebnis „Windows PowerShell“.
Um PowerShell als Administrator auszuführen, klicken Sie mit der rechten Maustaste (Touchscreen-Benutzer: tippen und halten) auf das Suchergebnis „Windows PowerShell“ und klicken oder tippen Sie dann auf „Als Administrator ausführen“.
Es gibt noch viele andere Möglichkeiten, eine PowerShell-Konsole zu starten, aber dies ist eine gute Methode für den Anfang.
Wenn Sie noch nicht mit PowerShell vertraut sind, werfen Sie einen Blick auf unser PowerShell-Tutorial, bevor Sie in das PowerShell-Skripting einsteigen. In dieser Anleitung finden Sie Beschreibungen aller grundlegenden Werkzeuge, die Sie für die Arbeit mit PowerShell benötigen. Dazu gehören Cmdlets, Aliase, Hilfebefehle und Pipes.
Sobald Sie die grundlegenden Befehle beherrschen, können Sie mit dem Schreiben von Skripten beginnen. Während Sie dazulernen, können Sie sich auch unsere Anleitungen unter Eingabeoptionen für PowerShell ansehen, sowie die Ressourcen unten in diesem Artikel durchlesen.
PowerShell-Skripte wie jene, die wir in diesem Tutorial erstellen, werden als .ps1-Dateien gespeichert. Standardmäßig können Sie diese Skripte mit Windows nicht durch einfachen Doppelklick ausführen. Das liegt daran, dass bösartige (oder schlecht geschriebene) Skripte viel unbeabsichtigten Schaden an Ihrem System verursachen können.
Um ein PowerShell-Skript auszuführen, müssen Sie stattdessen mit der rechten Maustaste auf die .ps1-Datei und anschließend auf „Mit PowerShell ausführen“ klicken.
Wenn Sie zum ersten Mal mit PowerShell-Skripten arbeiten, funktioniert das möglicherweise nicht. Das liegt daran, dass es eine systemweite Richtlinie gibt, die eine Ausführung verhindert. Führen Sie diesen Befehl in PowerShell aus:
Get-ExecutionPolicy
Sie werden eine der folgenden Ausgaben sehen:
Um mit PowerShell-Skripten arbeiten zu können, müssen Sie diese Richtlinieneinstellung ändern. Sie sollten sie zu „RemoteSigned“ ändern. Das können Sie direkt von PowerShell aus tun, indem Sie den folgenden Befehl ausführen:
Set-ExecutionPolicy RemoteSigned
Nun können Sie anfangen.
Die Leute lieben PowerShell, weil es einfach sehr leistungsstark ist. Aber die Power in PowerShell beruht auf einer schier unglaublichen Komplexität. Es ist einfach überhaupt nicht möglich bzw. praktisch, sich all die verschiedenen Befehle, Cmdlets, Flags, Filter und anderen Möglichkeiten zu merken, um PowerShell zu sagen, was es machen soll.
Glücklicherweise sind direkt in den Editor einige Tools integriert, die Ihnen dabei helfen können.
Sie müssen sich nicht alle verschiedenen Befehle in ihrer exakten Schreibweise merken. Geben Sie beispielsweise get-c im Editor ein und drücken Sie die Tab-Taste – nun schaltet PowerShell durch alle Befehle, die mit Ihrer bisherigen Eingabe beginnen. Das funktioniert in jedem Bereich des Befehls, den Sie aufrufen möchten: im Namen (wie unten gezeigt), aber auch in Flags und Pfaden, die Sie bearbeiten, um Ihr gewünschtes Ergebnis zu erzielen.
Die Tab-Vervollständigung funktioniert zwar gut, aber was, wenn Sie den Namen des gesuchten Befehls nicht kennen? In diesem Fall können Sie einen Befehl zum Suchen nach anderen Befehlen verwenden:
Get-Command
Bei der Suche nach Befehlen ist es wichtig zu wissen, dass sie immer einer bestimmten Syntax folgen: VERB-SUBSTANTIV. Die Verben sind beispielsweise „Get“, „Set“, „Add“, „Clear“, „Write“ und „Read“. Die Substantive sind jeweils die Dateien, Server oder andere Elemente in Ihrem Netzwerk und in Ihren Anwendungen.
Get-Command ist ein Suchtool, mit dem Sie die auf Ihrem System verfügbaren Befehle entdecken können.
Jemand beschrieb die Skriptsprache Perl einmal als „ausführbares Leitungsrauschen“ – ein enorm nützliches Werkzeug mit einer extrem undurchsichtigen Syntax und einer entsprechend schwierigen Lernkurve.
Die traditionelle Eingabeaufforderung in Windows ist zwar nicht ganz auf diesem Niveau, aber auch nicht allzu weit davon entfernt. Nehmen wir eine alltägliche Aufgabe, beispielsweise alle Dateien in einem Verzeichnis zu finden, deren Namen mit der Zeichenfolge „Foo“ beginnen.
CMD: FOR /D /r %G in (“Foo*”) DO @Echo %G
Und nun das PowerShell-Äquivalent dazu:
PowerShell: Get-ChildItem -Path C:\Example -Filter ‘Foo*’
Die Ausgabe ist funktionell die gleiche, aber selbst in diesem recht trivialen Beispiel kann man deutlich einfacher verstehen, was genau hier passiert. Es ist sofort ersichtlich, was die einzelnen Elemente des Befehls bewirken und wie man sie ändern kann. Die einzige Sache, die hier nicht ganz offensichtlich ist, ist das Wildcard-Zeichen „*“ (in beiden Beispielen). Dieses gibt an, dass das Muster, anhand dessen Treffer ermittelt werden, mit „Foo“ beginnen muss, aber beliebig enden kann.
Von hier an wird es immer besser. Sagen wir, Sie möchten wissen, wie Sie nur Dateien (keine Verzeichnisse) im Pfad identifizieren können? Sie könnten nun in die Dokumentation gehen, herumgoogeln und versuchen, es über die Befehlszeilenversion zu regeln. Oder Sie geben in PowerShell „-“ ein, drücken die Tab-Taste drücken und gehen die verschiedenen Flag-Optionen durch, bis die offensichtliche Lösung auftaucht.
Server bringen niemandem etwas, wenn sie nicht online sind. Deshalb verbringen die Leute extrem viel Zeit damit, so zu tun, als säßen sie an einem Sonar auf einem U-Boot, und diese Server anzupingen (das Wort „Ping“ kommt tatsächlich aus der Unterseefahrt).
Die Ausgabe von Ping-Befehlen ist zwar nützlich (und man kann Ping auch in PowerShell verwenden), aber am Ende des Tages ist sie nur eine lange Zeichenfolge – eine Reihe von Buchstaben und Zahlen ohne klar definierte Trennzeichen dazwischen).
PowerShell verfügt über einen Befehl, der dem Ping-Befehl ähnelt, aber strukturierte Daten zurückgibt, mit denen man leicht arbeiten kann. Dieser Befehl lautet „Test-Connection“.
Nachfolgend sehen Sie die Ausgabe des Pings eines Servers (mit dem Namen „DC“ im lokalen Netzwerk) und die entsprechende Ausgabe von Test-Connection.
Abgesehen davon, dass sie einfacher zu lesen ist, kann man diese Informationen vor allem problemlos an einen anderen Befehl weitergeben, sie in ein größeres Dienstprogramm integrieren (worauf dieser Kurs insgesamt abzielt) oder sie einfach so anpassen, dass sie mehr Sinn ergeben.
Es gibt zwei Hauptmöglichkeiten, ein PowerShell-Skript zu erstellen:
Write-Host “Hello World!”
Speichern Sie diese Datei dann als „FirstScript.ps1“.
Sie können das Skript von PowerShell aus mit dem folgenden Befehl aufrufen:
& "X:\FirstScript.ps1"
Die Ausgabe wird Ihnen in PowerShell angezeigt.
Die ISE bietet außerdem Syntaxhervorhebung, mehrzeilige Bearbeitung, Tab-Vervollständigung, selektive Ausführung und eine ganze Reihe weiterer Funktionen. Sie können sogar mehrere Skriptfenster gleichzeitig öffnen, was überaus praktisch ist, wenn Sie Skripte haben, die andere Skripte aufrufen.
Auch wenn es im Moment ein wenig übertrieben erscheinen mag, lohnt es sich dennoch, von Anfang an direkt mit der ISE zu arbeiten. So können Sie sich schon daran gewöhnen, bevor Sie anfangen, komplexere Skripte zu schreiben.
Nun können Sie anfangen, PowerShell-Skripte zu schreiben. Gehen wir also den Prozess Schritt für Schritt durch.
Fangen wir mit einem einfachen Skript an. Öffnen Sie in der ISE oder im Editor eine neue Datei. Geben Sie Folgendes ein:
Write-Host get-date
Speichern Sie die Datei dann als „GetDate.ps1“.
Sie können das Skript von PowerShell aus mit dem folgenden Befehl aufrufen:
& "C:\GetDate.ps1"
Die Ausgabe wird Ihnen in PowerShell angezeigt. Ganz einfach, oder?
Wenn Sie einen Windows-Dienst ausführen, der sich aufgehängt hat, können Sie ihn mit einem PowerShell-Skript beenden. Nehmen wir zum Beispiel an, mein Unternehmen benutzt Lync für die Geschäftskommunikation, es hängt sich jedoch immer wieder auf, und die Prozess-ID von Lync lautet „9212“. Ich kann Lync mit einem Skript beenden.
Dazu erstellen wir eine neue Skriptdatei, genauso wie zuvor. Diesmal geben wir Folgendes ein:
stop-process 9212
Oder
stop-process -processname lync
Speichern Sie die Datei unter dem Namen „StopLync.ps1“, und dann können Sie das Skript folgendermaßen aufrufen:
& "X:\StopLync.ps1"
Dieses Skript kann man dann erweitern, damit es mehrere Prozesse gleichzeitig beendet, indem man einfach weitere Befehle desselben Typs hinzufügt. Sie können auch ein anderes Skript schreiben, wenn Sie gleichzeitig und automatisch mehrere Prozesse starten wollen:
start-process -processname [Ihr Prozessname hier]
Dies ist besonders nützlich, wenn Sie beispielsweise mehrere Netzwerkprozesse gleichzeitig starten möchten und die Befehle nicht alle einzeln eingeben möchten.
Angenommen, Sie müssen mehrere Dateien löschen. Vielleicht möchten Sie zuerst überprüfen, ob die Dateien überhaupt existieren.
Mit „test-path“
können Sie, wie der Name schon vermuten lässt, überprüfen, ob Elemente unter einem Pfad existieren. Es gibt „TRUE“ zurück, wenn alle Elemente vorhanden sind, und „FALSE“, wenn welche fehlen.
Geben Sie einfach den folgenden Befehl ein:
test-Path (und dann den Dateipfad)
Nun kennen wir die Grundlagen und können ein Skript schreiben, das etwas wirklich Nützliches macht. Für Systemadministratoren besteht einer der Hauptvorteile von PowerShell darin, dass sich den Prozess der Einrichtung neuer Computer automatisieren lässt.
Heute nutzen sowohl Privatpersonen als auch Unternehmen VPNs (virtuelle private Netzwerke) als quasi obligatorische Sicherheitsmaßnahme zum Schutz proprietärer Daten. Alle neuen Computer sollten bei Einrichtung mit einem VPN verbunden werden. Das geht zwar auch manuell, aber genau für solche Aufgaben ist PowerShell perfekt geeignet. Für Anfänger – also für die meisten Leser dieser Anleitung – sind die meisten tauglichen VPN-Services für Ihre Computerumgebung geeignet. Wir können nun ein Skript schreiben, das automatisch einen erstellt und konfiguriert.
Am einfachsten geht das, indem man eine neue Datei öffnet und dann den folgenden Befehl eingibt:
Set-VpnConnection -Name "Test1" -ServerAddress "10.1.1.2" -PassThru
Sie müssen Ihre Serveradresse auf die Adresse Ihres lokalen VPN-Servers setzen, und dank dem Befehl „PassThru“ gibt dieses Skript die Konfigurationsoptionen des VPN zurück.
Speichern Sie die Datei als „SetVPN.ps1“, und dann sollten Sie es genau so aufrufen können, wie Sie es schon zuvor getan haben:
& "X:\SetVPN.ps1"
Wenn Sie diesen Befehl nun zum ersten Mal aufrufen, werden möglicherweise ein paar Fehler ausgegeben. Aber das gehört auch zum Lernprozess bei PowerShell. Keine Angst: Wann immer Sie auf einen solchen Fehler stoßen, konsultieren Sie einfach Microsofts offizielle Anleitung für den Befehl „Set-VpnConnection“ und passen Sie die dortigen Beispiele an Ihr System an.
In der folgenden Tabelle sind einige der von uns verwendeten PowerShell-Zeichensetzung zusammengefasst:
Symbol | Name | Funktion | Beispiel |
$ | Dollarzeichen | Deklariert eine Variable | $a |
= | Ist gleich | Weist der Variablen einen Wert zu | $a=get-date |
“” | Doppelte Anführungszeichen | Doppelte Anführungszeichen werden zur Anzeige von Text verwendet | If $a = Monday
“Day of the Week: $a” Day of the Week: Monday |
+ | Plus | Verkettung | $a = November
“Day of the Week: ” Day of the Week: Monday |
( ) | Klammern | Gruppierung zum Erstellen von Argumenten | (get-date).day |
Nachfolgend finden Sie die neuesten Tutorials, die ich auf eine Top-Ten-Liste zusammengekürzt habe:
Noch mehr Zeit sparen Sie, wenn Sie lernen, wie man Aktive Directory mit PowerShell konfiguriert und verwaltet. Dazu gibt es diese Ressourcen:
Nachdem Sie nun so viel freie zeit gewonnen haben, können Sie doch lernen, wie Sie mit den folgenden Ressourcen Exchange automatisieren:
Wir hoffen, dass dieses PowerShell-Skripting-Tutorial für Anfänger Ihnen eine gute Grundlage für den Einstieg in das PowerShell-Skripting bietet. Sobald Sie die Grundlagen der PowerShell-Syntax beherrschen, ist die Arbeit mit Skripten ziemlich einfach: Halten Sie Ihre Skripte einfach organisiert und benennen Sie sie so, dass man leicht versteht, welche Funktion sie haben. So können Sie den Überblick behalten.
Und wenn Sie das Skripting erst einmal beherrschen, sind die Möglichkeiten mit PowerShell wirklich grenzenlos. Schauen Sie sich zum Beispiel unseren Leitfaden zum Active-Directory-Skripting an, um einen Einblick in die Flexibilität von PowerShell zu erhalten.
Zum Schluss allerdings noch eine kleine Warnung: verlassen Sie sich nicht allein auf PowerShell, um Datensicherheit und -zugriff zu verwalten. Selbst wenn Sie sich extrem gut im PowerShell-Skripting auskennen, machen die Komplexität der DSGVO und ähnlicher Gesetze das Datenmanagement einfach zu komplex für ein derart einfaches Tool. Stattdessen sollten Sie mit einem Experten besprechen, wie Sie den Zugriff auf die in Ihren Systemen gespeicherten Daten verwalten können.