image

PowerShell 5.0 – Windows-Automation für Einsteiger und Profis

Dr. Tobias Weltner

image

Dr. Tobias Weltner

Lektorat: Ariane Hesse

Korrektorat: Sibylle Feldmann

Satz: mediaService, www.mediaservice.tv

Herstellung: Susanne Bröckelmann

Umschlaggestaltung: Michael Oreal, www.oreal.de, unter Verwendung eines Fotos von
                                   Valerie Loiseleux / iStock. by Getty Images

Druck und Bindung: Druckerei C.H. Beck, www.becksche.de

Bibliografische Information der Deutschen Nationalbibliothek

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der

Deutschen Nationalbibliografie; detaillierte bibliografische Daten
sind im Internet über http://dnb.d-nb.de abrufbar.

ISBN:

Print    978-3-96009-009-0

PDF    978-3-96010-033-1

ePub    978-3-96010-034-8

mobi    978-3-96010-035-5

1. Auflage 2016

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.

Copyright © 2016 dpunkt.verlag GmbH

Wieblinger Weg 17

69123 Heidelberg

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.

Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.

5 4 3 2 1 0

Inhalt

Einführung

Wer braucht eigentlich PowerShell?

Handwerkszeug für Windows-Admins

Moderne Lernkurve

Computer – ich/ich – Computer: PowerShell als Fremdsprache

PowerShell als Ersatz für VBScript und Batch

Grenzenloses PowerShell – über Computergrenzen hinweg

Strategische Plattform und Orchestrierung

Anwendungsentwicklung

Persönliche Entwicklung

Wie Sie dieses Buch nutzen

Noch mehr Unterstützung

1     PowerShell kennenlernen

Die PowerShell-Konsole einrichten

PowerShell-Konsole starten

PowerShell-Version kontrollieren

Symbol an Taskleiste heften

Bessere Schrift für die Konsole

Neue Konsolenfunktionen bei Windows 10 aktivieren

Sprungliste: Administratorrechte und ISE

32-Bit- und 64-Bit-Versionen

PowerShell ISE einsetzen

Erste Schritte mit PowerShell

Wichtige Vorsichtsmaßnahmen

Befehle eingeben

Ergebnisse empfangen

Farbcodierungen verstehen

Rechnen mit PowerShell

Umwandlungen

Zahlenreihen

Unvollständige und mehrzeilige Eingaben

Skriptausführung erlauben

Tippfehler vermeiden und Eingaben erleichtern

Autovervollständigung

Pfadnamen vervollständigen

Befehlszeilen erneut verwenden

Befehlsnamen autovervollständigen

Parameter-Autovervollständigung

Argument-Autovervollständigung

PowerShell-Hilfe aus dem Internet nachladen

Hilfe ohne Internetzugang installieren

Hilfe bei PowerShell 3

Klassische Konsole oder moderner ISE-Editor?

Einschränkungen des ISE-Editors

Einschränkungen der klassischen Konsole

PowerShell-2.0-Testumgebung

Testen Sie Ihr Wissen!

Teil A   Interaktive Befehlskonsole

2     Cmdlets – die PowerShell-Befehle

Alles, was Sie über Cmdlets wissen müssen

Cmdlets für eine Aufgabe finden

Suche nach Tätigkeit oder Tätigkeitsbereich

Mit ISE nach Cmdlets suchen

Mit der Hilfe nach Cmdlets suchen

Mit Parametern Wünsche formulieren

Parameter wecken das volle Potenzial der Cmdlets

Drei universelle Parametertypen

Common Parameter – allgemeine Parameter für alle Cmdlets

Fehlermeldungen unterdrücken

Unvollständige Parameternamen

Parameter-Binding sichtbar machen

Neue Cmdlets aus Modulen nachladen

Neue Module automatisch nachladen

Auslaufmodell: Snap-Ins

Alias: Zweitname für Cmdlets

Aliase sind keine neuen Befehle

Befehlstypen ermitteln

Klassische cmd.exe-Interpreterbefehle sind Cmdlets

Eigene Aliase anlegen

Testaufgaben

3     PowerShell-Laufwerke

Dateisystemaufgaben meistern

Ordner anlegen

Dateien anlegen und Informationen speichern

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

Werte hinzufügen, ändern und löschen

Virtuelle Laufwerke und Provider

Neue PowerShell-Laufwerke

Mit Pfadnamen arbeiten

Unterstützte Platzhalterzeichen in Pfadnamen

-Path oder -LiteralPath?

Existenz eines Pfads prüfen

Pfadnamen auflösen

Testaufgaben

4     Anwendungen und Konsolenbefehle

Programme starten

Optionen für den Programmstart festlegen

Nicht unterstützte Konsolenbefehle im ISE-Editor

Argumente an Anwendungen übergeben

Hilfe für Konsolenbefehle anzeigen

Beispiel: Lizenzstatus von Windows überprüfen

Argumentübergabe kann scheitern

Texteingaben an Konsolenbefehle senden

Ergebnisse von Anwendungen weiterverarbeiten

Error Level auswerten

Fragen an Benutzer stellen mit choice.exe

Rückgabetext auswerten

Rückgabetexte in Objekte verwandeln

Rückgabetext analysieren

Laufende Programme steuern

Feststellen, ob ein Prozess läuft

Auf einen Prozess warten

Einstellungen laufender Prozesse ändern

Prozesse vorzeitig abbrechen

Testaufgaben

5     Skripte einsetzen

PowerShell-Skripte verfassen

Skriptcode eingeben

Eingabehilfen spüren Tippfehler auf

Skript ausführen

Sicherheitseinstellungen und Ausführungsrichtlinien

Profilskripte – die Autostartskripte

Vier verschiedene Profilskripte – pro Host

Profilskript anlegen und öffnen

Typische Profilskriptaufgaben durchführen

Skripte außerhalb von PowerShell starten

PowerShell-Startoptionen

Befehlsfolgen extern ausführen

PowerShell-Code als geplante Aufgabe ausführen

Nicht-PowerShell-Skripte öffnen

Stapeldateien (Batchdateien)

VBScript-Dateien ausführen

Skripte digital signieren

Digitales Zertifikat beschaffen

Zertifikat aus PFX-Datei laden

Zertifikat aus Zertifikatspeicher laden

Skript digital signieren

Digitale Signaturen überprüfen

Signaturen mit einem Zeitstempel versehen

6     Die PowerShell-Pipeline

Aufbau der PowerShell-Pipeline

Prinzipieller Aufbau der Pipeline

Die sechs wichtigsten Pipeline-Befehle

Select-Object

Selbst festlegen, welche Informationen wichtig sind

Platzhalterzeichen verwenden

Weitere Informationen anfügen

-First, -Last und -Skip

Unsichtbare Eigenschaften sichtbar machen

Sonderfall -ExpandProperty

Wie ETS Objekte in Text verwandelt

Where-Object

Where-Object: stets nur zweite Wahl

Clientseitiger Universalfilter

Leere Elemente aussortieren

Fortgeschrittene Syntax bietet noch mehr Möglichkeiten

Dateiinhalte filtern

IP-Adressen bestimmen

Alternativen zu Where-Object

Sort-Object

Cmdlet-Ergebnisse sortieren

Nach mehreren Spalten sortieren

Sortierung mit anderen Cmdlets kombinieren

ForEach-Object

Grundprinzip: eine Schleife

Group-Object

Häufigkeiten feststellen

Gruppen bilden

Measure-Object

Statistische Berechnungen

Ordnergrößen berechnen

Mit »berechneten« Eigenschaften arbeiten

Datentyp der Sortierung ändern

Gruppierung nach bestimmten Textteilen

Umwandlung von Byte in Megabyte

Hashtables: mehrere Werte übergeben

Mehrere Spalten in umgekehrter Sortierung

Mehrspaltige Anzeigen

Berechnete Spalten hinzufügen

Spaltenbreite, Bündigkeit und Gruppenüberschriften

Frei wählbare Gruppierungskriterien

Pipeline und Performance: Optimierungen

Flaschenhals Pipeline

Klassische Schleifen sind wesentlich schneller

Die Pipeline ist wesentlich reaktionsfreudiger

Weniger Speicherbedarf oder mehr Geschwindigkeit?

Testaufgaben

7     Ergebnisse ausgeben und formatieren

Ergebnisse als Text darstellen

Ergebnisse in Textdateien schreiben

Textformatierung ändern

Automatische Textformatierung verstehen

Mehrspaltige Anzeige

Out-Printer: Ergebnisse zu Papier bringen

Out-WinWord: Ergebnisse direkt an Microsoft Word senden

Out-PDF: mit Microsoft Word PDF-Reports erstellen

Ergebnisse als Objekte exportieren

Export-CSV: Export an Microsoft Excel und andere Programme

Ergebnisse serialisieren mit XML und JSON

HTML-Reports erstellen

Objekteigenschaften in HTML-Spalten umwandeln

HTML im Webbrowser anzeigen

HTML-Reports ansprechend und farbig gestalten

Testaufgaben

Teil B   Objektorientierte Shell

8     Mit Objekten arbeiten

Eigenschaften und Methoden

Eigenschaften

Methoden

Eigenschaften und Methoden anzeigen

Hilfe für Objekteigenschaften und -methoden finden

Ergebnisse eines Befehls untersuchen

Unterschiedliche Objekttypen

Nach Objekttypen filtern

Änderbare Eigenschaften finden

Primitive Datentypen sind auch Objekte

Eigenschaften lesen

Eigenschaften von vielen Objekten gleichzeitig abrufen

Eigenschaften ändern

Änderungen wirksam werden lassen

Methoden aufrufen

Eine Methode mit mehreren Signaturen

Testaufgaben

9     Operatoren und Bedingungen

Operatoren – Aufbau und Namensgebung

Wie Operatornamen aufgebaut sind

Unäre Operatoren

Zuweisungsoperatoren

Vergleichsoperatoren

Unterscheidung zwischen Groß- und Kleinschreibung

Unterschiedliche Datentypen vergleichen

Vergleiche umkehren

Vergleiche kombinieren

Vergleiche auf Arrays anwenden

Bedingungen

if-Bedingung

Switch-Bedingung

Where-Object

10   Textoperationen und reguläre Ausdrücke

Texte zusammenfügen

Variableninhalte mit doppelten Anführungszeichen integrieren

Der Formatierungsoperator »-f«

Textstellen finden und extrahieren

Texte splitten

Informationen in Texten finden

Reguläre Ausdrücke: Textmustererkennung

Erste Schritte: Mit Textmustern arbeiten

Bestandteile eines regulären Ausdrucks

Längste oder kürzeste Fassung?

Textstellen ersetzen

Ersetzungen ohne Zeichenverlust

Bezug auf den Originaltext nehmen

Delegatfunktionen

Rückverweise im Muster

Split und Join: eine mächtige Strategie

Nach verschiedenen Zeichen splitten

Splitten ohne Trennzeichen(verlust): LookBehind und LookAround

Mehrere Treffer in einem Text finden

[Regex]::Matches einsetzen

Ein- und Mehrzeilenmodus

Testaufgaben

11   Typen verwenden

Typumwandlungen

Automatische Typzuweisung durch PowerShell

Explizite Umwandlung in einen anderen Typ

Testumwandlungen zum Validieren

Verkettete Umwandlungen

Umwandlungen bei Cmdlets

Neue Objekte durch Typumwandlungen

Implizite Umwandlung und typisierte Variablen

Typisierte Variablen

Typisierte Parameter

Typisierte Eigenschaften und Argumente

Vergleichsoperationen

Verborgene Befehle in Typen

Statische Methoden verwenden

Eindeutige GUIDs generieren

Dateiextension ermitteln

Mathematische Funktionen

Zahlenformate konvertieren

DNS-Auflösung

Umgebungsvariablen

Pfade zu Systemordnern finden

Konsoleneinstellungen

Spezielle Datumsformate lesen

Statische Eigenschaften verwenden

Neue Objekte herstellen

Konstruktoren verstehen

Ein Credential-Object zur automatischen Anmeldung

Umgang mit XML-Daten

WMI-Remotezugriffe mit Anmeldung

COM-Objekte verwenden

Dialogfeld öffnen

Sprachausgabe

Office-Automation

Zugriff auf Datenbanken

Automatische Updates

Verknüpfungen anlegen und ändern

Netzwerkmanagement

Welche COM-Objekte gibt es sonst noch?

Webdienste ansprechen

SOAP-basierte Webdienste

RESTful-Webdienste

Neue .NET-Typen finden

Type Accelerators untersuchen

.NET-Assemblies durchsuchen

Typen nach Stichwort suchen

Typen mit bestimmten Befehlen finden

Typen nachladen

Assembly-Namen feststellen

Aktuell geladene Assemblies auflisten

Zusätzliche Assembly nachladen

Assembly aus Datei nachladen

Testaufgaben

Teil C   Automationssprache

12   Einfache Funktionen

Alles Wichtige: ein Überblick

Eigene Funktionen herstellen

Parameter definieren

Parameter implementieren

Funktionen per Modul überall verfügbar machen

Hilfe – Bedienungsanleitung hinzufügen

Eine bessere Prompt-Funktion

Zwingend erforderliche Parameter

Eine Funktion mit zwingend erforderlichen Parametern

Automatische Nachfrage

Argumente ohne Parameter

Rückgabewerte festlegen

Mehrere Rückgabewerte werden zum Array

Return-Anweisung

Write-Output

Unerwünschte Rückgabewerte unterdrücken

13   Skriptblöcke

Skriptblöcke: Transportcontainer für Code

Einsatzbereiche für Skriptblöcke

Skripte sind dateibasierte Skriptblöcke

Code in separater PowerShell ausführen

Code remote ausführen

Rückgabewerte

Pipeline-Fähigkeit

Schleifen und Bedingungen

Gültigkeitsbereiche

Zeitkapsel: Closures

Delegates

Zugriff auf AST und Parser

Codesicherheit

14   Pipeline-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

Modularer Code mit Pipeline-fähigen Funktionen

Ausgangspunkt: ein unleserliches Skript

Teil 1: Get-NewFilenameIfPresent

Teil 2: ConvertTo-AbsoluteURL

Teil 3: Get-ImageFromWebsite

Teil 4: Download-File

15   Objektorientierte Rückgabewerte

Mehrere Informationen zurückgeben

Objekte speichern mehrere Informationen strukturiert

Eigene Objekte mit Ordered Hashtables anlegen

Primär sichtbare Eigenschaften festlegen

16   Fortgeschrittene Parameter

Argumentvervollständigung

Statische Autovervollständigung für Parameter

Autovervollständigung über Enumerationsdatentyp

Autovervollständigung über ValidateSet

Vordefinierte Enumerationsdatentypen finden

Eigene Enumerationsdatentypen erstellen

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

Praxisbeispiel: Automatische Auslagerungsdateien aktivieren

Gefährlichkeit einer Funktion festlegen

Dynamische Parameter

Dynamische Parameter selbst definieren

Auf die Argumente dynamischer Parameter zugreifen

»Clevere« dynamische Parameter

Performance und Caching

Parameter mit dynamischen Vorschlagslisten

Dynamische Währungslisten anzeigen

Objektgenerator mit dynamischen Parametern

Dynamische Parameter mit dynamischen ValidateSets

Splatting: mehrere Parameter gleichzeitig ansprechen

Splatting im Alltag einsetzen

Übergebene Parameter als Hashtable empfangen

Mit Splatting Parameter weiterreichen

17   Eigene Module erstellen

Module sind Ordner

Funktion erstellen und testen

Funktion in Modul aufnehmen

Modul manuell importieren

Module automatisch importieren

Manifestdatei für ein Modul

Neue Manifestdatei anlegen

Wirkung einer Manifestdatei

ETS-Anweisungen zu Modul hinzufügen

Eindeutige Typnamen zuweisen

Neue Formatierungsangaben in ETS einfügen

Formatdefinition in Modul integrieren

ETS-Formatierung testen

Aufbau von FormatData-Definitionen

Module entfernen

18   PowerShellGet – Module verteilen und nachladen

PowerShell Gallery nutzen

NuGet-Provider installieren

Repository

Module finden und installieren

Modul herunterladen

Modul testweise ausführen

Modul dauerhaft installieren

Module aktualisieren

Side-by-Side-Versionierung

Eigene Module veröffentlichen

Privates Repository einrichten

Freigaben zum Lesen und Schreiben

Repository anlegen

Modul in Repository übertragen

Modul aus Repository installieren

19   Gültigkeitsbereiche

Gültigkeitsbereiche verstehen

Unterschied zwischen Lesen und Schreiben

Aufpassen bei Objekten und Referenzen

Parameter liefern Referenzen

Gemeinsam genutzte Variablen

Skriptglobale »Shared« Variable

Globale Variable

Direkter Zugriff auf Gültigkeitsbereiche

Dot-Sourcing: Skripte im Aufruferkontext

»Dot-Sourcing« verstehen

Aufruftyp eines Skripts testen

Gültigkeitsbereiche in Modulen

Modulcode greift auf Aufruferkontext zu

Aufruferkontext greift auf Modulkontext zu

20   Debugging – Fehler finden

Syntaxfehler erkennen und beheben

Folgefehler und der Blick auf das Wesentliche

Formale Regeln missachten

Laufzeit- und Logikfehler aufspüren

Falsche Verwendung von Operatoren

Tippfehler ändern den Code

Nicht initialisierte Variablen

Versehentliche Verwendung von Arrays

Fehlendes Verständnis für Objektreferenzen

Falsche Verwendung von Klammern

Falsche Zuordnung von Skriptblöcken

Schrittweise Ausführung mit dem Debugger

Haltepunkte setzen und Code schrittweise ausführen

Codeausführung fortsetzen

Ad-hoc-Debugging

Dynamische Haltepunkte setzen

Anhalten, wenn Variablen sich ändern

Anhalten, wenn Cmdlets oder Funktionen aufgerufen werden

Anhalten, wenn Variablen bestimmte Werte enthalten

Debugging-Meldungen ausgeben

Ein Skript mit Write-Debug testen

Write-Debug in echte Haltepunkte umwandeln

Tracing einsetzen

Fremde Prozesse debuggen

Testszenario: PowerShell-Code in fremdem Prozess

Testskript in fremdem Host starten

Verbindung mit fremdem Host aufnehmen

Runspace auswählen und debuggen

Debug-Sitzung beenden

Remote-Debugging

Mit Remotecomputer verbinden

Remoteskript laden und debuggen

21   Fehlerhandling

Fehlermeldungen unterdrücken

Bestimmen, wie Cmdlets auf Fehler reagieren

Fehler nachträglich analysieren

Fehler mitprotokollieren lassen

Erfolg eines Befehlsaufrufs prüfen

Fehlerhandler einsetzen

Lokaler Fehlerhandler: try...catch

Globaler Fehlerhandler: Trap

Spezifische Fehlerhandler

Exception-Namen ermitteln

Spezifische Fehlerhandler nutzen

Spezifische Fehlerhandler in Traps

Spezifizität des Fehlerhandlers justieren

Eigene Fehler auslösen

Mit Throw einen Fehler auslösen

Spezifische Fehler auslösen

Upstream-Kommunikation in der Pipeline

Pipeline vorzeitig abbrechen

Pipeline mit Select-Object abbrechen

Pipeline manuell abbrechen

Testaufgaben

Teil D   Remoting und Parallelverarbeitung

22   Fernzugriff und Netzwerk-Troubleshooting

Klassische Fernzugriffe

Dateisystem

Konsolenbefehle

Remotefähige Cmdlets

Troubleshooting für Fernzugriffe

Firewall für DCOM einrichten

Namensauflösung überprüfen

Remote-Registrierungszugriff erlauben

Access Denied: mit passenden Rechten anmelden

LocalAccountTokenFilterPolicy

Ports überprüfen

23   Windows PowerShell-Remoting

PowerShell-Remoting aktivieren