Inhalt | 6 |
Vorwort | 18 |
Website für Leser | 23 |
Über den Autor Dr. Holger Schwichtenberg | 24 |
Hinweise für den Leser | 26 |
Schreibweisen in diesem Buch | 26 |
Hinweise zu den Listings | 27 |
1 Einführung in den Windows Script Host (WSH) | 28 |
1.1 Der Windows Script Host | 28 |
1.2 Scripting versus Programmierung | 29 |
1.3 Voraussetzungen | 29 |
1.4 Die Sprache Visual Basic Script | 31 |
1.5 Das erste Skript | 32 |
1.6 Scripting im Kommandozeilenfenster | 35 |
1.7 Das zweite Skript: Versionsnummern ermitteln | 38 |
1.8 Ein Wort zur Sicherheit | 39 |
1.9 Wie geht es weiter? | 40 |
1.10 Fragen und Aufgaben | 41 |
2 Scripting-Werkzeuge | 42 |
2.1 Nur zur Not: Notepad | 43 |
2.2 Einer für alles: PrimalScript | 45 |
2.3 Der WSH-Spezialist: SystemScripter | 47 |
2.3.1 Fehlerarten | 50 |
2.3.2 Start des Debuggers | 51 |
2.3.3 Funktionen des Microsoft Script Debuggers | 53 |
2.4 Fragen und Aufgaben | 54 |
3 Scripting und die Benutzerkontensteuerung | 56 |
3.1 Benutzerkontensteuerung | 56 |
3.2 WSH-Skripte arbeiten nicht mit der Benutzerkontensteuerung zusammen | 58 |
3.3 Lösungen des Problems | 59 |
3.4 Start aus dem Admin-Konsolenfenster heraus | 60 |
3.5 Anlegen einer Verknüpfung zu wscript.exe oder cscript.exe | 62 |
3.6 Benutzerkontensteuerung deaktivieren | 63 |
3.7 Änderungen der Benutzerkontensteuerung in Windows 8.x und Windows 10 sowie Windows Server 2012 sowie Windows Server 2016 | 64 |
4 Programmieren mit VBScript | 66 |
4.1 Die Visual-Basic-Sprachfamilie | 66 |
4.2 Allgemeines zum Arbeiten mit VBScript | 67 |
4.3 Kommentare | 69 |
4.4 Literale | 69 |
4.5 Konstanten | 71 |
4.5.1 Vordefinierte Konstanten | 72 |
4.5.2 Definieren eigener Konstanten | 73 |
4.5.3 Verwenden von Konstanten | 74 |
4.6 Variablen | 74 |
4.6.1 Verwendung von Variablen | 75 |
4.6.2 Datentypen | 77 |
4.7 Operatoren | 78 |
4.7.1 Arithmetische Operatoren | 79 |
4.7.2 Vergleichsoperatoren | 80 |
4.7.3 Logische Operatoren | 81 |
4.7.4 Bitweise Operationen | 82 |
4.8 Bedingungen | 83 |
4.8.1 If .?.?. Then | 84 |
4.8.2 Select Case | 85 |
4.8.3 Bedingte Ausgaben zur Fehlersuche | 86 |
4.9 Schleifen | 88 |
4.9.1 For .?.?. Next | 88 |
4.9.2 Do .?.?. Loop | 89 |
4.10 Arrays (Variablenmengen) | 92 |
4.10.1 Eindimensionale Arrays | 93 |
4.10.2 Mehrdimensionale Arrays | 95 |
4.11 Eingebaute Funktionen | 96 |
4.11.1 Eingabehilfen | 96 |
4.11.2 Ein- und Ausgabefunktionen | 96 |
4.11.3 Konvertierungsfunktionen | 101 |
4.11.4 Abs() und Int() | 103 |
4.11.5 Rnd() | 104 |
4.11.6 InStr() | 105 |
4.11.7 Left(), Right() und Mid() | 105 |
4.11.8 Replace() und Trim() | 106 |
4.11.9 UCase() und LCase() | 107 |
4.11.10 Split() und Join() | 108 |
4.11.11 Date(), Time() und Now() | 109 |
4.11.12 DateAdd() und DateDiff() | 109 |
4.11.13 Hour(), Minute(), Second(), Day(), Month(), Year() und WeekDay() | 111 |
4.11.14 Format(), FormatNumber() und FormatDateTime() | 112 |
4.11.15 IsDate(), IsNumeric(), IsArray() | 114 |
4.12 Unterroutinen | 115 |
4.12.1 Unterroutine ohne Rückgabewert (Prozedur) | 116 |
4.12.2 Unterroutine mit Rückgabewert (Funktion) | 117 |
4.13 Benutzerdefinierte Fehlerbehandlung | 118 |
4.14 Fragen und Aufgaben | 120 |
5 Programmieren mit Objekten | 122 |
5.1 Was ist ein Objekt? | 122 |
5.2 Was ist eine Klasse? | 123 |
5.3 Objekte haben Beziehungen | 126 |
5.4 Was ist eine Komponente? | 127 |
5.5 Wie arbeitet man mit Objekten? | 128 |
5.5.1 Objektvariablen | 129 |
5.5.2 Instanziierung eines Objekts aus einer Klasse | 129 |
5.5.3 Auslesen des Werts eines Attributs | 131 |
5.5.4 Setzen des Werts eines Attributs | 131 |
5.5.5 Aufruf einer Methode | 131 |
5.5.6 Reagieren auf ein Ereignis | 132 |
5.5.7 Löschen eines Objekts | 132 |
5.5.8 Duplizieren eines Objekts | 133 |
5.5.9 Vergleich zweier Objekte | 134 |
5.5.10 Ermitteln der Klasse, zu der ein Objekt gehört | 134 |
5.6 Eingabehilfen für Objekte | 134 |
5.7 Wie erfahre ich, welche Objekte es überhaupt gibt? | 135 |
5.8 Was passiert, wenn ein Objekt nicht da ist? | 137 |
5.9 Was ist eine Objektmenge? | 137 |
5.9.1 For Each ... Next | 138 |
5.9.2 Zugriff auf einzelne Objekte in einer Objektmenge | 139 |
5.9.3 Verändern einer Objektmenge | 140 |
5.10 Fragen und Aufgaben | 141 |
6 Komponenten für das Scripting | 142 |
6.1 WSH Runtime (WSHRun) | 142 |
6.1.1 Installation | 143 |
6.1.2 Klassen | 143 |
6.1.3 Beispiele | 145 |
6.2 Scripting Runtime (SCRRun) | 145 |
6.2.1 Installation | 146 |
6.2.2 Klassen | 146 |
6.2.3 Objektauswahl | 148 |
6.2.4 Beispiele | 148 |
6.3 ActiveX Data Objects (ADO) | 148 |
6.3.1 Installation | 149 |
6.3.2 Klassen | 149 |
6.3.3 Objektauswahl | 150 |
6.3.4 Beispiele | 152 |
6.4 Active Directory Service Interface (ADSI) | 152 |
6.4.1 Installation | 153 |
6.4.2 Klassen | 154 |
6.4.3 Hilfsmittel | 159 |
6.5 Group Policy Management-Komponente (GPMC Objects) | 160 |
6.5.1 Installation | 162 |
6.5.2 Klassen | 162 |
6.5.3 Hilfsmittel | 165 |
6.5.4 Beispiele | 169 |
6.6 Windows Management Instrumentation (WMI) | 169 |
6.6.1 Installation | 170 |
6.6.2 WMI-Klassen | 171 |
6.6.3 Scripting-Hilfsklassen für WMI | 172 |
6.6.4 Objektauswahl | 174 |
6.6.5 Hilfsmittel | 177 |
6.7 Microsoft XML (MSXML) | 178 |
6.7.1 XML-Grundlagen | 178 |
6.7.2 Installation | 181 |
6.7.3 Klassen | 181 |
6.8 Fragen und Aufgaben | 182 |
7 Datenübergabe und Datenausgabe | 184 |
7.1 Kommandozeilenparameter | 185 |
7.1.1 Komplexere Parameter | 186 |
7.1.2 Kommandozeilenparameter des WSH | 188 |
7.2 Zugriff auf Datendateien | 189 |
7.2.1 Zugriff auf CSV-Dateien | 190 |
7.2.2 Zugriff auf INI-Dateien | 193 |
7.2.3 Zugriff auf Access-Datenbanken | 197 |
7.2.4 Zugriff auf XML-Dateien | 202 |
7.3 Fragen und Aufgaben | 207 |
8 Scripting des Dateisystems | 210 |
8.1 Dateien | 210 |
8.1.1 Auflisten von Dateien | 210 |
8.1.2 Dateieigenschaften bestimmen | 211 |
8.1.3 Dateieigenschaften ändern | 213 |
8.1.4 Anlegen einer Textdatei | 214 |
8.1.5 Lesen einer Textdatei | 215 |
8.1.6 Schreiben von Dateien | 218 |
8.1.7 Umbenennen einer Datei | 219 |
8.1.8 Kopieren einer Datei | 219 |
8.1.9 Verschieben einer Datei | 220 |
8.1.10 Dateien suchen | 221 |
8.1.11 Suchen in Dateiinhalten | 223 |
8.1.12 Dateien löschen | 224 |
8.2 Verzeichnisse | 225 |
8.2.1 Auflisten eines einzelnen Verzeichnisses | 225 |
8.2.2 Auflisten eines Verzeichnisbaums | 226 |
8.2.3 Anlegen eines Verzeichnisses | 227 |
8.2.4 Verzeichnisattribute bestimmen | 227 |
8.2.5 Umbenennen eines Verzeichnisses | 229 |
8.2.6 Löschen von Verzeichnissen | 230 |
8.2.7 Kopieren von Verzeichnissen | 231 |
8.2.8 Verschieben von Verzeichnissen | 231 |
8.2.9 Verzeichnis suchen | 232 |
8.2.10 Eine Verzeichnisstruktur gemäß einer XML-Datei anlegen | 234 |
8.2.11 Eine Verzeichnisstruktur in einer XML-Datei dokumentieren | 237 |
8.3 Papierkorb leeren | 240 |
8.4 Rechte auf Dateien und Verzeichnisse vergeben | 242 |
8.5 Laufwerke | 242 |
8.5.1 Auflisten von Laufwerken | 242 |
8.5.2 Laufwerkstyp bestimmen | 244 |
8.5.3 Dateisystemtyp ermitteln | 245 |
8.5.4 Speicherplatzbelegung anzeigen | 246 |
8.5.5 Mit einem Netzlaufwerk verbinden | 249 |
8.5.6 Netzwerkverbindung trennen | 250 |
8.5.7 Festplattenprüfung (CheckDisk) | 250 |
8.6 Freigaben | 251 |
8.6.1 Anlegen von Freigaben | 252 |
8.6.2 Löschen von Freigaben | 253 |
8.6.3 Rechte auf Freigaben | 253 |
8.7 Fragen und Aufgaben | 253 |
9 Scripting der Benutzerverwaltung | 256 |
9.1 Benutzerverwaltung für lokale Benutzerkonten | 257 |
9.1.1 Anlegen eines Benutzerkontos | 257 |
9.1.2 Umbenennen eines Benutzers | 260 |
9.1.3 Kennwort eines Benutzers ändern | 261 |
9.1.4 Anlegen einer Benutzergruppe | 262 |
9.1.5 Hinzufügen eines Benutzers zu einer Gruppe | 264 |
9.1.6 Entfernen eines Benutzers aus einer Gruppe | 265 |
9.1.7 Deaktivieren eines Benutzerkontos | 265 |
9.1.8 Löschen einer Gruppe | 266 |
9.1.9 Löschen eines Benutzers | 267 |
9.2 Active-Directory-Benutzerverwaltung unter Windows Server | 268 |
9.2.1 Anlegen einer Organisationseinheit | 268 |
9.2.2 Anlegen eines Organisationseinheitenbaums im Active Directory | 270 |
9.2.3 Anlegen eines Benutzerkontos | 272 |
9.2.4 Anlegen von Benutzern aus einer Access-Datenbank | 273 |
9.2.5 Anlegen einer Benutzergruppe | 275 |
9.2.6 Hinzufügen eines Benutzers einer Gruppe | 276 |
9.2.7 Ändern des Kennworts | 278 |
9.2.8 Umbenennen eines Benutzers | 278 |
9.2.9 Ändern der Benutzerdaten | 279 |
9.2.10 Deaktivieren eines Benutzerkontos | 280 |
9.2.11 Entfernen eines Benutzers aus einer Gruppe | 281 |
9.2.12 Löschen eines Benutzerkontos | 283 |
9.2.13 Löschen einer Organisationseinheit | 284 |
9.3 Fragen und Aufgaben | 285 |
10 Scripting der Computerverwaltung | 286 |
10.1 Computer auflisten | 286 |
10.2 Leistung eines Computers ermitteln | 288 |
10.3 Computerkonto erstellen | 290 |
10.4 Computerkonto löschen | 291 |
10.5 Computer zu Domäne hinzufügen | 292 |
10.6 Computer umbenennen | 293 |
10.7 Einen Computer herunterfahren/neu starten | 295 |
10.8 Fragen und Aufgaben | 296 |
11 Scripting der Ereignisprotokolle | 298 |
11.1 Protokolleinträge lesen | 299 |
11.2 Protokolleinträge schreiben | 300 |
11.3 Protokolleinträge auswerten | 303 |
11.4 Datensicherung des Ereignisprotokolls | 305 |
11.5 Ereignisprotokoll anlegen | 306 |
11.6 Ereignisprotokoll löschen | 307 |
11.7 Ereignisprotokoll leeren | 308 |
11.8 Überwachung von Einträgen | 309 |
11.9 Fragen und Aufgaben | 310 |
12 Scripting der Systemdienste | 312 |
12.1 Auflisten aller Dienste | 312 |
12.2 Auflisten aller laufenden Dienste | 314 |
12.3 Status ermitteln | 314 |
12.4 Starten | 315 |
12.5 Beenden eines Dienstes | 316 |
12.6 Neustart eines Dienstes auf mehreren Computern gemäß einer Textdatei | 317 |
12.7 Anhalten eines Dienstes | 319 |
12.8 Fortsetzen eines Dienstes | 320 |
12.9 Daten ändern | 321 |
12.10 Dienste überwachen | 323 |
12.11 Fragen und Aufgaben | 324 |
13 Scripting des Desktops | 326 |
13.1 Desktop verändern | 326 |
13.2 Startmenü verändern | 327 |
13.3 Fragen und Aufgaben | 329 |
14 Scripting der Registrierungsdatenbank | 330 |
14.1 Eintrag lesen | 332 |
14.1.1 Zugriff mit WSHRun | 332 |
14.1.2 Zugriff mit WMI | 333 |
14.2 Wert schreiben | 335 |
14.2.1 Alternative: WMI | 336 |
14.3 Eintrag anlegen | 338 |
14.4 Eintrag löschen | 338 |
14.4.1 Alternative 1: Löschen mit der WSHRun-Komponente | 338 |
14.4.2 Alternative 2: Löschen mit der WMI-Komponente | 339 |
14.5 Unterschlüssel auflisten | 339 |
14.6 Schlüssel anlegen | 340 |
14.6.1 Alternative: WMI | 341 |
14.7 Schlüssel löschen | 342 |
14.7.1 Alternative: Löschen mit der WSHRun-Komponente | 343 |
14.8 Berechtigungen vergeben | 343 |
14.9 Fragen und Aufgaben | 344 |
15 Scripting der Netzwerkkonfiguration | 346 |
15.1 Festlegen einer statischen IP-Adresse | 347 |
15.1.1 Besonderheiten | 349 |
15.2 Standard-Gateway festlegen | 349 |
15.3 DNS-Server festlegen | 351 |
15.4 WINS-Server festlegen | 352 |
15.5 Auf DHCP umstellen | 353 |
15.6 Fragen und Aufgaben | 354 |
16 Scripting der Softwareverwaltung | 356 |
16.1 Installierte Software auflisten (Softwareinventarisierung) | 356 |
16.2 Software (entfernt) installieren | 361 |
16.3 Software auf mehreren Computern installieren (gemäß einer XML-Datei) | 362 |
16.4 Software deinstallieren | 364 |
16.5 Fragen und Aufgaben | 364 |
17 Scripting der Prozessverwaltung | 366 |
17.1 Prozesse auflisten | 366 |
17.2 Prozesse (entfernt) starten | 368 |
17.2.1 Prozesse starten mit WScript.Shell | 369 |
17.2.2 Prozesse starten mit Win32_Process | 370 |
17.3 Prozesse (entfernt) beenden | 373 |
17.3.1 Prozesse beenden mit WScript.Shell | 373 |
17.3.2 Prozesse beenden mit Win32_Process | 375 |
17.4 Fragen und Aufgaben | 376 |
18 Scripting der Gruppenrichtlinien | 378 |
18.1 Informationen über ein einzelnes Gruppenrichtlinienobjekt | 378 |
18.1.1 Suche nach einem GPO | 378 |
18.1.2 Informationen über ein GPO | 379 |
18.1.3 Verknüpfungen auflisten | 379 |
18.1.4 Das komplette Skript | 380 |
18.2 Alle Gruppenrichtlinien und ihre Verknüpfungen auflisten | 382 |
18.3 Eine Gruppenrichtlinie für einen Container auflisten | 385 |
18.4 Eine Gruppenrichtlinie mit einem AD?Container verknüpfen | 387 |
18.5 Eine Gruppenrichtlinienverknüpfung löschen | 389 |
18.6 Eine Gruppenrichtlinie löschen | 391 |
18.7 Sicherungskopien von Gruppenrichtlinien anlegen | 393 |
18.8 Sicherungskopien einer Gruppenrichtlinie auflisten | 395 |
18.9 Wiederherstellung von Gruppenrichtlinien | 396 |
18.10 Weitere Möglichkeiten | 398 |
18.11 Fragen und Aufgaben | 398 |
19 Scripting-Sicherheit | 400 |
19.1 Bedrohungen durch WSH-Skripte | 400 |
19.2 Schutz vor bösen Skripten | 401 |
19.2.1 Globale WSH-Deaktivierung | 401 |
19.2.2 Sperrung auf Skriptdateiebene | 402 |
19.2.3 WSH-Skripte signieren | 402 |
19.2.4 Skriptkontrolle durch Richtlinien für Softwareeinschränkungen | 413 |
19.3 Schutz vor dem Einblick in den Quellcode | 415 |
19.4 Ein Skript unter einem anderen Benutzerkontext starten | 417 |
19.4.1 Benutzerwechsel für ein komplettes Skript | 417 |
19.4.2 Benutzerwechsel im Skriptablauf | 419 |
19.5 Fragen und Aufgaben | 425 |
20 Windows PowerShell (WPS) 5.0 | 426 |
20.1 Vergleich zwischen WSH und PowerShell | 426 |
20.2 Voraussetzungen und Installation | 428 |
20.3 PowerShell-Werkzeuge | 428 |
20.4 PowerShell-Commandlets | 431 |
20.5 PowerShell-Pipelines | 432 |
20.6 Ausgaben | 435 |
20.7 Navigation in Containern | 437 |
20.8 Hilfe zur PowerShell | 439 |
20.9 PowerShell-Skripte | 441 |
20.9.1 PowerShell-Skript-Editoren | 442 |
20.9.2 Ein Beispiel | 443 |
20.9.3 Sprachkonstrukte | 444 |
20.9.4 Skripte ausführen | 446 |
20.10 Fernausführung von Befehlen (Remoting) | 449 |
20.11 Zusatzkomponenten und Klassen nutzen | 451 |
20.12 Zusätzliche PowerShell-Module mit weiteren Commandlets | 451 |
20.12.1 Module manuell installieren | 451 |
20.12.2 Module automatisch herunterladen und installieren (ab PowerShell 3.0) | 452 |
20.12.3 Module auflisten | 458 |
20.12.4 Module laden | 459 |
20.13 COM-Komponenten, die man auch im WSH mit VBScript nutzen kann | 460 |
20.14 .NET-Klassen | 461 |
20.15 WMI-Klassen | 462 |
20.15.1 Abruf von WMI-Objektmengen | 463 |
20.15.2 Fernzugriffe | 464 |
20.15.3 Filtern und abfragen | 464 |
20.15.4 Filtern mit Get-WmiObject | 465 |
20.15.5 Zugriff auf einzelne WMI-Objekte | 465 |
20.15.6 WQL-Abfragen | 467 |
20.15.7 Ermittlung der Mitglieder des WMI-Objekts | 468 |
20.15.8 Umgang mit WMI-Datumsangaben | 470 |
20.15.9 Zugriff auf Mitglieder von WMI-Klassen | 470 |
20.15.10 Statische Klassenmitglieder | 472 |
20.15.11 Werte setzen in WMI-Objekten | 472 |
20.15.12 Methodenaufrufe mit Invoke-WmiMethod | 473 |
20.15.13 Liste aller WMI-Klassen | 473 |
20.15.14 Neue WMI-Instanzen erzeugen | 474 |
20.15.15 Weitere Möglichkeiten | 475 |
20.16 PowerShell-Commandlets in Aktion | 475 |
20.17 PowerShell-Skripte aus der Praxis | 480 |
20.17.1 Leere Ordner löschen | 480 |
20.17.2 Fotos nach Aufnahmedatum sortieren | 481 |
20.17.3 Papierkorb leeren | 483 |
20.17.4 Freigaben anlegen | 483 |
20.17.5 Netzwerkkonfiguration | 493 |
20.17.6 Massenanlegen von Active-Directory-Benutzerkonten | 495 |
20.17.7 Massenanlegen von IIS-Websites | 499 |
20.17.8 Massenanlegen von Registry-Schlüsseln | 500 |
20.17.9 Softwareinstallation | 502 |
20.17.10 Virtuelles System in Hyper-V anlegen | 503 |
21 Wie geht es weiter? | 506 |
Anhang A: Eingebaute Funktionen in VBScript | 508 |
A.1 Numerische Funktionen | 508 |
A.2 Formatierungsfunktionen | 509 |
A.3 Zeichenkettenfunktionen | 509 |
A.4 Datums-/Uhrzeitfunktionen | 511 |
A.5 Array-Funktionen | 512 |
A.6 Funktionen zur Arbeit mit COM-Klassen | 512 |
A.7 Systemfunktionen und Ein-/Ausgabe | 513 |
A.8 Typprüfung und -umwandlung | 513 |
A.9 Sonstige Funktionen | 514 |
Anhang B: Lösungen zu den Übungsaufgaben in diesem Buch | 516 |
B.1 Lösungen zu Kapitel 1 | 516 |
B.2 Lösungen zu Kapitel 2 | 517 |
B.3 Lösungen zu Kapitel 3 | 518 |
B.4 Lösungen zu Kapitel 4 | 519 |
B.5 Lösungen zu Kapitel 5 | 520 |
B.6 Lösungen zu Kapitel 6 | 520 |
B.7 Lösungen zu Kapitel 7 | 521 |
B.8 Lösungen zu Kapitel 8 | 522 |
B.9 Lösungen zu Kapitel 9 | 523 |
B.10 Lösungen zu Kapitel 10 | 525 |
B.11 Lösungen zu Kapitel 11 | 525 |
B.12 Lösungen zu Kapitel 12 | 526 |
B.13 Lösungen zu Kapitel 13 | 526 |
B.14 Lösungen zu Kapitel 14 | 527 |
B.15 Lösungen zu Kapitel 15 | 527 |
B.16 Lösungen zu Kapitel 16 | 529 |
B.17 Lösungen zu Kapitel 17 | 529 |
B.18 Lösungen zu Kapitel 18 | 531 |
B.19 Lösungen zu Kapitel 20 | 531 |
Anhang C: Abkürzungsverzeichnis | 534 |
Anhang D: Quellen und weiterführende Literatur | 542 |
Stichwortverzeichnis | 546 |