Windows Server-Administration mit PowerShell 5.1 | 4 |
Eine kompakte und praxisorientierte Einführung | 4 |
Impressum | 5 |
Vorwort | 6 |
Open Source und PowerShell „on every System“ | 7 |
Was lesen Sie in diesem Buch? | 7 |
Die Beispiele zu diesem Kapitel | 8 |
Kontakt zum Autor | 8 |
Danksagungen | 8 |
Inhaltsverzeichnis | 9 |
1: PowerShell für Kurzentschlossene | 18 |
1.1 Das WMF im Überblick | 18 |
1.2 Die .NET-Laufzeit | 20 |
1.2.1 Assemblys | 20 |
1.3 Die Objekt-Pipeline | 22 |
1.4 PSProvider und PSDrives | 23 |
1.4.1 Dynamische Parameter | 24 |
1.5 Functions, Aliase, Workflows und Configurations | 25 |
1.6 Erweiterbarkeit | 25 |
1.6.1 Ein Modulmanager in Gestalt des PowerShellGet-Moduls | 27 |
1.7 Befehlssyntax | 28 |
1.8 Die moderne Konsole | 29 |
1.9 Hilfe | 30 |
1.10 Andere Plattformen | 31 |
2: Der Umgang mit Typen | 32 |
2.1 Alles ist ein Objekt | 32 |
2.1.1 Objekte basieren auf Typen | 32 |
2.1.2 Den Typ eines Objekts herausfinden | 33 |
2.2 Typen als Objekte | 33 |
2.3 Die Typen eines Arrays erhalten | 34 |
2.3.1 Auflisten der Konstruktoren einer Klasse | 34 |
2.4 Neue Objekte anlegen mit dem New-Object-Cmdlet | 36 |
2.4.1 Neue Objekte anlegen über die statische Methode New | 36 |
2.4.2 Objekte mit Argumenten anlegen | 36 |
2.4.3 Neue Objekte anlegen per [PSCustomObject] | 37 |
2.5 Objektschreibweise | 37 |
2.6 Das versteckte Member PSObject | 38 |
2.7 Typen erweitern | 38 |
2.8 Objekte erweitern über das Add-Member-Cmdlet | 40 |
2.9 Typen definieren über externen Code | 41 |
2.9.1 Zusammenfassung | 43 |
3: Klassen definieren mit dem class-Befehl | 44 |
3.1 Einleitung | 44 |
3.1.1 Befehlswörter für die Definition von Klassen | 45 |
3.2 Klassen definieren | 45 |
3.3 Hinzufügen von Eigenschaften | 46 |
3.4 Aus Klassen Objekte machen | 48 |
3.5 Statische Member | 48 |
3.6 Enumerationen | 49 |
3.7 Aus Klassen werden Objekte | 50 |
3.8 Klassen mit einem Konstruktor | 51 |
3.8.1 Konstruktor mit Parameter | 52 |
3.8.2 Versteckte Members | 52 |
3.8.3 Überladene Konstruktoren | 54 |
3.8.4 Klassen mit einem statischen Konstruktor | 55 |
3.9 Methoden definieren | 55 |
3.9.1 Methoden überladen | 57 |
3.9.2 Statische Methoden | 58 |
3.10 Klassen ableiten (Vererbung) | 59 |
3.10.1 Ableiten mit einem Konstruktor, der nicht parameterlos ist | 61 |
3.10.2 Ableiten von Klassen der .NET-Klassenbibliothek und der PowerShell-Bibliotheken | 62 |
3.10.3 Members überschreiben | 62 |
3.11 Typenformatierung mit eigenen Klassen | 66 |
3.12 Zusammenfassung | 68 |
4: Functions für Fortgeschrittene | 69 |
4.1 Was macht eine Function „Advanced“? | 69 |
4.1.1 Die Rolle der Attribute | 69 |
4.1.2 Das Prinzip der Parameter-Zuordnung | 70 |
4.2 Das CmdletBinding-Attribut | 71 |
4.3 Das Parameter-Attribut | 72 |
4.4 Die Parameterbindung im Detail | 73 |
4.4.1 Wenn die Parameterbindung nicht funktioniert | 74 |
4.4.2 Die Parameterbindung sichtbar machen | 75 |
4.5 Functions mit Pipeline-Parametern | 75 |
4.6 Functions, die die Pipeline abarbeiten | 77 |
4.7 Functions mit einer eingebauten Bestätigungsanforderung | 78 |
4.7.1 Die Auswirkung des Confirm-Parameters | 79 |
4.7.2 Die Auswirkung des WhatIf-Parameters | 79 |
4.7.3 Implementieren von Confirm und WhatIf an einem Beispiel | 79 |
4.7.4 Eine Bestätigungsanforderung unabhängig von Confirm & Co | 82 |
4.8 Parameter-Validierung | 83 |
4.8.1 Einen Bereich validieren mit ValidateRange | 83 |
4.8.2 Eine Auswahlmenge validieren mit ValidateSet | 83 |
4.8.3 Ein beliebiges Kriterium validieren per ValidateScript | 83 |
4.8.4 Credential-Parameter implementieren | 84 |
4.8.5 Eigene Parameterattribute definieren | 84 |
4.9 Dynamische Parameter | 85 |
4.10 Zusammenfassung | 87 |
5: Aus Functions und Skripte werden Module | 88 |
5.1 Module und Modultypen | 88 |
5.1.1 Skriptmodule | 89 |
5.1.2 Manifestmodule | 89 |
5.1.3 Binärmodule | 89 |
5.1.4 Dynamische Module | 90 |
5.1.5 Weitere Modulverzeichnisse hinzufügen | 91 |
5.2 Manifestmodule im Detail | 91 |
5.3 Verschachtelte Module | 93 |
5.4 Mehrere Versionen eines Moduls verwenden | 93 |
5.5 Internationale Module – Zeichenketten in Psd1-Dateien auslagern | 94 |
5.5.1 Die Rolle der Kultur und das CultureInfo-Objekt | 96 |
5.5.2 Ändern der aktuellen Kultur | 97 |
5.6 Praxisteil: Erstellen eines Manifestmoduls | 98 |
5.7 Zusammenfassung | 100 |
6: PowerShell-Skripte testen mit Pester | 101 |
6.1 Was testet Pester? | 101 |
6.1.1 Testen und DevOps | 102 |
6.2 Das Pester-Modul im Überblick | 102 |
6.3 Die ersten Schritte mit Pester | 103 |
6.4 Einen Test-Rahmen mit New-Fixture anlegen | 106 |
6.5 Test-Ergebnisse vergleichen mit Should – die Rolle der Assertions | 107 |
6.6 PowerShell-Commands nachbilden über Mocks | 109 |
6.6.1 Feststellen, ob ein Mock-Command ausgeführt wurde | 111 |
6.7 Tests in einen Ablauf einbeziehen | 111 |
6.8 Testen als (Lebens-)Philosophie | 111 |
6.9 Zusammenfassung | 112 |
7: Skripte und Module bereitstellen | 113 |
7.1 Die PowerShell-Paketverwaltung im Überblick | 113 |
7.1.1 Ein Blick hinter die Kulissen | 114 |
7.1.2 Überblick über das PackageManagement-Modul | 117 |
7.1.3 Die ersten Schritte mit der Paketverwaltung | 117 |
7.1.4 Anwendungspakete über Chocolatey installieren | 117 |
7.1.5 Package-Provider offline installieren | 121 |
7.1.6 Das PowerShellGet-Modul für die Modul- und Skriptverwaltung | 121 |
7.1.7 Die ersten Schritte mit PowerShellGet | 121 |
7.2 Eigene Ablagen für Module und Skripte einrichten | 123 |
7.2.1 Skripte über GitHub als „Gists“ abrufen | 126 |
7.2.2 Repository statt Webverzeichnis | 126 |
7.2.3 Einrichten eines Modul-Repositorys mit MyGet | 127 |
7.2.4 Skripte und Module in der PowerShell Gallery veröffentlichen | 129 |
7.3 Arbeiten mit einer Versionsverwaltung | 131 |
7.3.1 Schritt für Schritt | 132 |
7.3.2 Git-Integration in Visual Studio Code | 140 |
7.4 Aufsetzen einer Release-Pipeline für Module | 143 |
7.4.1 Was genau ist eine Release-Pipeline? | 143 |
7.4.2 Wo gibt es die Release-Pipeline? | 144 |
7.4.3 Eine Release-Pipeline selber gebaut | 145 |
7.4.4 Eine Release-Pipeline mit AppVeyor | 148 |
7.4.5 Die ersten Schritte mit AppVeyor | 149 |
7.4.6 Die Anatomie der Yaml-Datei | 150 |
7.4.7 Ein PowerShell-Modul per AppVeyor bereitstellen | 151 |
7.5 Zusammenfassung | 153 |
8: DSC-Grundlagen | 154 |
8.1 Ein erstes Beispiel | 154 |
8.2 Ein wenig Theorie | 161 |
8.2.1 MOF | 161 |
8.2.2 DSC-Spracherweiterungen | 162 |
8.2.3 Die Rolle der Ressourcen | 162 |
8.2.4 Der Local Configuration Manager (LCM) | 163 |
8.2.5 Pull statt Push | 164 |
8.3 Verwenden von Konfigurationsdaten | 165 |
8.4 Warum DSC? | 167 |
8.5 Zusammenfassung | 167 |
9: DSC in der Praxis | 169 |
9.1 Auspacken von Zip-Dateien | 169 |
9.2 Umgebungsvariablen anlegen | 170 |
9.3 Dateien und Verzeichnisse anlegen | 172 |
9.4 Lokale Benutzer und Gruppen anlegen | 173 |
9.5 Registry-Schlüssel anlegen | 174 |
9.6 Windows-Feature installieren | 176 |
9.7 Prozesse starten | 176 |
9.8 Systemdienste einrichten | 177 |
9.9 DSC-Log-Meldungen schreiben | 178 |
9.10 Beliebige Befehle ausführen | 180 |
9.11 Einen Webserver einrichten | 181 |
9.12 Eine Hyper-VM einrichten | 185 |
9.13 Zusammenfassung | 186 |
10: DSC für (etwas) Fortgeschrittene | 187 |
10.1 Hinzufügen von DSC-Ressourcen | 187 |
10.2 Ressourcenabhängigkeiten festlegen | 188 |
10.3 Den LCM konfigurieren | 189 |
10.4 Umgang mit Konfigurationsdaten | 190 |
10.4.1 Konfigurationsdaten unterschiedliche Nodes zuordnen | 191 |
10.4.2 Einzelne Nodes auswählen | 192 |
10.4.3 Allgemeine Eigenschaften in den Konfigurationsdaten festlegen | 193 |
10.4.4 Konfigurationsdaten, die nur allgemeine Einstellungen enthalten | 194 |
10.4.5 Konfigurationsdaten mit strukturierten Werten | 195 |
10.5 Kennwörter in einer Konfiguration verwenden | 196 |
10.6 Einrichten eines Pull Servers | 201 |
10.6.1 Überblick über das Einrichten eines Pull Servers | 202 |
10.6.2 Einrichten eines webbasierten Pull Servers | 202 |
10.6.3 Umstellen des LCM auf den Pull-Modus | 207 |
10.6.4 Einen Pull Server testen | 208 |
10.6.5 Die Rolle der Reportserver | 209 |
10.7 DSC-Diagnose | 209 |
10.8 Eigene Ressourcen definieren | 211 |
10.8.1 Zusammengesetzte Ressourcen (Composite Resources) | 215 |
10.9 Die PowerShell DSC-Cmdlets im Überblick | 218 |
10.10 Zusammenfassung | 220 |
11: Aus Text Objekte machen | 221 |
11.1 Texte im CSV-Format konvertieren | 222 |
11.2 Überschriften nachträglich hinzufügen oder vorhandene Überschriften ändern | 223 |
11.3 Unregelmäßige Texte zerlegen | 223 |
11.3.1 Texte mit dem Split-Operator zerlegen | 223 |
11.3.2 Texte mit Hilfe regulärer Ausdrücke zerlegen | 225 |
11.4 Objekte anlegen | 227 |
11.4.1 Objekte mit dem New-Object-Cmdlet anlegen | 227 |
11.4.2 Objekte mit einer Hashtable anlegen | 228 |
11.4.3 Unregelmäßige Textdaten mit dem ConvertFrom-String-Cmdlet verarbeiten | 228 |
11.4.4 XML-Daten verarbeiten | 229 |
11.5 JSON-Daten verarbeiten | 232 |
11.6 Zusammenfassung | 233 |
12: Active Directory-Administration | 234 |
12.1 AD DS und Domänencontroller einrichten | 235 |
12.1.1 Aktualisieren der Hilfe | 236 |
12.1.2 Authentifizierung | 236 |
12.2 Suche nach Benutzerkonten per Get-AdUser | 237 |
12.3 Die PowerShell-Abfragesyntax | 237 |
12.3.1 Benutzerkonten auswählen über den Identity-Parameter | 237 |
12.3.2 Die Rolle des Properties-Parameter bei Get-ADUser | 238 |
12.3.3 Spezialfall zusammengesetzte Attribute | 239 |
12.3.4 Eingrenzen der Suche | 239 |
12.3.5 Suchen nach anderen AD-Objekten | 239 |
12.4 Benutzer anlegen per New-AdUser | 240 |
12.4.1 Benutzerkonten aktivieren | 241 |
12.4.2 Benutzerkonten über eine CSV-Datei anlegen | 241 |
12.5 Benutzerkonten ändern per Set-ADUser | 241 |
12.5.1 Umgang mit Mehrwert-Attributen | 242 |
12.6 Benutzerkonten löschen mit Remove-ADUser | 242 |
12.7 Nach Kontenattributen suchen | 243 |
12.8 Gruppenzugehörigkeiten verwalten | 243 |
12.8.1 Nicht alles passt zusammen | 244 |
12.9 Computerkonten abfragen per Get-AdComputer | 245 |
12.10 Abfrageergebnisse mit Out-GridView kombinieren | 245 |
12.11 Umgang mit Organisationseinheiten | 246 |
12.12 Das AD-Laufwerk | 246 |
12.13 Den AD-Papierkorb aktivieren | 247 |
12.14 Einen AD LSD oder Open LDAP-Server ansprechen | 248 |
12.15 Zusammenfassung | 249 |
13: Azure-Administration per PowerShell | 250 |
13.1 Ein erster Überblick | 250 |
13.2 Der ARM im Überblick | 251 |
13.2.1 Die Rolle der Resource Provider | 251 |
13.2.2 Die Rolle der Templates | 252 |
13.3 Zugriffssteuerung per BPAC | 259 |
13.4 Die Azure PowerShell im Überblick | 260 |
13.4.1 Abfragen der PowerShell-Version | 260 |
13.4.2 Ein erster Überblick | 261 |
13.4.3 Die ersten Schritte mit der Azure PowerShell | 261 |
13.4.4 Beispiele aus der Praxis | 263 |
13.4.5 Eine virtuelle Maschine über ein Template anlegen | 268 |
13.4.6 Azure und DSC | 269 |
13.5 Custom Script Extension als Alternative zu DSC | 273 |
13.6 Zusammenfassung | 276 |
14: Debugging für etwas Fortgeschrittene | 277 |
14.1 Unsichtbare Variablen beim Debuggen | 277 |
14.2 Der Debug-Modus im Überblick | 278 |
14.3 Über das Wesen eines Haltepunktes | 278 |
14.3.1 Allgemeine Haltepunkte setzen | 278 |
14.3.2 Haltepunkt entfernen und deaktivieren | 279 |
14.3.3 Haltepunkte für einen Befehl setzen | 279 |
14.3.4 Haltepunkte für eine Variable setzen | 279 |
14.3.5 Haltepunkte mit einer Bedingung verknüpfen | 280 |
14.3.6 Ein Skript ohne Haltepunkte debuggen | 280 |
14.4 Remote-Debugging von Skripten | 280 |
14.4.1 Haltepunkte über Invoke-Command setzen | 281 |
14.5 Einen Workflow debuggen | 281 |
14.6 Runspaces debuggen | 281 |
14.7 Zusammenfassung | 283 |
15: Sicherheit | 284 |
15.1 Die Rolle der Ausführungsrichtlinie | 284 |
15.2 Umgang mit Credentials | 285 |
15.2.1 Einen Secure String lesbar machen | 287 |
15.2.2 Einen Secure String anlegen | 288 |
15.2.3 Secure String-Dateien sicher speichern | 288 |
15.3 Umgang mit Zertifikaten | 289 |
15.4 Weiterer Umgang mit Zertifikaten | 290 |
15.4.1 Auflisten bestimmter Zertifikate | 290 |
15.5 Zertifikate anlegen | 290 |
15.5.1 Selbstsignierte Zertifikate erstellen | 291 |
15.6 Skripte signieren | 294 |
15.7 Zeichenketten verschlüsseln | 295 |
15.7.1 Texte verschlüsseln und entschlüsseln mit CipherNet | 295 |
15.7.2 Zeichenketten mit Zertifikaten verschlüsseln | 296 |
15.8 Umgang mit Zugriffsberechtigungen | 297 |
15.8.1 Entfernen von Zugriffsberechtigungen | 299 |
15.9 Die Befehlsausführung protokollieren | 300 |
15.9.1 Befehlsprotokollierung per Gruppenrichtlinien steuern | 300 |
15.9.2 Mehr Möglichkeiten bei Start-Transcript | 302 |
15.10 PowerShell-Remoting-Endpunkte sichern mit Just Enough Administration (JEA) | 303 |
15.10.1 JEA in der Praxis | 304 |
15.11 Eine Session ohne Remoting einschränken | 307 |
15.12 Das Invoke-Expression-Cmdlet und warum es potentiell gefährlich ist | 308 |
15.12.1 Invoke-Expression per Scriptblock-Logging überwachen | 309 |
15.13 Zusammenfassung | 310 |
16: PowerShell für Linux | 311 |
16.1 Ein erster Überblick | 311 |
16.2 PowerShell unter Linux installieren | 312 |
16.3 Die ersten Schritte unter Linux | 313 |
16.4 Navigieren im Dateisystem | 313 |
16.5 PowerShell-Remoting mit SSH | 313 |
16.6 PowerShell versus PowerShell Core | 315 |
16.7 Zusammenfassung | 315 |
17: Wie man gute Skripte schreibt | 316 |
17.1 Kommentare | 316 |
17.2 Variableninitialisierung erzwingen | 316 |
17.3 Aliase vermeiden | 317 |
17.4 Datentypen für Parameter | 317 |
17.5 Keine „Spuren“ hinterlassen | 317 |
17.6 Der PSScriptAnalyzer | 318 |
17.6.1 Eigene Regeln definieren | 318 |
17.7 Zusammenfassung | 320 |
18: Spaß mit der PowerShell | 321 |
18.1 Zufallszahlen | 321 |
18.2 Farbige Ausgaben | 323 |
18.2.1 Farbe in der Konsole dank VT100-Unterstützung | 324 |
18.3 Ein etwas anderer Prompt | 326 |
18.3.1 Ein farbiger Prompt | 327 |
18.4 Sounddateien abspielen | 328 |
18.4.1 Systemso unds abspielen | 328 |
18.4.2 Töne erzeugen | 329 |
18.4.3 PowerShell-Musik | 331 |
18.5 Die PowerShell lernt sprechen | 331 |
18.5.1 Die .NET-Laufzeit kann auch sprechen | 332 |
18.6 ASCII-Art und die 80er-Jahre | 333 |
18.6.1 Bewegte ASCII-Art | 333 |
18.7 Ein Zitat, bitte | 334 |
18.7.1 Einen Internet-Zeitserver abfragen | 335 |
18.8 Ein Matrix-Style-Bildschirmschoner | 336 |
18.9 HAL ist IBM – der unwiderlegbare Beweis | 336 |
18.10 April, April | 336 |
18.11 Ein Spielhallenklassiker | 338 |
18.12 Zusammenfassung | 338 |
19: PowerShell für Entwickler | 339 |
19.1 Unterschiede und Gemeinsamkeiten mit C# | 339 |
19.2 Umgang mit Assemblys | 340 |
19.3 Assemblys in eine PowerShell-Sitzung laden | 341 |
19.3.1 Assemblys über ihren Pfad laden | 342 |
19.3.2 Assemblys über ihren Namen laden | 342 |
19.3.3 Alle geladenen Assemblys auflisten | 343 |
19.3.4 Klassendefinitionen sichtbar machen | 344 |
19.3.5 Den Inhalt einer Assembly sichtbar machen | 344 |
19.4 Assemblys erstellen | 346 |
19.4.1 Herunterladen von NuGet-Packages | 347 |
19.5 Umgang mit generischen Typen | 347 |
19.5.1 Generische Listen | 348 |
19.5.2 Generische Methodenaufrufe | 348 |
19.5.3 Aufruf einer generischen privaten Methode | 349 |
19.6 Umgang mit Events | 350 |
19.7 Das erweiterbare Typensystem | 352 |
19.8 Cmdlets definieren | 353 |
19.9 Benutzeroberflächen mit WPF | 355 |
19.10 Win32-API-Funktionen aufrufen | 359 |
19.11 Zusammenfassung | 360 |
Glossar | 361 |
Stichwortverzeichnis | 364 |