Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
PowerShell ist eine hochmoderne Shell-Sprache. Im Windows-Umfeld entstanden, ist sie inzwischen für Linux und macOS und die Cloud verfügbar und wird auch zur Gerätesteuerung eingesetzt. Als plattformunabhängige Open-Source-Software ist sie sicher und zukunftsfähig.
Dr. Tobias Weltner, einer der weltweit führenden PowerShell-Experten, erklärt Schritt für Schritt, praxisnah und mit wenigen Zeilen Code, wie man wiederkehrende Aufgaben automatisiert: Ob Sie beruflich Server oder Software remote konfigurieren oder privat Ihre Farbwechsellampen fernsteuern möchten – fast alles ist möglich. Wer das "IT-Allzweckwerkzeug" PowerShell beherrscht, steigert ganz erheblich seine Lösungskompetenz und seinen Wert für ein Unternehmen.
Sie entscheiden selbst, wie schnell und wie tief Sie einsteigen. Bereits nach den ersten Kapiteln werden Sie erfolgreich und effizient Routineaufgaben automatisieren. Dieses Praxisbuch vermittelt Ihnen das nötige Wissen und Know-how, um PowerShell-Code parallel auf hunderten von Servern auszuführen, grafische Oberflächen und Fenster zu erzeugen, Heimgeräte zu steuern und eigene Befehlserweiterungen zu erstellen.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 786
Veröffentlichungsjahr: 2021
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Zu diesem Buch – sowie zu vielen weiteren O’Reilly-Büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei oreilly.plus+:
www.oreilly.plus
Dr. Tobias Weltner
Das komplette Praxiswissen für Administratoren und IT-Profis
Dr. Tobias Weltner
Lektorat: Ariane Hesse
Lektoratsassistenz: Anja Weimer, Julia Griebel
Korrektorat: Sibylle Feldmann, www.richtiger-text.de
Satz: Gerhard Alfes, mediaService, www.mediaservice.tv
Herstellung: Stefanie Weidner
Umschlaggestaltung: Michael Oreal, www.oreal.de, unter Verwendung eines Fotos von iStock by Getty Images von querbeet, Stock-Fotografie-ID184997148
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der DeutschenNationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN:
Print 978-3-96009-163-9
PDF 978-3-96010-479-7
ePub 978-3-96010-480-3
mobi 978-3-96010-481-0
1. Auflage 2021
Copyright © 2021 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«. O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.
Hinweis:Dieses Buch wurde auf PEFC-zertifiziertem Papier aus nachhaltiger Waldwirtschaft gedruckt. Der Umwelt zuliebe verzichten wir zusätzlich auf die Einschweißfolie.
Schreiben Sie uns:Falls Sie Anregungen, Wünsche und Kommentare haben, lassen Sie es uns wissen: [email protected].
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.
5 4 3 2 1 0
Vorwort
Wie Sie dieses Buch nutzen
Achtung
Noch mehr Unterstützung
1PowerShell: Erste Schritte
PowerShell installieren
Windows-Betriebssystem
PowerShell nachrüsten: macOS und Linux
Kompatibilität der PowerShell
PowerShell einrichten
Vorsicht mit Administratorrechten!
Interaktive Befehle eingeben
Autovervollständigung: Tippfehler vermeiden
Befehlszeilen erneut verwenden
Groß- und Kleinschreibung
Unvollständige und mehrzeilige Eingaben
PowerShell-Hilfe aus dem Internet nachladen
Skriptausführung erlauben
Weitere PowerShell-Einschränkungen
Wichtige PowerShell-Werkzeuge
PowerShell-ISE-Editor
VSCode (Visual Studio Code)
Windows-Terminal
Codebeispiele automatisch herunterladen
Befehl zum Herunterladen von Codebeispielen nachrüsten
Beispielcode in Zwischenablage kopieren
Beispielcode sofort ausführen
Profilskripte: PowerShell dauerhaft anpassen
Einzelne Profilskripte verwenden
Fragen stellen
Alle Skripte herunterladen
Zusammenfassung
Ausführungsrichtlinie festlegen
Hilfe nachrüsten
Windows PowerShell aktualisieren
Hilfsbefehle zum Download von Beispielcode
»Fehlende Befehle« verstehen
Zusätzliche Werkzeuge
2Überblick: Was PowerShell leistet
Befehle lösen Aufgaben
Literale
Text
Zahlen
Datum und Zeit
Kommentare
Cmdlets: die PowerShell-Befehle
Nach Tätigkeitsbereich suchen (»Noun«)
Nach Tätigkeit suchen (»Verb«)
Nach Herkunft suchen
Standardisierte Verben
Cmdlets per Fenster suchen
Syntax verstehen
Ausführliche Hilfe und Beispiele
Anwendungsprogramme (Applications)
Applications starten
Applications finden
Systembefehle nutzen
Hilfe für Applications abrufen
.NET-Methoden
Methoden verwenden
Hilfe für Methoden
Noch mehr Methoden
Methoden: vielseitiger, aber kleinteiliger
Operatoren
Operatoren nachschlagen
Vergleichsoperatoren
Textoperatoren
Zuweisungen und Pipeline
Zahlenreihen
Befehle verbinden
Das Türchen-Modell
Normalfall: »Türchen 3«
Modernes Pipeline-Streaming: »Türchen 1«
Klassische Variablen: »Türchen 2«
Neue Befehle nachrüsten
Beispiel 1: QR-Codes generieren
Beispiel 2: Automatische HTML-Reports
Beispiel 3: Musik spielen
Zusammenfassung
3Skripte und Funktionen
PowerShell-Skripte verstehen
Skriptcode eingeben
Skripte mit dem ISE-Editor entwickeln
Neues Skript anlegen
Skripte mit dem VSCode-Editor entwickeln
Neue Skripte anlegen
Skripte ausführen
Skripte innerhalb von PowerShell starten
Skripte außerhalb von PowerShell starten
Skripte automatisch starten
Skriptstart durch Task Scheduler
Profilskripte – die Autostartskripte
Profilskript anlegen und öffnen
Typische Profilskriptaufgaben durchführen
Neue Befehle: Funktionen
Schritt 1: Nützlicher Code
Schritt 2: Als Funktion verpacken
Schritt 3: Parameter definieren
Schritt 4: Funktionen dauerhaft verfügbar machen
Funktionen im Modul permanent verfügbar
Die gemeinsame Grundlage: der Skriptblock
Skripte sind gespeicherte Skriptblöcke
Funktionen sind vorgeladene Skriptblöcke
Module laden Funktionen bei Bedarf in den Speicher
Skript oder Funktion?
4Cmdlets – PowerShell-Befehle
Parameter steuern Cmdlets
Argumente an Parameter übergeben
Parameter machen Cmdlets vielseitig
Politisch inkorrekt: positionale Argumente
Gratiszugabe: »Common Parameters«
Auf Fehler reagieren
Vielseitigkeit durch Parametersätze
»Schmal, aber tief« – Cmdlets sind Spezialisten
Mehrere Parametersätze: noch mehr Vielseitigkeit
Praxis: Ereignisse aus dem Ereignislogbuch lesen
»ISA/HASA« – wie Cmdlets in der Pipeline funktionieren
Das »ISA/HASA«-Prinzip
Praxisnutzen
Vorteile des Pipeline-Streamings
5Die PowerShell-Pipeline
Aufbau der PowerShell-Pipeline
Befehle reichen Ergebnisse weiter
Pipeline steuert Befehle
Prinzipieller Aufbau der Pipeline
Die sechs wichtigsten Pipeline-Befehle
Select-Object
Detailinformationen festlegen
Unsichtbare Eigenschaften sichtbar machen
Eine bestimmte Eigenschaft auswählen: -ExpandProperty
Selbst festlegen, welche Informationen wichtig sind
Weitere Informationen anfügen
-First, -Last und -Skip
Berechnete Eigenschaften
Where-Object
Clientseitiger Universalfilter
Leere Elemente aussortieren
Fortgeschrittene Syntax bietet mehr Möglichkeiten
Out-GridView: das »menschliche« Where-Object
Sort-Object
Cmdlet-Ergebnisse sortieren
Sortierung mit anderen Cmdlets kombinieren
Datentyp der Sortierung ändern
Mehrere Spalten in umgekehrter Sortierung
Group-Object
Häufigkeiten feststellen
Daten gruppieren
Berechnete Gruppierungskriterien
Measure-Object
Statistische Berechnungen
Ordnergrößen berechnen
Foreach-Object
Grundprinzip: eine Schleife
Format-Cmdlets
Gefährlich: Format-Cmdlets verändern Objekte
Mehrspaltige Anzeigen
Tabellenausgabe mit Gruppierung
6Arrays und Hashtables
Arrays verwenden
Auf Array-Elemente zugreifen
Eigene Arrays (und einige Fallen)
Automatische Array-Erzeugung
Manuelle Array-Erzeugung
Hashtables – »sprechende Arrays«
Hashtables in Objekte umwandeln
Neue Objekte mit Eigenschaften initialisieren
7PowerShell-Laufwerke
Dateisystemaufgaben meistern
Cmdlets für das Dateisystem finden
Erste Schritte
Ordner anlegen
Dateien anlegen und Informationen speichern
Encoding von Textdateien
Encodings sichtbar machen
Dateien finden
Dateien und Ordner kopieren
Dateien umbenennen
Dateien und Ordner löschen
Größe eines Laufwerks ermitteln
Größe eines Ordners ermitteln
Umgebungsvariablen
Alle Umgebungsvariablen auflisten
Auf einzelne Umgebungsvariablen zugreifen
Umgebungsvariablen ändern
Windows-Registrierungsdatenbank
Schlüssel suchen
Werte lesen
Neue Registry-Schlüssel anlegen
Registry-Schlüssel löschen
Werte hinzufügen, ändern und löschen
Virtuelle Laufwerke und Provider
Neue PowerShell-Laufwerke
Ohne Laufwerksbuchstaben direkt auf Provider zugreifen
-Path oder -LiteralPath?
Existenz eines Pfads prüfen
Pfadnamen auflösen
8Operatoren und Bedingungen
Operatoren – Aufbau und Namensgebung
Wie Operatornamen aufgebaut sind
Unäre Operatoren
Zuweisungsoperatoren
Vergleichsoperatoren
Ternary-Operator
Unterscheidung zwischen Groß- und Kleinschreibung
Unterschiedliche Datentypen vergleichen
Vergleiche umkehren
Vergleiche kombinieren
Vergleiche auf Arrays anwenden
Bedingungen
if-Bedingung
switch-Bedingung
Where-Object
Null-Koaleszenz-Operatoren
Pipeline-Verkettungsoperatoren
9Textoperationen und reguläre Ausdrücke
Texte zusammenfügen
Doppelte Anführungszeichen lösen Variablen auf
Der Formatierungsoperator -f
Array-Elemente in Text umwandeln
Textstellen finden und extrahieren
Texte splitten
Informationen in Texten finden
Reguläre Ausdrücke: Textmustererkennung
Erste Schritte: Textmuster basteln
Eigene reguläre Ausdrücke konzipieren
Textstellen ersetzen
Einfache Ersetzungen
Sichere Ersetzungen mit -replace
Mehrere Zeichen durch eins ersetzen
Split und Join: eine mächtige Strategie
Dateipfade ändern
X500-Pfade auslesen
10Anwendungen und Konsolenbefehle
Programme starten
Optionen für den Programmstart festlegen
Argumente an Anwendungen übergeben
Hilfe für Konsolenbefehle anzeigen
Beispiel: Lizenzstatus von Windows überprüfen
Ergebnisse von Anwendungen weiterverarbeiten
Error Level auswerten
Fragen an Benutzer stellen mit choice.exe
Rückgabetext auswerten
Laufende Programme steuern
Feststellen, ob ein Prozess läuft
Auf einen Prozess warten
Einstellungen laufender Prozesse ändern
Prozesse vorzeitig abbrechen
11Typen verwenden
Typumwandlungen
Geeignete Datentypen auswählen
Explizite Umwandlung
Deutsches Datumsformat mit dem Operator -as
Verkettete Umwandlungen
Typen: optimale Informationsbehälter
Implizite Umwandlung
Typisierte Variablen
Parameter und Argumente
Vergleichsoperationen
Statische Methoden eines Typs verwenden
Dateiextension ermitteln
Mathematische Funktionen
Zahlenformate konvertieren
DNS-Auflösung
Umgebungsvariablen
Pfade zu Systemordnern finden
Konsoleneinstellungen
Spezielle Datumsformate lesen
Statische Eigenschaften verwenden
Neue .NET-Typen finden
Type Accelerators untersuchen
Typen nachladen
Assembly-Namen feststellen
Aktuell geladene Assemblies auflisten
Zusätzliche Assembly nachladen
Assembly aus Datei nachladen
12Mit Objekten arbeiten
Objekte kennenlernen
Objekte funktionieren wie beschriftete Schubladen
Typisierte Variablen
Objekteigenschaften erforschen
Eigenschaften lesen
Eigenschaften ändern
Methoden verwenden
Zusammenfassende Systematik
Eigenschaften
Methoden
Hilfe finden
Neue Objekte herstellen
Konstruktoren verstehen
Ein Credential-Object zur automatischen Anmeldung
Eigene Objekte erstellen
13Eigene Typen und Attribute
Typen (Klassen) selbst herstellen
Einen eigenen Typ erfinden
Neue Objekte eines Typs generieren
Konstruktoren hinzufügen
Methoden zum Typ hinzufügen
Vererbung von Typen
Konstruktoren werden nicht geerbt
Philips Hue Smart Home mit Typen steuern
Kontakt zur Philips Hue Bridge herstellen
Lampen- und Schalterinventar
Lampen und Steckdosen ansprechen
Attribute erstellen
SecureString-Transformationsattribute
Auf API-Funktionen zugreifen
API-Funktion einsetzen
Wiederverwertbare PowerShell-Funktion herstellen
14Parameter für Fortgeschrittene
Argumentvervollständigung
Statische Autovervollständigung
Autovervollständigung über Enumerationsdatentyp
Eigene Enumerationsdatentypen erstellen
Autovervollständigung über ValidateSet
Dynamische Argumentvervollständigung
Zuweisungen mit Validierern überprüfen
ValidateSet
ValidateRange
ValidateLength
ValidatePattern
ValidateCount
ValidateScript
Nullwerte und andere Validierer
Parameter in ParameterSets einteilen
Gegenseitig ausschließende Parameter
Binding über Datentyp
Parameter in mehreren Parametersätzen
Simulationsmodus (-WhatIf) und Sicherheitsabfrage (-Confirm)
Festlegen, welche Codeteile übersprungen werden sollen
Weiterleitung verhindern
Gefährlichkeit einer Funktion festlegen
Dynamische Parameter
Dynamische Parameter selbst definieren
Splatting: Argumente an Parameter binden
Splatting im Alltag einsetzen
Übergebene Parameter als Hashtable empfangen
Mit Splatting Parameter weiterreichen
15Pipeline-fähige Funktionen
Anonyme Pipeline-Funktion
Prototyping
Pipeline-fähige Funktion erstellen
Benannte Parameter
Where-Object durch eine Funktion ersetzen
Kurzes Resümee
Parameter und Pipeline-Kontrakt
ISA-Kontrakt: Pipeline-Eingaben direkt binden
HASA-Kontrakt: Objekteigenschaften lesen
HASA und ISA kombinieren
CSV-Dateien direkt an Funktionen übergeben
Aliasnamen für Parameter
16PowerShellGet und Module
PowerShellGet – die PowerShell-Softwareverteilung
Grundlage »PackageManagement«
PowerShellGet – Softwareverteilung per Cmdlets
Wo PowerShell Module lagert
Unterschiede zwischen Windows PowerShell und PowerShell
Installierte Module untersuchen
Module mit PowerShellGet nachinstallieren
Module finden und installieren
Modul herunterladen
Modul testweise ausführen
Modul dauerhaft installieren
Module aktualisieren
Side-by-Side-Versionierung
Eigene Module veröffentlichen
Eigene Module herstellen
Neue Manifestdatei anlegen
Neue Moduldatei anlegen
Modul testen
Nächste Schritte
Eigene Module verteilen
Netzwerkfreigabe
Modul in Repository übertragen
Modul aus privatem Repository installieren
17Fehlerhandling
Fehlermeldungen unterdrücken
Bestimmen, wie Cmdlets auf Fehler reagieren
Fehler mitprotokollieren lassen
Erfolg eines Befehlsaufrufs prüfen
Fehlerhandler einsetzen
Lokaler Fehlerhandler: try…catch
Globaler Fehlerhandler: Trap
18Windows PowerShell-Remoting
PowerShell-Remoting aktivieren
Zugriff auch auf Windows-Clients
Remoting-Verbindung überprüfen
NTLM-Authentifizierung erlauben
PowerShell-Remoting überprüfen
Erste Schritte mit PowerShell-Remoting
Befehle und Skripte remote ausführen
Kontrolle: Wer besucht »meinen« Computer?
Remotefähigen Code entwickeln
Argumente an Remote-Code übergeben
Ergebnisse vom Remote-Code an den Aufrufer übertragen
Fan-Out: integrierte Parallelverarbeitung
ThrottleLimit: Parallelverarbeitung begrenzen
Double-Hop und CredSSP: Anmeldeinfos weiterreichen
Eigene Sitzungen verwenden
Eigene Sitzungen anlegen
Parallelverarbeitung mit PSSessions
SSH-basiertes Remoting
SSH-Remoting aktivieren
Enter-PSSession über SSH
Invoke-Command über SSH
Unbeaufsichtigte Ausführung und Parallelbearbeitung
19Grafische Oberflächen gestalten
Eigene Fenster herstellen
GUI mit Code definieren
GUI mit XAML definieren
Beispiel: Dienststopper-Anwendung
Index
PowerShell begann vor 15 Jahren als Windows Powershell. Heute ist diese Shell plattformübergreifend auf Windows, Linux und macOS verfügbar und wird begeistert von einer immer größeren Anwendercommunity genutzt.
In diesem Buch werden Sie Schritt für Schritt erfahren, was PowerShell eigentlich ist und was diese Shell alles für Sie tun kann. Ob Sie Administrator »on-premise« sind und lokale Server betreuen, Ihr Unternehmen in der Cloud verwalten oder ob Sie heterogene Umgebungen »unter einen Hut« bringen wollen – PowerShell bietet die Werkzeuge dafür.
Aber auch zu Hause und in der Schule lässt es sich hervorragend einsetzen: PowerShell ist es nämlich egal, ob Sie damit eine Unternehmens-IT administrieren, Ihre Philips-Hue-Homeautomation verwalten oder Sonnenkollektoren steuern. Ob Sie den eigenen NAS-Server auf dem Dachboden sichern, automatisiert Dateien aus dem Internet laden oder vielleicht bloß Matherätsel knacken wollen.
Und genau deshalb ist PowerShell auch in Ausbildung und Schulen spannend: Kaum eine andere kostenlose Programmierumgebung und Shell unterstützt so viele Programmierkonzepte auf so vielen Plattformen – angefangen von Befehlsaufrufen über moderne Programmiertechniken wie den Einsatz von Funktionen und Objekten bis hin zu nativer Klassenunterstützung, Vererbung und universellem Netzwerk-Remoting. Kaum eine andere Umgebung bietet so unmittelbares Feedback wie PowerShell. Ideal also, um im Unterricht und in der Ausbildung anhand von nachvollziehbaren Praxisbeispielen die Funktionsweisen moderner IT auszuprobieren und zu vertiefen.
Dieses Buch bietet zahlreiche Praxisbeispiele aus den unterschiedlichsten Einsatzbereichen und demonstriert schrittweise die vielfältigen Möglichkeiten der PowerShell.
So schlüpfen Sie zu Anfang des Buches in die Rolle des einfachen PowerShell-Anwenders. Sie generieren mit Einzeilern Excel- und HTML-Reports und können mit wenigen Schritten Cloud-Systeme steuern oder Notenblätter aus dem Internet herunterladen und als PDF exportieren.
Von diesen ersten Fingerübungen inspiriert lernen Sie den Minimal-Wortschatz der PowerShell kennen und fügen mehrere Befehle zu eigenen größeren Automationslösungen zusammen.
Die Anwendungsbeispiele werden immer komplexer, und Sie lernen schrittweise alle weiteren wichtigen Konzepte der PowerShell kennen. Dazu gehören Remotezugriffe, direkte Betriebssystemaufrufe, das Erstellen grafischer Oberflächen sowie eigene PowerShell-Befehle und -Module.
Am Ende dieses Buches beherrschen Sie dann eine der modernsten Automationssprachen, die für Windows, Linux und macOS kostenfrei zur Verfügung stehen, und haben sich privat wie beruflich vom einfachen Anwender zum versierten IT-Automatisierer qualifiziert.
Damit Sie auf dieser Reise nicht allzuviel eintippen müssen, automatisiert PowerShell in diesem Buch auf Wunsch natürlich auch das Eintippen der Beispiele für Sie. Schon im ersten Kapitel lernen Sie den passenden Befehl kennen: durch Eingabe der jeweiligen Listingnummer fügt PowerShell den Quellcode aus dem Buch automatisch ein.
Dieses Buch setzt keinerlei Grundkenntnisse voraus, wenn Sie von vorn zu lesen beginnen – und das ist auch empfehlenswert. Die Kapitel bauen aufeinander auf. Am Anfang jedes Kapitels finden Sie eine kurze Zusammenfassung, falls es einmal eilig ist.
Die PowerShell-Beispiele im Buch sind jeweils in einer anderen Schriftart formatiert. Damit Sie leichter erkennen, welche Eingaben von Ihnen erwartet werden, wird bei allen Eingaben die PowerShell-Eingabeaufforderung PS> (einschließlich der Leerstelle hinter dem >) vorangestellt. Diese Eingabeaufforderung kann bei Ihnen auch anders aussehen und sollte in den Beispielen natürlich nicht mit eingegeben werden.
Bitte verwenden Sie die Begleitmaterialien immer im Kontext des entsprechenden Buchkapitels. Viele der Beispiele funktionieren nur, wenn Sie die entsprechenden Vorarbeiten im Kapitel beachtet haben, oder können auch unerwartete Resultate liefern, wenn man die Beispiele aus dem Zusammenhang des Kapitels reißt.
Falls trotz aller Sorgfalt einmal Fragen offenbleiben oder Sie weitere Ideen und Themenwünsche haben, besuchen Sie einfach das interaktive Leserforum zu diesem Buch: https://github.com/TobiasPSP/OReilly/discussions
Damit bleibt mir an dieser Stelle nur noch, Ihnen viel Spaß zu wünschen bei der Lektüre dieses Buchs und bei der Arbeit mit der faszinierenden PowerShell! Ich würde mich freuen, von Ihnen im Diskussionsforum zu hören.
Herzlichst,
Tobias Weltner
In diesem Kapitel:
PowerShell installieren
PowerShell einrichten
Wichtige PowerShell-Werkzeuge
Codebeispiele automatisch herunterladen
Profilskripte: PowerShell dauerhaft anpassen
Zusammenfassung
Ausführlich werden in diesem Kapitel die folgenden Aspekte erläutert:
Windows PowerShell:
In Windows integrierte PowerShell, die auf dem klassischen
.NET Framework Version 4.5
oder höher basiert und auch künftig für Automationsaufgaben im Windows-Umfeld eingesetzt werden kann. Der Startbefehl lautet
powershell.exe
, und die aktuelle Version ist 5.1.
PowerShell:
Neuartige, plattformunabhängige PowerShell, die als portable Anwendung bei Windows parallel zur
Windows PowerShell
verwendet werden kann und auch auf Linux, macOS und weiteren Betriebssystemen zur Verfügung steht. Der Startbefehl lautet
pwsh.exe
. Diese PowerShell beruht auf dem plattformunabhängigen neuen
.NET Framework Core
, das weitgehend kompatibel zum klassischen .NET Framework ist. Die
PowerShell
ist im Gegensatz zur
Windows PowerShell
quelloffen (Open Source).
Autovervollständigung:
Mit einigen Tastendrücken kann man sich bei der Eingabe von Befehlen, Parametern und Argumenten Tipparbeit sparen: vervollständigt Eingaben. Drücken Sie die Taste mehrmals, zeigt PowerShell bei jedem Drücken einen weiteren Vorschlag. + geht in der Reihenfolge wieder einen Schritt zurück. Mit + werden Eingabevorschläge als vollständige Auswahlliste präsentiert. Editoren zeigen dazu ein IntelliSense-Menü an. In der Konsole erscheint ein textbasiertes Auswahlfeld. Unabhängig von den Autovervollständigungsvarianten können Sie mit und frühere Eingaben aus Ihrer Befehlshistorie anzeigen lassen. Diese Liste ist anfangs leer und wächst mit der Verwendung der Konsole.
Zeilen löschen und Befehlsabbruch:
Um die gesamte aktuelle Zeile zu löschen, drücken Sie . Um einen Befehl abzubrechen, drücken Sie + .
Groß- und Kleinschreibung:
PowerShell selbst unterscheidet bei Befehlsnamen und Parametern nicht zwischen Groß- und Kleinschreibung. Ob die Groß- und Kleinschreibung bei Befehlsargumenten (wie zum Beispiel Pfadnamen oder anderen Angaben) wichtig ist, hängt vom jeweiligen Befehl und dem verwendeten Betriebssystem ab. Bei Kennworteingaben beispielsweise kommt es natürlich immer auf die richtige Groß- und Kleinschreibung an.
Wenn Sie es eilig haben und die Grundlagen der PowerShell schon kennen, dürfen Sie diesen Einleitungsteil selbstverständlich überspringen. Sie sollten aber in jedem Fall wenigstens den Abschnitt »Zusammenfassung« am Ende dieses Kapitels beachten. Dort werden wichtige Grundeinstellungen besprochen, die die Voraussetzung für viele Beispiele in den folgenden Kapiteln sind.
PowerShell ist eine verblüffend flexible und machtvolle plattformunabhängige Automationssprache, die mit geringem Aufwand ein enormes Spektrum von Aufgaben automatisieren kann.
Dazu zählen typische IT-Administrationsaufgaben ebenso wie völlig andere Einsatzbereiche aus Mathematik, Forschung und Lehre, in der Büroautomation und nicht zuletzt in Hobby und Tüftelei: Schon im nächsten Kapitel werden wir uns kurz der Musikkomposition und Steuerung von MIDI-Musikinstrumenten widmen, und in Kapitel 13 erfahren Sie zum Beispiel, wie PowerShell sogar Lampen und Steckdosen in Ihrem Zuhause fernsteuert. Die Grundlagen und Strategien sind dabei indes immer dieselben.
Bei all diesen Beispielen geht es also ausschließlich um zweierlei: kurzweilig und verständlich möglichst viele Einsatzszenarien der PowerShell vorzustellen, um Ideen zu wecken und eine breite Leserschicht anzusprechen, und die stets gleichen allgemeinen Mechanismen zu verstehen, die dabei zum Einsatz kommen.
Denn mit dem Wissen, das Sie beispielsweise in der Musikkomposition oder auch bei der Fernsteuerung von Elektrogeräten benötigen, können Sie natürlich auch Server aufsetzen oder Drittanbietersoftware für Backup-Lösungen steuern – und umgekehrt. Hier wird deutlich, dass PowerShell ebenfalls eine ideale Plattform für Ausbildung und Schule ist, denn alle modernen IT-Grundlagen lassen sich damit anschaulich und unterhaltsam vermitteln.
Zunächst aber muss PowerShell vollständig eingerichtet werden, und genau darum geht es in diesem ersten Kapitel. Dabei werden auch einige wichtige Sicherheitseinstellungen besprochen, und der Unterschied zwischen PowerShell und Windows PowerShell wird Ihnen schnell klar werden.
Danach folgt ein kleiner Exkurs zu den wichtigsten kostenlosen PowerShell-Tools, mit denen Sie Ihren Computer in eine moderne PowerShell-Entwicklungsumgebung verwandeln.
Zum Abschluss des Kapitels erfahren Sie, wie die vielen Hundert Skriptbeispiele in diesem Buch ohne Tipparbeit direkt von PowerShell aus dem Internet heruntergeladen und ausgeführt werden und wie offengebliebene Fragen unmittelbar an den Autor gerichtet werden können.
In diesem Buch wird das Wort »PowerShell« immer dann kursiv gesetzt, wenn spezifisch die neue plattformübergreifende PowerShell gemeint ist. Der nicht kursiv gesetzte Begriff »PowerShell« bezieht sich allgemein auf die Sprache PowerShell und gilt sowohl für Windows PowerShell als auch für PowerShell.
Schon in diesem Kapitel wird Ihnen bereits PowerShell-Code begegnen, der aber hier als reines »Werkzeug« für die Einrichtung Ihres Computers dient. Sie können den Code natürlich bereits neugierig mustern, aber bitte brüten Sie nicht zu lange über einzelnen Codebeispielen. Es kommt in diesem Kapitel nur auf die Ergebnisse der Codebeispiele an, nicht auf den Code selbst und seine Mechanismen. Diese stehen ab dem zweiten Kapitel im Vordergrund und werden dort dann auch systematisch besprochen.
PowerShell ist plattformunabhängig und kann auf verschiedenen Betriebssystemen ausgeführt werden, zum Beispiel Windows, Linux oder macOS.
Historisch ist PowerShell allerdings als Teil des Windows-Betriebssystems entstanden und dort als sogenannte Windows PowerShell immer automatisch enthalten. Seit 2016 ist diese Fassung in Version 5.1 fertiggestellt, wird auf diesem Stand gehalten und weiter von Microsoft gewartet.
Alle Entwicklungsarbeit geht seit 2016 in die neue, plattformunabhängige PowerShell, bei Drucklegung dieses Buchs in Version 7.2, die bei allen Betriebssystemen zuerst nachinstalliert werden muss. Wie das geschieht, erfahren Sie jetzt, und zwar in separaten Abschnitten für die jeweiligen Betriebssysteme.
In allen Windows-Betriebssystemen ab Server 2008 und Windows 7 ist die PowerShell bereits fester Bestandteil – genauer gesagt die Windows PowerShell. Hier könnten Sie also sofort loslegen, sollten aber wenigstens prüfen, ob Ihre Windows PowerShell auf dem aktuellen Stand ist (dazu gleich mehr).
Noch empfehlenswerter ist es, zusätzlich zur integrierten Windows PowerShell auch die neue PowerShell hinzuzuinstallieren. Beide laufen friedlich parallel nebeneinander, und so können Sie sich ein eigenes Bild von den Unterschieden machen.
Sie starten die Windows PowerShell mit dem Befehl powershell.exe (oder kurz powershell) – wie jedes andere Programm auch. Drücken Sie zum Beispiel + , um das Dialogfeld Ausführen zu öffnen (siehe Abbildung 1.1), und geben den Befehl powershell ein. Dann klicken Sie auf OK.
In der Taskleiste erscheint ein blaues Symbol, das Sie per Rechtsklick und An Taskleiste anheften am besten dauerhaft dort anpinnen. Ein Rechtsklick auf das Symbol öffnet die sogenannte Sprungliste, sozusagen das Cockpit der Windows PowerShell (siehe Abbildung 1.2).
Abbildung 1.1: Windows PowerShell starten
Von hier aus können Sie die PowerShell zum Beispiel mit vollen Administratorrechten starten, und auch der in Windows PowerShell integrierte Editor ISE (Integrated Script Environment) steht hier bereit.
Abbildung 1.2: Sprungliste der Windows PowerShell
Die Windows PowerShell selbst erscheint als blaue oder schwarze Konsole, in die Sie Befehle eingeben können (siehe Abbildung 1.3). Auch wenn es Ihnen bereits in den Fingern juckt: Verschieben Sie Ihre Experimente bitte noch einen Moment – was Sie alles mit PowerShell tun können, veranschaulicht der Rundkurs im nächsten Kapitel.
Lassen Sie uns zunächst alles einsatzbereit machen.
Abbildung 1.3: Die in Windows integrierte Windows PowerShell
Falls Sie Windows 10 oder Server 2016 (und besser) verwenden, ist alles gut: Diese Betriebssysteme enthalten Windows PowerShell in Version 5.1, der letzten und ausgereiften Version. Diese Version wird über die gesamte Laufzeit von Windows 10 weitergepflegt und automatisch aktualisiert.
Wer ein älteres Windows-Betriebssystem nutzt, muss Windows PowerShell manuell aktualisieren. Das ist sinnvoll, weil die Codebeispiele dieses Buchs die aktuelle Windows Power-Shell 5.1 voraussetzen. Es ist aber vor allem wichtig, weil Updates stets auch Programmfehler und Sicherheitslücken berichtigen. Schauen Sie also in Ihrer Windows PowerShell kurz nach, welche Version Sie verwenden (siehe Abbildung 1.4). Geben Sie ein:
PS> $PSVersionTable.PSVersion
Zurückgeliefert wird die Version der PowerShell. Bei Versionen kleiner als 5.1 (Major: 5, Minor: 1) ist es Zeit für ein Update.
Abbildung 1.4: Version der PowerShell bestimmen
Weil Windows PowerShell ein fester Teil von Windows ist, kann man sie nur über spezielle Update-Pakete aktualisieren. Diese stehen kostenlos bei Microsoft als sogenannte msu-Pakete zum Download bereit. Bei Drucklegung dieses Buchs fand man das sogenannte Windows Management Framework 5.1 hier: https://www.microsoft.com/en-us/download/details.aspx?id=54616 (siehe Abbildung 1.5).
Links ändern sich, und sollte der genannte Link nicht mehr funktionieren, googeln Sie nach »Windows Management Framework 5.1 Download«.
Bitte beachten Sie auf der Downloadseite die Installationshinweise am Ende der Seite, insbesondere wenn Sie noch das alte Windows 7 verwenden. Windows PowerShell erfordert übrigens das .NET Framework 4.5 oder besser, das bei sehr alten Windows-Systemen gegebenenfalls vor dem Update nachinstalliert werden muss.
Bei Clients ist ein Update der Windows PowerShell schnell erledigt. Bei Servern sollten Sie sich dagegen vor dem Update unbedingt genauer informieren: Serversoftware wie Microsoft Exchange kann auf eine ganz bestimmte Windows PowerShell-Version festgelegt sein. Entweder aktualisieren Sie in so einem Fall Windows PowerShell gemeinsam mit den übrigen Serverkomponenten, die davon abhängen, oder Sie installieren, wenn Ihnen das zu heikel oder zu aufwendig ist, parallel zu Windows PowerShell kurzerhand die neue moderne PowerShell und arbeiten künftig einfach mit dieser, während Sie Windows PowerShell unverändert lassen.
Abbildung 1.5: Windows PowerShell ist Teil des Windows Management Framework.
Weil Windows PowerShell in das Windows-Betriebssystem fest integriert ist, kann sie – wie Sie gerade erlebt haben – nur relativ umständlich aktualisiert werden. Erst recht steht sie nicht auf anderen Betriebssystemen zur Verfügung. Deshalb hat das Microsoft-Entwicklungsteam um Steve Lee im Jahr 2016 die Entwicklung der Windows PowerShell abgeschlossen.
Alle folgenden Versionen der PowerShell wurden fundamental anders entwickelt: Sie sind nicht mehr Bestandteil von Windows, sondern eigenständige portable Anwendungen, die fortan auf dem neuen plattformunabhängigen .NET Framework Core basieren. So kann Power-Shell nun auch auf Linux, macOS und anderen Betriebssystemen eingesetzt werden.
Die neue PowerShell heißt auch nicht länger Windows PowerShell, sondern nur noch Power-Shell, die Anwendung pwsh.exe anstelle von powershell.exe.
Darüber hinaus ist PowerShell quellcodeoffen (Open Source) und portabel. Sie kann also beliebig oft und in beliebigen Versionen parallel existieren, und wenn Sie möchten, könnten Sie sie sogar wie ein persönliches Werkzeug auf einem USB-Stick bei sich tragen und vom Stick aus starten.
So ist die neue PowerShell sogar für Windows-Anwender interessant. Installieren Sie sie parallel zur vorhandenen Windows PowerShell, können Sie wahlweise Windows PowerShell über den Befehl powershell starten oder eben PowerShell über den Befehl pwsh.
Das wirft in Unternehmen häufig die Frage auf, ob (und, wenn ja, wie) man unternehmensweit von Windows PowerShell auf PowerShell umsteigen sollte. Schließlich ist die Windows PowerShell ja inzwischen »veraltet« und wird nicht länger weiterentwickelt. Stimmt das?
Nein. Windows PowerShell ist keineswegs abgekündigt und wird bis ans Ende der Laufzeit von Windows 10 weiter voll von Microsoft unterstützt. Auch etwaige Sicherheitslücken, sollten sie denn auftreten, werden weiterhin behoben, und Windows PowerShell ab Version 5.1 wird über das automatische Windows Update automatisch gepflegt.
Deshalb spricht nichts dagegen, Windows PowerShell auch weiterhin einzusetzen. Windows PowerShell hat gegenüber PowerShell sogar zwei unternehmenskritische Vorteile:
Automatische Verfügbarkeit: Weil Windows PowerShell fester Bestandteil von Windows ist, steht sie immer automatisch zur Verfügung und wird ebenso automatisch aktualisiert. Wollen Sie stattdessen die neuere PowerShell einsetzen, müssten Sie sich eine eigene Deployment-Strategie überlegen, also PowerShell in eigener Verantwortung auf alle Computer im Unternehmen verteilen und natürlich auch zeitnah aktuell halten.Vollständiges .NET Framework:Windows PowerShell basiert auf dem klassischen vollständigen .NET Framework 4.5. Dies ist eine Softwarebibliothek, aus der sich die meisten Windows-Anwendungen bedienen. Die plattformübergreifende PowerShell dagegen basiert auf dem abgespeckten .NET Framework Core, derzeit in Version 3.1. Obwohl dieses Framework rund 99 % der notwendigen Funktionen enthält, besteht doch die Möglichkeit, dass bestimmte Erweiterungen oder ältere Skripte darauf nicht lauffähig sind.Wenn Sie also nicht unbedingt auf bestimmte neue Funktionalitäten in PowerShell angewiesen sind, spricht überhaupt nichts dagegen, im Unternehmen auch weiterhin flächendeckend Windows Power-Shell einzusetzen. Spezialisten und PowerShell-Entwickler können davon unbenommen auf ihren eigenen Entwicklungssystemen und in eigener Regie natürlich dennoch bereits die neue PowerShell einsetzen, wenn sie ihnen Vorteile bietet.
Am einfachsten funktioniert die Installation der PowerShell über den Microsoft Store. Öffnen Sie ihn, indem Sie im Windows-Startmenü nach »Store« suchen.
In vielen Unternehmensumfeldern ist der Zugang zum Microsoft Store abgeschaltet. Hier installieren Sie die neue PowerShell manuell (siehe unten). Besondere Administratorrechte sind für die Installation nicht notwendig.
Natürlich kann auch die Windows PowerShell den Store für Sie öffnen (denn PowerShell kann alles, was auch per Maus zu bewerkstelligen ist – sofern Sie die passenden Befehle kennen):
Start-Process shell:appsFolder\Microsoft.WindowsStore_8wekyb3d8bbwe!App
Wenn Sie die Codebeispiele aus dem Buch nicht von Hand eingeben wollen, rüsten Sie den Befehl L mit dieser Zeile nach:
PS> Invoke-RestMethod -Uri https://tinyurl.com/codeAusBuch -UseBasicParsing | New-Item -Path
function: -Name L -Force | Out-Null
Geben Sie hinter dem Befehl die Listing-Nummer an, beispielsweise:
PS> L 1.1
Listing 1.1 liegt in der Zwischenablage. Fügen Sie es mit STRG+V in Konsole oder Editor ein.
Mehr zum Befehl L, welche sonstigen Tricks er auf Lager hat und wie Sie den Befehl dauerhaft verfügbar machen, erfahren Sie ab Seite 63.
Klicken Sie im Microsoft-Store-Fenster auf Suchen und geben Sie als Suchwort »PowerShell« ein. Klicken Sie auf PowerShell Preview und dann auf Installieren (siehe Abbildung 1.6).
Abbildung 1.6: PowerShell 7 als Preview über den Microsoft Store installieren
Die Preview-Fassung der PowerShell enthält jeweils die allerneuesten Funktionen und eignet sich besonders gut zum Experimentieren und Kennenlernen. Darüber hinaus steht im Store neuerdings auch die Produktionsversion ohne den Zusatz »Preview« zur Verfügung.
Falls der Store Sie übrigens um Anmeldedaten bittet oder dazu drängen will, ein Benutzerkonto anzulegen, lehnen Sie dankend ab. Eine Anmeldung ist zum Herunterladen und Installieren nicht nötig.
Nach der Installation wird die neue PowerShell über den Befehl pwsh gestartet. Drücken Sie also zum Beispiel + und geben Sie den Befehl pwsh ins Dialogfeld Ausführen ein. Dann klicken Sie auf OK.
Die neue PowerShell öffnet ein Konsolenfenster mit schwarzem Hintergrund (bei Windows PowerShell ist der Hintergrund blau). Auch das Symbol der neuen PowerShell ist schwarz und nicht blau. In der Titelleiste des Konsolenfensters lesen Sie außerdem den Pfad, unter dem die neue PowerShell installiert wurde.
Klicken Sie das Symbol der neuen PowerShell in der Taskleiste mit der rechten Maustaste an und wählen Sie An Taskleiste anheften. So bleibt es dauerhaft sichtbar, und Sie können künftig bequem per Mausklick die passende PowerShell öffnen (siehe Abbildung 1.7).
Abbildung 1.7: Windows PowerShell und PowerShell lassen sich in Windows parallel betreiben.
Die angehefteten Symbole der Taskleiste befinden sich übrigens in einem separaten versteckten Ordner, den Sie über den folgenden Befehl öffnen können:
PS> explorer "$env:appdata\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
Wenn Sie die Version der neuen PowerShell durch Eingabe von $PSVersion überprüfen, offenbaren sich erste Unterschiede (siehe Abbildung 1.8):
Abbildung 1.8: Eine als »App« über den Microsoft Store installierte PowerShell 7.1
PSVersion meldet die neue Version, und PSEdition zeigt Core. Bei Windows PowerShell steht hier Desktop.
Die Bezeichnungen in PSEdition haben ausschließlich historische Gründe:
Ursprünglich hieß die neue PowerShell nämlich PowerShell Core und war als minimalistische Version zur reinen Remote-Verwaltung der »Nano-Server« gedacht, denen man die Benutzeroberfläche wegrationalisiert hatte.
Weil die Entwicklung der Nano-Server aber schnell wieder eingestellt wurde, hat man PowerShell Core danach zu einer plattformübergreifenden Shell weiterentwickelt. Das Wort »Core« passt nun natürlich nicht mehr, und so heißt diese plattformübergreifende PowerShell heute einfach nur PowerShell. In der Eigenschaft PSEdition wird sie indes weiterhin Core genannt.
Künftig ist zwar geplant, in die Windows PowerShell einen Befehl zu integrieren, mit dem man die neue PowerShell automatisch herunterladen und installieren kann, bisher gibt es diesen bequemen Befehl jedoch nicht.
Man kann ihn allerdings bereits nachrüsten. Dafür sind keine besonderen Berechtigungen nötig. Mit diesem neuen Befehl lässt sich die plattformübergreifende PowerShell besonders flexibel manuell installieren, zum Beispiel auch dann, wenn der Zugang zum Microsoft Store nicht zur Verfügung steht.
Öffnen Sie dazu zunächst eine Windows PowerShell, zum Beispiel über + und dann powershell.
Danach führen Sie den folgenden Befehl aus (siehe Listing 1.2), um das neue Cmdlet Install-PowerShell nachzurüsten:
Invoke-RestMethod -Uri https://aka.ms/install-powershell.ps1 -UseBasicParsing | New-Item -Path
function: -Name Install-PowerShell | Out-Null
Invoke-RestMethod lädt aus dem Internet den Quellcode für den neuen Befehl herunter. Diesen Quellcode könnten Sie auch sichtbar machen, indem Sie die Internetadresse in einen Browser eingeben:
Abbildung 1.9: Microsoft stellt ein Installationsskript für PowerShell 7 zur Verfügung.
New-Item verwandelt den heruntergeladenen Quellcode dann in einen neuen Befehl namens Install-PowerShell. Er steht danach sofort zur Verfügung, und mit ihm können Sie nun ganz bequem PowerShell 7 nachinstallieren.
Mehr zu selbst definierten Cmdlets erfahren Sie in Kapitel 14. Was es mit New-Item und dem Laufwerk function: auf sich hat, ist Thema von Kapitel 7.
Der folgende Befehlsaufruf würde beispielsweise die aktuelle Produktivversion von PowerShell 7 im Ordner c:\ps7test installieren und diesen Ordner zur Path-Umgebungsvariablen hinzufügen, sodass der Befehl pwsh von überall aus aufrufbar würde:
PS> Install-PowerShell -Destination c:\ps7test -AddToPath
In manchen Unternehmensszenarien verbieten die Sicherheitseinstellungen die Installation auf diese Weise, und Sie erhalten stattdessen rote Fehlermeldungen. Installieren Sie PowerShell 7 dann stattdessen als verwaltetes MSI-Paket:
PS> Install-PowerShell -UseMSI
Wird PowerShell 7 als MSI-Paket installiert, erscheint ein Dialogfeld mit Installationsoptionen. Übernehmen Sie die vorgegebenen Optionen. Wenn Sie später auch remote auf PowerShell 7 zugreifen möchten, aktivieren Sie zusätzlich im Dialogfeld die Option für das sogenannte Remoting.
Auch eine unbeaufsichtigte Installation ist dabei mit dem Parameter -Quiet möglich. Ob Power-Shell indes tatsächlich mit -Quiet unbeaufsichtigt installiert werden kann, hängt davon ab, ob Sie die Installation mit vollen Administratorrechten durchführen. Ohne sie erscheint trotz -Quiet ein Dialogfeld.
Da PowerShell eine »portable App« ist, können Sie potenziell so viele Versionen parallel zueinander in unterschiedlichen Ordnern installieren, wie Sie mögen, oder die portable PowerShell auf einem USB-Stick mit sich führen. Allerdings führt das zwangsläufig zu einem Dilemma: Welche davon würde nun der Befehl pwsh starten?
Wenn Sie den absoluten Pfadnamen verwenden, also den kompletten Pfadnamen einschließlich der Ordner, ist die Sache klar. Wird dagegen nur pwsh eingegeben, durchsucht Windows die Ordner in der Umgebungsvariablen Path und startet den ersten Treffer. Hier ist dann also die Reihenfolge maßgeblich, in der Ihre verschiedenen Installationen in der Umgebungsvariablen Path aufgeführt sind.
Sie können den Inhalt der Umgebungsvariable mit diesem Befehl auflisten:
PS> $env:path -split ';'
C:\ps7test
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
...
Falls Sie PowerShell gestartet haben und nachträglich herausfinden möchten, wo diese PowerShell eigentlich gespeichert ist, wählen Sie folgenden Befehl:
PS> [Environment]::CommandLine
C:\ps7test\pwsh.dll
In diesem Beispiel sehen Sie, dass PowerShell aus dem Ordner c:\ps7test gestartet wurde. Sie sehen übrigens auch, dass die neue PowerShell eigentlich eine Bibliothek mit der Dateierweiterung *.dll ist. Der Startbefehl pwsh.exe leitet den Aufruf also bloß an diese Bibliothek weiter. Nerds wie ich finden so etwas spannend, aber Sie können dieses Detail auch höflich ignorieren.
Den Pfad zur jeweils gerade genutzten PowerShell finden Sie hiermit heraus:
PS> (Get-Process -Id $pid).Path
C:\ps7test\pwsh.exe
Die Variable $pid enthält bei allen Versionen der PowerShell stets die Prozess-ID der gerade laufenden PowerShell-Instanz-Sitzung.
In Linux-Betriebssystemen sind Paketmanager wie apt, yum, dnf, pacman oder brew seit Langem im Einsatz. Sie laden zusätzliche Software automatisch aus dem Internet und installieren sie. Mit diesen Paketmanagern wird übrigens auch PowerShell auf Linux- und macOS-Systemen installiert.
Bei Windows sind solche Paketmanager noch relativ neu, setzen sich aber auch hier inzwischen durch: Am verbreitetsten sind Chocolatey (https://chocolatey.org/install) und Scoop (https://scoop.sh/).
Auch PowerShell ist auf diesen Zug aufgesprungen und enthält einen eigenen plattformunabhängigen Paketmanager namens PowerShellGet (siehe Kapitel 16): Mit ihm kann man kinderleicht PowerShell-spezifische Ressourcen wie neue Cmdlets oder Skripte nachinstallieren, und schon im nächsten Kapitel begegnen Ihnen zahlreiche Beispiele dazu.
Weil Paketmanager für viele Windows-Anwender noch relativ neu sind, sollen die beiden Windows-Paketmanager Chocolatey und Scoop kurz mit einigen Beispielen zeigen, was sie können und wie Paketmanager funktionieren.
Der grundlegende Unterschied zwischen den beiden ist die Art, wie Software installiert wird und welche Rechte dazu nötig sind: Während Chocolatey Installationspakete auf konventionelle Weise stets für alle Anwender installiert und dazu Administratorrechte benötigt, installiert Scoop Anwendungen ohne Administratorrechte und nur für den aktuellen Anwender als portable Apps.
Chocolatey eignet sich daher eher für die Unternehmens-IT, während sich Scoop an Endanwender richtet, die trotz eingeschränkter Rechte schnell und einfach zusätzliche Software installieren möchten.
In beiden Fällen müssen Sie bei älteren Windows-Systemen zuerst den neueren Sicherheitsprotokollstandard TLS 1.2 erlauben, der bei aktuellen Windows-Versionen automatisch unterstützt wird. Andernfalls können Sie über geschützte https:-Verbindungen keine Daten herunterladen:
[System.Net.ServicePointManager]::SecurityProtocol -bor
[System.Net.SecurityProtocolType]::Tls12
Da die Installation über PowerShell-Skripte erfolgt, müssen Sie außerdem mindestens vorübergehend für die aktuelle Sitzung die Ausführung von Skripten erlauben. Sie erfahren in Kapitel 3 mehr darüber. Einstweilen genügt dieser Befehl:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
Führen Sie die folgenden Befehle unbedingt in einer PowerShell-Konsole aus und nicht in einem Editor wie zum Beispiel dem ISE-Editor.
Die Befehle der hier vorgestellten Softwareverteilungen können im laufenden Betrieb Rückfragen an Sie stellen, zum Beispiel ob ein fehlendes Softwarepaket mitinstalliert werden soll. Solche Rückfragen werden von Editoren wie ISE nicht unterstützt und unterdrückt, sodass das Skript bei Nachfragen in Editoren zu »hängen« scheint.
Wenn Sie über Administratorrechte verfügen und Software klassisch für alle Anwender des Computers installieren möchten, installieren Sie sich die Paketverwaltung Chocolatey. Dazu benötigen Sie aktivierte Administratorrechte.
Chocolatey erfordert grundsätzlich zur Installation volle Administratorrechte und ist schlecht geeignet, wenn Sie Software nur für den aktuellen Anwender installieren möchten. Verwenden Sie für diesen Fall besser Scoop (siehe nächsten Abschnitt).
Listing 1.5 lädt mit Invoke-RestMethod zuerst das Installationsskript von Chocolatey herunter und führt es dann mit Invoke-Expression aus. Das dürfen Sie natürlich nur tun, wenn Sie den Quellen solcher Skripte vertrauen. Geben Sie die URL im Zweifelsfall in die Adressleiste Ihres Browsers ein, um den Code zuerst zu untersuchen oder im Unternehmensumfeld von jemandem freigeben zu lassen.
Invoke-RestMethod -UseBasicParsing -Uri 'https://chocolatey.org/install.ps1' | Invoke-Expression
Alles Weitere übernimmt das Installationsskript und berichtet über alle Schritte, die es ausführt:
Getting latest version of the Chocolatey package for download.
Getting Chocolatey from https://chocolatey.org/api/v2/package/chocolatey/0.10.15.
Downloading 7-Zip commandline tool prior to extraction.
Extracting C:\Users\tobia\AppData\Local\Temp\chocolatey\chocInstall\chocolatey.zip to C:\Users\tobia\AppData\Local\Temp\chocolatey\chocInstall...
Installing chocolatey on this machine
Creating ChocolateyInstall as an environment variable (targeting 'Machine')
Setting ChocolateyInstall to 'C:\ProgramData\chocolatey'
WARNING: It's very likely you will need to close and reopen your shell before you can use choco.
Restricting write permissions to Administrators
We are setting up the Chocolatey package repository.
The packages themselves go to 'C:\ProgramData\chocolatey\lib'
(i.e. C:\ProgramData\chocolatey\lib\yourPackageName).
A shim file for the command line goes to 'C:\ProgramData\chocolatey\bin' and points to an executable
in 'C:\ProgramData\chocolatey\lib\yourPackageName'.
Creating Chocolatey folders if they do not already exist.
WARNING: You can safely ignore errors related to missing log files when
upgrading from a version of Chocolatey less than 0.9.9.
'Batch file could not be found' is also safe to ignore.
'The system cannot find the file specified' - also safe.
Adding Chocolatey to the profile. This will provide tab completion, refreshenv, etc.
WARNING: Chocolatey profile installed. Reload your profile - type . $profile
Chocolatey (choco.exe) is now ready.
You can call choco from anywhere, command line or powershell by typing choco.
Sobald Chocolatey installiert ist, steht der Befehl choco zur Verfügung. Mit ihm kann man nun auch PowerShell über den folgenden Befehl herunterladen und installieren:
PS> choco install powershell-core
Interessanter dürfte für viele Anwender Scoop sein, weil es keine Administratorrechte benötigt. Hier wird Software grundsätzlich nur für den aktuellen Benutzer und nur als portable Anwendung heruntergeladen und in einem eigenen Scoop-Ordner zentral zur Verfügung gestellt.
Auch für den Einsatz von Scoop gelten die Voraussetzungen von oben: TLS 1.2 muss aktiviert sein, und PowerShell muss Skripte ausführen dürfen.
Listing 1.6 macht Scoop einsatzbereit. Dazu wird zunächst ähnlich wie bei Chocolatey das Installationsskript heruntergeladen und ausgeführt. Anschließend wird mit scoop install eine portable Version des Paketmanagers git installiert und der sogenannte bucket um weitere Installationsquellen ergänzt, sodass scoop eine besonders große Auswahl an installierbaren Tools und Softwareprodukten installieren kann:
Invoke-RestMethod -UseBasicParsing -Uri 'https://get.scoop.sh' | Invoke-Expression
scoop install git
scoop bucket add extras
Mit der folgenden Zeile wird PowerShell dann heruntergeladen und installiert:
PS> scoop install pwsh
Scoop speichert alles grundsätzlich als portable Software in einem gemeinsamen Ordner Scoop/Apps innerhalb des Benutzerprofils, sodass die installierte Software dort gefunden und gestartet werden kann:
PS> explorer $home\Scoop\Apps
PS> & $home\Scoop\Apps\pwsh\current\pwsh.exe
Anders als bei Chocolatey obliegt es aber nun Ihnen, die neu installierte Software über Verknüpfungen im Startmenü, auf dem Desktop oder an anderen leicht erreichbaren Orten bereitzustellen.
Mit scoop installieren Sie natürlich nicht nur PowerShell. Es können sehr bequem und schnell verschiedenste Tools und Anwendungen heruntergeladen und installiert werden, beispielsweise 7zip oder notepad++:
PS> scoop install 7zip
PS> scoop install notepadplusplus
Um nach weiteren installierbaren Anwendungen zu suchen, verwenden Sie scoop search:
PS> scoop search
PS> scoop search vscode
Mit den folgenden Befehlen installieren Sie beispielsweise die im PowerShell-Umfeld beliebten und an anderer Stelle detailliert besprochenen Tools VSCode und Windows-Terminal:
PS> scoop install vscode-portable
PS> scoop install windows-terminal
Software lässt sich in der Regel mit Scoop einwandfrei herunterladen und ausführen. Manche Programme benötigen allerdings gewisse Voraussetzungen. Windows-Terminal zum Beispiel ist nur auf Windows 10 ab Build 1903 ausführbar, und wenn Sie ein anderes oder älteres Betriebssystem verwenden, lässt es sich trotz einwandfreier Installation nicht starten. Wunder kann also auch Scoop leider nicht vollbringen.
Auch Microsoft bietet verschiedene eigene Paketmanager. Das .NET Core Software Development Kit (SDK) beinhaltet das .NET Global Tool, mit dem man PowerShell über den folgenden Befehl herunterladen und installieren kann:
PS> dotnet tool install –global PowerShell
Im Frühjahr 2020 hat Microsoft zudem den Windows Package Manager vorgestellt. Ist er installiert, kann PowerShell über den folgenden Befehl heruntergeladen und installiert werden:
PS> winget install powershell
Es gibt unzählige unterschiedliche Linux-Distributionen, aber die prinzipiellen Installationsschritte sind immer gleich: Mit einem unterstützten Paketmanager wird PowerShell heruntergeladen und installiert. Dazu ist es meist erforderlich, zuvor den entsprechenden öffentlichen Schlüssel von Microsoft herunterzuladen und zu registrieren. Mit diesem Schlüssel wird geprüft, ob das Installationspaket authentisch und unbeschädigt ist.
Auf https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux finden Sie für die unterschiedlichen Distributionen und Installationsarten detaillierte Skripte.
Bei Ubuntu 16.04 sieht ein solches Installationsskript zum Beispiel folgendermaßen aus, zur Installation wird hier der Paketmanager apt verwendet:
# Paketliste aktualisieren
sudo apt-get update
# Abhängigkeiten installieren
sudo apt-get install -y wget apt-transport-https software-properties-common
# Microsoft GPG Keys herunterladen
wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
# GPG Keys registrieren:
sudo dpkg -i packages-microsoft-prod.deb
# Paketliste aktualisieren:
sudo apt-get update
# PowerShell herunterladen und installieren:
sudo apt-get install -y powershell
# PowerShell starten:
pwsh
Alternativ kann bei ungelösten Paketabhängigkeiten gegebenenfalls der Paketmanager SNAP eine Alternative darstellen:
# PowerShell installieren:
sudo snap install powershell –classic
# PowerShell starten:
pwsh
# PowerShell entfernen:
sudo snap remove powershell
Da PowerShell quellcodeoffen ist, können Sie stets auch die Projektwebseite besuchen, um sich dort über die neuesten Versionen zu informieren, oder die neueste Version für das entsprechende Betriebssystem ohne Paketmanager direkt herunterladen und manuell installieren:
https://github.com/PowerShell/PowerShell
Neben dem Quellcode finden Sie dort die aktuellen Installationsmedien. Scrollen Sie dazu die Startseite nach unten, bis Sie Hinweise ähnlich wie die in Abbildung 1.10 sehen.
Webseiten ändern sich und werden hin und wieder restrukturiert. Unter https://github.com/PowerShell/PowerShell/releases finden Sie aber in jedem Fall die Liste der veröffentlichten Versionen und Installationsmedien.
Idealerweise würde PowerShell über Apples App Store bereitgestellt. Aktuell ist das indes leider noch nicht der Fall. Die nächsteinfachere Installationsvariante nutzt den Paketmanager homebrew, der dafür zunächst installiert werden muss (https://brew.sh/). Anschließend ist die Installation der PowerShell wie bei allen Paketmanagern trivial:
brew install --cask powershell
pwsh
Um PowerShell von Zeit zu Zeit zu aktualisieren, schreiben Sie:
brew update
brew upgrade powershell --cask
Weitere Informationen finden Sie hier: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-macos.
Abbildung 1.10: PowerShell steht für viele Betriebssysteme zur Verfügung.
Lassen Sie uns an dieser Stelle gleich die zwangsläufigen Fragen zur Kompatibilität von Power-Shell-Code stellen, die natürlich entstehen, wenn PowerShell auf so vielen unterschiedlichen Plattformen ausführbar ist. Also wie kompatibel ist PowerShell eigentlich?
Kann ich ein PowerShell-Skript auf Linux entwickeln und auf Windows ausführen (oder umgekehrt)?
Kann ich Skripte, die ursprünglich für
Windows PowerShell
konzipiert wurden, unverändert in der neuen
PowerShell
einsetzen?
Kann ich also beispielsweise nahtlos mit all meinem vielleicht schon bestehenden Code im Unternehmen von
Windows PowerShell
auf
PowerShell
umsteigen?
Die Antwort auf alle Fragen lautet wie so häufig: »Kommt drauf an.«
Die eigentliche PowerShell-Sprache ist wunderbar abwärtskompatibel: Eine höhere Power-Shell-Version unterstützt also immer die Sprachelemente einer niedrigeren PowerShell-Version. Die neue PowerShell (in Version 7.x) unterstützt daher alle Sprachelemente der älteren Windows PowerShell (Version 5.1).
Lediglich eine spezielle Windows PowerShell-Technik wurde in PowerShell komplett entfernt: Workflows. Dies geschah aber mangels Interesse, denn Workflows hatten sich nie durchgesetzt.
Prinzipiell sind also alte Skripte in der neuen PowerShell unverändert einsetzbar (sofern sie keine Workflows verwenden).
In der Praxis ist es dann leider doch nicht so einfach, denn das eben Gesagte bezieht sich nur auf »Sprachelemente«. Die PowerShell-Sprache bildet also einen Rahmen, und der ist kompatibel. Die eigentlichen Befehle, die in diesem Rahmen eingesetzt werden, sind es oftmals aber nicht.
Der PowerShell-Befehlssatz ist nämlich nicht fest vorgegeben und noch nicht einmal Teil der eigentlichen PowerShell, sondern speist sich aus verschiedenen externen Quellen (die im nächsten Kapitel genauer dargelegt werden). Deshalb kann es durchaus sein, dass Befehle in einer anderen PowerShell-Version oder auf einem anderen Betriebssystem nicht zur Verfügung stehen:
Aufgegebene Befehle:
Einige
Windows PowerShell
-Befehle wurden bei
PowerShell
endgültig ausgemustert, weil sie entweder veraltet oder Windows-spezifisch waren. Dazu zählen populäre Befehle wie
Get-EventLog
oder
Get-WmiObject
, die bei
Windows PowerShell
sehr häufig eingesetzt wurden. Setzt ein Skript solche Befehle ein, muss es umgeschrieben werden. Für die meisten dieser Befehle gibt es seit PowerShell 3 (bessere) Alternativen (beispielsweise
Get-WinEvent
und
Get-CimInstance
).
Plattformspezifische Befehle:
Andere PowerShell-Befehle (zum Beispiel
Get-Printer
oder
Get-NetIpConfiguration
) und erst recht Anwendungen (zum Beispiel
robocopy.exe
) stammen vom Betriebssystem oder installierter Drittsoftware. Wenn ein Skript solche Befehle verwendet, funktioniert es möglicherweise nicht mehr plattformübergreifend.
Der Ehrlichkeit halber muss gesagt werden, dass all dies meist gar nicht tragisch ist: In der Regel sollen PowerShell-Skripte ganz plattformspezifische Aufgaben automatisieren. Dort, wo die eingesetzten Befehle fehlen, werden sie also typischerweise auch gar nicht benötigt.
Und soll PowerShell doch einmal plattformübergreifende Aufgaben erfüllen, sind die dazu notwendigen Befehle, beispielsweise für Programmaufrufe, Dateisystem- und Fernzugriffe sowie Remoting, in allen PowerShell-Versionen und -Varianten gleichermaßen vorhanden.
Man kann sich PowerShell also am besten vorstellen als ein generisches, plattformübergreifendes Basis-Automationsframework, das je nach verwendeter Software und eingesetztem Betriebssystem wie ein individueller Maßanzug um viele spezifische Befehle ergänzt ist.
Ein besonderes Szenario gilt für den überaus populären Befehl Out-GridView, mit dem man Auswahldialoge wie den in Abbildung 1.11 erzeugt. Er funktioniert auch in der neuen PowerShell, aber leider nur in Windows. Code, der Out-GridView einsetzt, ist also nicht mehr auf Linux und macOS lauffähig.
»Schuld« daran ist das .NET Framework Core, eine Softwarebibliothek, aus der sich Anwendungsentwickler bedienen dürfen und auf der das neue PowerShell aufbaut. .NET Core unterstützt grafische Oberflächen (derzeit) nur auf dem Windows-Betriebssystem. Das hat Auswirkungen auf alle Befehle, die grafische Oberflächen generieren. Zum Glück sind solche Befehle, einmal abgesehen von Out-GridView, extrem selten.
Um nicht abwarten zu müssen, bis .NET Core vielleicht künftig einmal grafische Oberflächen auf allen Betriebssystemen unterstützt, hat das PowerShell-Team eine textbasierte Alternative zu Out-GridView geschaffen: Out-ConsoleGridView.
Abbildung 1.11: Ein grafisches Universalauswahlfenster funktioniert nur bei Windows.
Dieser Befehl ist derzeit noch kein Teil von PowerShell (und wie bei so vielen guten Ideen bleibt abzuwarten, ob er bis zu Ende entwickelt wird). Einstweilen kann man ihn (nur in PowerShell 7, nicht in Windows PowerShell) mit dem folgenden Befehl nachinstallieren:
PS> Install-Module -Name Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser
Nun kann das außerhalb von Windows fehlende Out-GridView durch die plattformübergreifende Variante Out-ConsoleGridView ersetzt werden.
Listing 1.7 zeigt ein Beispiel aus der Praxis, das alle laufenden Anwendungen in einem Auswahlfenster anbietet. Die ausgewählten Anwendungen werden geschlossen (jedenfalls dann, wenn Sie in Listing 1.7 den Parameter -WhatIf entfernen, der ansonsten das Stoppen der Prozesse nur simuliert).
Get-Process |
Where-Object MainWindowHandle |
Select-Object -Property Name, Id, Description |
Sort-Object -Property Name |
Out-GridView -Title 'Prozesse' -OutputMode Multiple |
Stop-Process -WhatIf
Listing 1.7 funktioniert in allen PowerShell-Varianten, aber aufgrund des grafischen Auswahlfensters nur in Windows. Um das Skript plattformübergreifend einzusetzen, ersetzen Sie lediglich den Befehl Out-GridView durch Out-ConsoleGridView (sofern Sie den Befehl wie oben nachgerüstet haben).
Out-ConsoleGridView ist eine hervorragende Umsetzung im Stile des bekannten Norton Commander, und die zur Auswahl gestellten Einträge lassen sich bequem per Maus anklicken (siehe Abbildung 1.12).
Abbildung 1.12: Ein textbasiertes plattformübergreifendes Dialogfeld verwenden
Falls Sie noch nie mit textbasierten Shells gearbeitet haben, lernen Sie jetzt die allerwichtigsten PowerShell-Grundlagen kennen. Dazu gehört auch, wie man bequem und möglichst ohne Tippfehler auch größere Eingaben bewältigt.
Anschließend schauen wir uns gleich noch die wichtigsten Sicherheitseinstellungen an, damit Sie PowerShell auch tatsächlich voll nutzen und alle Beispiele aus diesem Buch ausführen können.
Starten Sie die PowerShell nicht routinemäßig mit Administratorrechten. Die PowerShell ist ein Profiwerkzeug, genau wie die Kettensäge des Waldarbeiters. Sie können damit in Sekundenschnelle viel lästige Arbeit erledigen, aber ebenso schnell mit den falschen Befehlen enorme Schäden anrichten.
Solange die PowerShell nicht mit Administratorrechten gestartet wird, sind Sie vor gröbstem Unfug gefeit und können zumindest das Betriebssystem nicht beschädigen. Nutzen Sie Administratorrechte also ausschließlich dann, wenn Aufgaben dies wirklich erfordern und Sie genau wissen, was Sie tun.
Bei Windows lassen sich Administratorrechte nicht nachträglich zuschalten (so wie mit sudo bei Linux). Administratorrechte müssen beim Start einer Anwendung vergeben werden – oder eben nicht. Wenn Sie also bei Windows Administratorrechte benötigen, öffnen Sie eine neue PowerShell explizit als Administrator (siehe Abbildung 1.7).
Im Fenster sehen Sie die Eingabeaufforderung. Sie beginnt mit PS, und dahinter steht der Pfadname des Ordners, in dem Sie sich gerade befinden. Eine blinkende Einfügemarke wartet auf Ihre ersten Eingaben. Geben Sie zum Beispiel testweise ein:
PS> hallo
Sobald Sie drücken, wird Ihre Eingabe an PowerShell geschickt und verarbeitet. Das Ergebnis folgt postwendend, und erst jetzt stellt sich heraus, ob PowerShell mit dem, was Sie geschickt haben, etwas anfangen konnte. Falls nicht, erscheint eine spröde rote Fehlermeldung, die bei Windows PowerShell so aussehen könnte:
hallo : Die Benennung "hallo" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei
oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der
Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ hallo
+ ~~~~~
+ CategoryInfo : ObjectNotFound: (hallo:String) [],CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Bei PowerShell 7 werden Fehlermeldungen etwas abgekürzt, stattdessen erhalten Sie mitunter Korrekturvorschläge (mit derzeit allerdings kaum wahrnehmbarem Praxisnutzen):
hallo: The term 'hallo' is not recognized as a name of a cmdlet, function, script file, or
executable program. Check the spelling of the name, or if a path was included, verify that the path
is correct and try again.
Suggestion [4,General]: The most similar commands are: gal, nal, sal, kill, help, Table, algm,
echo, del, clc.
Rote Fehlermeldungen sorgen bei den meisten Anwendern für einen Adrenalinschub oder führen zu Flüchen, aber eines tun die wenigsten: die Fehlermeldung lesen. Genau das sollten Sie aber tun, denn häufig stecken darin hilfreiche Informationen. So auch hier:
Die Benennung »hallo«, also das, was Sie als Befehl an PowerShell geschickt haben, war kein ausführbarer Befehl. Ausführbare Befehle sind gemäß Fehlermeldung Cmdlets, Funktionen, Skriptdateien oder ausführbare Programme. Damit wissen Sie nun schon einmal ungefähr, was Sie alles bei PowerShell ausführen können.
»Tippen vermeiden heißt Tippfehler vermeiden« – und so sollten Sie sich unbedingt die beiden Tastenkombinationen für die Autovervollständigung merken:
Ein Druck auf genügt, um die aktuelle Eingabe zu vervollständigen. Drücken Sie die Taste mehrmals, um weitere Vorschläge zu erhalten. + blättert einen Vorschlag zurück, falls Sie zu schnell waren.
Drücken Sie + , zeigt die Konsole die noch infrage kommenden Eingaben als Liste an, die Sie mit den Pfeiltasten auswählen und mit der übernehmen. In Editoren öffnet sich ein IntelliSense-Menü.
Bei der Autovervollständigung über gilt die »Dreierregel«: Geben Sie mindestens drei Zeichen ein, bevor Sie drücken. Bei PowerShell-Befehlen geben Sie mindestens den ersten Namensteil, den Bindestrich und dann drei Zeichen ein. Andernfalls gibt es zu viele infrage kommende Möglichkeiten, und muss viel zu oft gedrückt werden, bis das richtige Ergebnis vorgeschlagen wird.
Die Autovervollständigung dient nicht nur der Bequemlichkeit. Sie vermeidet auch Tippfehler und macht sie deutlich. Liefert zum Beispiel gar kein Resultat, liegt der Verdacht nahe, dass Sie sich bei Ihrer vorhandenen Eingabe bereits vertippt haben. Überprüfen Sie in diesem Fall, was Sie bisher eingegeben haben, und korrigieren Sie die Eingabe falls nötig. Danach versuchen Sie es noch einmal mit .
Geben Sie zum Beispiel Folgendes ein und drücken Sie dann + :
PS> Get-Pr +
Es erscheint nun das Auswahlmenü der noch infrage kommenden Befehle, aus denen Sie sich per Pfeiltasten einen aussuchen können (siehe Abbildung 1.13).
Abbildung 1.13: Die Konsole kann Eingaben mithilfe des Auswahlmenüs vervollständigen.
Kommen zu viele Alternativen infrage, fragt PowerShell gegebenenfalls nach, ob Sie wirklich alle Vervollständigungsmöglichkeiten sehen wollen.
Zuständig für diesen Service sowie die Farbcodierung der Eingabe ist die PowerShell-Erweiterung PSReadLine, die Teil von Windows PowerShell und PowerShell ist.
Falls Ihre Konsole also auf + nicht reagiert, ist diese Erweiterung möglicherweise nicht installiert. Bei sehr alten Windows PowerShell-Versionen kann das der Fall sein.
Auch Pfadnamen kann PowerShell mit vervollständigen:
PS> C:\p
Wenn der Pfadname Sonderzeichen wie Leerzeichen oder Klammern enthält, stellt die Autovervollständigung ihn automatisch in Anführungszeichen und schreibt den sogenannten Call-Operator vor den Text (&). Mit diesem kann Text in Anführungszeichen so ausgeführt werden, als handele es sich dabei um einen Befehl.
Hier ein Beispiel: Im ersten Fall wird der Text »notepad« ausgegeben, im zweiten Fall der Befehl notepad ausgeführt:
PS> "notepad"
notepad
PS> & "notepad"
Auch die Befehlshistorie spart Tipparbeit. Oft sitzt der erste eingegebene Befehl nicht auf Anhieb richtig, und Sie erhalten eine Fehlermeldung, oder der Befehl macht (noch) nicht das, was Sie sich eigentlich vorgestellt haben. Wenn Sie an Ihrem Befehl ein wenig feilen und ihn verbessern wollen, brauchen Sie ihn nicht komplett neu einzugeben.
Drücken Sie stattdessen , um den zuletzt eingegebenen Befehl zurückzuholen. Danach können Sie diesen Befehl verändern oder verbessern, bevor Sie ihn mit erneut an Power-Shell senden. Drücken Sie mehrmals, wenn Sie vorvorherige oder noch ältere Eingaben erneut verwenden wollen. Mit wandern Sie in der Liste wieder nach unten.
PowerShell verzichtet so weit wie möglich darauf, Groß- und Kleinschreibung zu unterscheiden. Diese ist zum Beispiel bei Befehlen, Variablennamen, Sprachelementen und Parametern immer egal.
Anders sieht es nur bei Argumenten aus, also den Informationen, die Sie einem Befehl mitgeben. Bei manchen Argumenten ist klar, dass Groß- und Kleinschreibung einen Unterschied machen, zum Beispiel bei Kennwörtern. Bei anderen Argumenten kann es auch vom Betriebssystem abhängen: Bei Windows ist die Groß- und Kleinschreibung bei Pfadnamen egal, bei Linux aber wichtig.
Ist eine Eingabe nicht komplett, weil zum Beispiel ein geöffnetes Anführungszeichen noch nicht geschlossen oder eine geöffnete Klammer nicht mit der korrespondierenden schließenden Klammer versehen wurde, führt die Eingabe nicht aus, sondern bricht nur die Zeile um. Die Konsole zeigt dann am Anfang der neuen Zeile >> an und ist bereit für mehr. So lassen sich zum Beispiel mehrzeilige Texte und kleine Skripte erfassen:
"Hallo
>> Dies ist mein kleines Tagebuch. >>
Ich schreibe jetzt einen mehrseitigen Text.
>> Das geht so lange, bis ich die Lust verliere."
>>
Hallo
Dies ist mein kleines Tagebuch.
Ich schreibe jetzt einen mehrseitigen Text.
Das geht so lange, bis ich die Lust verliere.
Erst wenn Sie das Abschlusszeichen eingeben (und dann noch zweimal drücken), akzeptiert PowerShell die mehrzeilige Eingabe. War alles ein Versehen, brechen Sie mit + ab. Danach drücken Sie auf , um die letzte Eingabe zurückzubekommen.
PowerShell und seine Cmdlets sind gut dokumentiert, allerdings müssen die Hilfetexte für PowerShell (einmalig) mit Update-Help aus dem Internet nachgeladen werden.
Leider speichert Windows PowerShell seine Hilfedateien im Windows-Ordner, und der darf nur von Administratoren geändert werden. Deshalb kann die PowerShell-Hilfe nur aktualisiert werden, wenn Sie den folgenden Befehl mit vollen Administratorrechten ausführen (und über eine Internetverbindung verfügen):
PS> Update-Help -UICulture En-US -Force
Bei PowerShell dagegen unterstützt Update-Help neuerdings den Parameter -Scope, mit dem Sie festlegen, ob die Hilfe für alle Anwender (mit Administratorrechten) oder nur für den aktuellen Anwender (ohne Administratorrechte) installiert werden soll:
PS> Update-Help -UICulture en-us -Force -Scope CurrentUser
Windows PowerShell und PowerShell speichern die Hilfedateien an unterschiedlichen Orten, sodass Sie den Befehl Update-Help in beiden PowerShell-Konsolen ausführen müssen, wenn Sie Windows Power-Shell und PowerShell parallel verwenden.
Es ist übrigens völlig normal, wenn Update-Help am Schluss eine rote Fehlermeldung ausgibt. Üblicherweise beschwert sich die Meldung bloß darüber, dass für einige (wenige) PowerShell-Module keine Hilfe gefunden wurde. Das ist normal.
Auch wenn Sie noch nicht wissen, was Module eigentlich sind: Es gibt eine Menge davon. Wenn eine Handvoll Module keine Hilfe anbieten, ist das nicht schlimm.
PS> (Get-Module -ListAvailable).Count
97
Ab sofort erhalten Sie mit Get-Help ausführliche Hilfestellung zu PowerShell-Befehlen. Ohne Update-Help hätte die Hilfe keine Beispiele und Beschreibungen enthalten:
PS> Get-Help -Name Get-Service -ShowWindow
Abbildung 1.14: Hilfe zu PowerShell-Befehlen in einem Extrafenster anzeigen
Grafische Oberflächen (wie das Hilfefenster in Abbildung 1.14) stehen derzeit lediglich in Windows zur Verfügung. In anderen Betriebssystemen wie z. B. Linux funktionieren solche Befehle nur eingeschränkt oder gar nicht.
Rufen Sie hier beispielsweise den Befehl Get-Help mit dem Parameter -Full anstelle von -ShowWindow auf. Die Hilfe erscheint dann direkt in der Konsole.
Interaktive Befehle dürfen Sie in PowerShell jederzeit ausführen. Skripte, also Dateien mit der Erweiterung .ps1, sind anfangs allerdings verboten.
Das ist natürlich Unsinn, weil sich so PowerShell kaum nutzen lässt, und Sie müssen diese Sperre unbedingt sofort aufheben. Selbst wenn Sie gar nicht planen, eigene Skripte zu schreiben, nutzen viele PowerShell-Befehlserweiterungen intern Skripte und funktionieren nicht, solange die Skriptausführung verboten ist.
Ob Skripte erlaubt sind, bestimmt die sogenannte ExecutionPolicy. Set-ExecutionPolicy kann die Einstellungen ändern. Der folgende Befehl erlaubt dem aktuellen Benutzer, künftig lokale Skripte auszuführen. Skripte, die aus dem Internet heruntergeladen wurden, bleiben allerdings gesperrt:
PS> Set-ExecutionPolicy –Scope CurrentUser –ExecutionPolicy RemoteSigned –Force
Die gewählte Einstellung RemoteSigned ist zugegebenermaßen alles andere als intuitiv, denn was haben »Remote« und »Signed« miteinander zu tun? Tabelle 1.1 erklärt die möglichen Einstellungen deshalb etwas genauer.
Einstellung
Bedeutung
RemoteSigned
Lokale Skripte sind erlaubt. Skripte, die aus dem Internet heruntergeladen wurden oder auf Computern lagern, die nicht zur Domäne gehören, sind verboten. Sie können nur durch eine gültige digitale Signatur am Ende des Skriptcodes individuell erlaubt werden. Dies ist die empfohlene Einstellung für normale Anwender.
Bypass
Alle Skripte sind erlaubt. Dies ist die empfohlene Einstellung für Administratoren und versierte Anwender, weil sie auch die unbeaufsichtigte Ausführung erlaubt und diese Anwendergruppe selbst entscheiden kann, ob ein Skript legitim ist oder nicht.
Unrestricted
Alle Skripte sind erlaubt, aber wenn die Skripte nicht lokal gespeichert sind oder aus dem Internet heruntergeladen wurden, erfolgt vor der Ausführung eine Sicherheitsabfrage.
Undefined
Es wird keine Festlegung vorgenommen. Die nächstniedrigere Einstellung wird zurate gezogen. Wenn alle Einstellungen auf Undefined stehen, wird die Einstellungen auf Undefined stehen, wird die Einstellung Restricted aktiviert, und die Ausführung von Skripten ist verboten. Dies ist die Grundeinstellung.
Restricted
Die Skriptausführung ist verboten.
AllSigned
Alle Skripte müssen digital signiert sein. In der Praxis wirkt diese Einstellung ähnlich wie Restricted, weil Skripte typischerweise nie signiert sind.
Tabelle 1.1: Skriptausführungsrichtlinien
Ob die gerade geänderte neue Einstellung auch tatsächlich wirksam geworden ist, verrät GetExecutionPolicy.
PS> Get-ExecutionPolicy
RemoteSigned
Falls hier nicht die gleiche Einstellung genannt wird, die Sie gerade gesetzt haben, schauen Sie genauer nach, wer dazwischenfunkt: Es gibt nämlich mehrere Stellen, an denen diese Einstellung gesetzt werden kann:
PS> Get-ExecutionPolicy –List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine Undefined
PowerShell bestimmt die effektive Einstellung, indem es die fünf Richtlinien von oben nach unten prüft. Die erste Einstellung, die nicht Undefined lautet, wird wirksam. Sind alle Einstellungen auf Undefined gesetzt, wird die Skriptausführung verboten. Das ist der Ausgangszustand der PowerShell.
Besonderes Augenmerk verdienen die ersten beiden Richtlinien: MachinePolicy und UserPolicy werden zentral über Gruppenrichtlinien festgelegt. Sie können diese Einstellungen nicht manuell ändern. Da es die obersten beiden Einstellungen sind, haben sie Vorrang vor allen übrigen. Wenn an diesen obersten beiden Stellen also Vorgaben zu sehen sind, können Sie zwar darunter eigene Einstellungen treffen, doch werden diese niemals wirksam.
Es ist ein Fehler – häufig auf einem Missverständnis beruhend –, wenn in MachinePolicy und/oder UserPolicy etwas anderes eingestellt ist als Undefined. In diesem Fall zwingt man die Einstellung nämlich allen Anwendern unwiderruflich auf. Stattdessen sollte man sie höchstens vorschlagen: Eine Gruppenrichtlinie sollte allenfalls einen Standardwert wie RemoteSigned für die Einstellung LocalMachine hinterlegen. Diese Einstellung würde dann für alle Anwender gelten, solange sie selbst keine andere Einstellung wählen.
Wer die ExecutionPolicy zwingend vorschreiben will, unterliegt dem Irrglauben, es wäre ein Schutzschild gegen Angreifer. Das stimmt aber nicht. Es ist lediglich eine benutzerspezifische Präferenz, die unerfahrene Anwender schützen soll, unkritisch Skripte aus zweifelhaften Quellen zu starten. Angreifer können diese Einstellung auf mannigfaltige Weise umgehen.
In Unternehmen sollen Macht und Missbrauchspotenzial der PowerShell mitunter eingeschränkt werden. Ob Sie solchen Einschränkungen augenblicklich unterliegen, findet der folgende Befehl für Sie heraus:
PS> $ExecutionContext.SessionState.LanguageMode
FullLanguage
Wenn der LanguageMode auf FullLanguage eingestellt ist, stehen Ihnen alle PowerShell-Funktionalitäten zur Verfügung. Wird hier hingegen ConstrainedMode angezeigt, wird Ihr System von Sicherheitssoftware wie Windows Defender Application Control, Software Restriction Policy, AppLocker oder einfachen Gruppenrichtlinien eingeschränkt.
Der Hauptzweck des ConstrainedMode ist, die PowerShell auf offizielle Befehle zu beschränken und zu verhindern, dass PowerShell allzu kreativ direkt auf Systembibliotheken des .NET Framework zugreift.
Wenn Sie mögen, können Sie eine PowerShell-Instanz testweise manuell in den eingeschränkten ConstrainedMode schalten, der dann allerdings für die gesamte weitere Laufzeit dieser Power-Shell-Sitzung gilt (also bis Sie sie schließen).
Sobald der Modus aktiv ist, dürfen nur noch Befehle ausgeführt werden, aber keine direkten Zugriffe auf das .NET Framework:
Welche umfangreichen Einschränkungen im ConstrainedMode