Praxisbuch Windows-Sicherheit - James Forshaw - E-Book

Praxisbuch Windows-Sicherheit E-Book

James Forshaw

0,0

Beschreibung

Das Lehr- und Experimentierwerk zur Windows-Sicherheitsarchitektur - Umfassender und tiefgehender Einblick in die Sicherheitsmechanismen von Windows - Praxisorientierter Ansatz mit interaktiven PowerShell-Beispielen zum Lernen, Ausprobieren und Experimentieren - Praktisches Nachschlagewerk und Pflichtlektüre für alle, die ein tieferes Verständnis der Windows-Sicherheitsarchitektur erwerben wollen     Dieses Buch ist ein Muss für alle, die die Low-Level-Implementierungen des Windows-Betriebssystems verstehen müssen, um neue Schwachstellen zu entdecken oder sich gegen bekannte zu schützen. Entwickler*innen, DevOps und Sicherheitsforschende finden hier einen unvergleichlichen Einblick in die Schlüsselelemente und Schwachstellen des Betriebssystems, der sogar die offizielle Dokumentation von Microsoft übertrifft. James Forshaw, renommierter Bug Hunter und Sicherheitsexperte, stellt anhand von sorgfältig ausgearbeiteten PowerShell-Beispielen, mit denen experimentiert und modifiziert werden kann, die wichtigsten Themen der Windows-Sicherheit vor. Er deckt dabei alles von der grundlegenden Analyse der Ressourcensicherheit bis hin zu fortgeschrittenen Techniken wie der Verwendung der Netzwerkauthentifizierung ab. Interaktive PowerShell-Beispiele helfen Ihnen, das Systemverhalten aktiv zu testen und zu manipulieren. Sie lernen dabei, wie Windows Dateien und die Registrierung sichert, Zugriff auf eine Ressource gewährt oder die Authentifizierung sowohl lokal als auch über ein Netzwerk implementiert. Ganz gleich, ob Sie sich gegen die neuesten Cyber-Bedrohungen zur Wehr setzen oder sich mit den Feinheiten der Windows-Sicherheitsarchitektur befassen, dieses Buch ist ein unverzichtbarer Leitfaden für Ihre Bemühungen, die Komplexität der heutigen Cybersicherheitslandschaft zu bewältigen. Themen sind unter anderem: - Die Sicherheitsarchitektur von Windows, einschließlich des Kernels und der Anwendungen im Benutzermodus - Der Windows Security Reference Monitor (SRM), einschließlich Zugriffstoken, Abfrage und Einstellung des Sicherheitsdeskriptors einer Ressource sowie Zugriffskontrolle und Auditing - Interaktive Windows-Authentifizierung und Speicherung von Anmeldeinformationen im Security Account Manager (SAM) und Active Directory - Mechanismen von Netzwerk-Authentifizierungsprotokollen, einschließlich NTLM und Kerberos

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 927

Veröffentlichungsjahr: 2025

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



James Forshaw ist ein renommierter Experte für Computersicherheit im Project-Zero-Team von Google. In seiner mehr als 20-jährigen Erfahrung bei der Analyse und Ausnutzung von Sicherheitsproblemen in Microsoft Windows und anderen Produkten hat er Hunderte veröffentlichte Sicherheitslücken in Microsoft-Plattformen entdeckt. Andere zitieren häufig seine Forschungsergebnisse, die er in Blogs, in Vorträgen oder durch neuartige Tools präsentiert, und er hat zahlreiche Forscher in der Branche inspiriert. Wenn er nicht gerade die Sicherheit anderer Produkte knackt, arbeitet James als »Abwehrspieler«, berät Teams bei ihrem Sicherheitsdesign und verbessert die Chromium Windows Sandbox, um Milliarden von Nutzern weltweit zu schützen.

Über den Fachlektor

Lee Holmes ist Sicherheitsarchitekt für Azure-Sicherheit, einer der ursprünglichen Entwickler im PowerShell-Team, ein fanatischer Bastler und der Autor von The PowerShell Cookbook (O'Reilly Media, 2010). Sie finden ihn auf Mastodon (@[email protected]) sowie auf seiner persönlichen Website (https://leeholmes.com).

Copyright und Urheberrechte:

Die durch die dpunkt.verlag GmbH vertriebenen digitalen Inhalte sind urheberrechtlich geschützt. Der Nutzer verpflichtet sich, die Urheberrechte anzuerkennen und einzuhalten. Es werden keine Urheber-, Nutzungs- und sonstigen Schutzrechte an den Inhalten auf den Nutzer übertragen. Der Nutzer ist nur berechtigt, den abgerufenen Inhalt zu eigenen Zwecken zu nutzen. Er ist nicht berechtigt, den Inhalt im Internet, in Intranets, in Extranets oder sonst wie Dritten zur Verwertung zur Verfügung zu stellen. Eine öffentliche Wiedergabe oder sonstige Weiterveröffentlichung und eine gewerbliche Vervielfältigung der Inhalte wird ausdrücklich ausgeschlossen. Der Nutzer darf Urheberrechtsvermerke, Markenzeichen und andere Rechtsvorbehalte im abgerufenen Inhalt nicht entfernen.

James Forshaw

Praxisbuch Windows-Sicherheit

Authentifizierung, Autorisierung und Überwachung

James Forshaw

Übersetzung: Rainer G. Haselier

Lektorat: Sandra Bollenbacher

Copy-Editing: Annette Schwarz, Ditzingen

Satz: Gerhard Alfes, mediaService, Siegen, www.mediaservice.tv

Herstellung: Stefanie Weidner

Cover-Illustration: Garry Booth

Umschlaggestaltung: Eva Hepper, Silke Braun

Bibliografische Information der Deutschen Nationalbibliothek

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über https://www.dnb.de abrufbar.

ISBN:

 

Print

978-3-98889-036-8

PDF

978-3-98890-250-4

ePub

978-3-98890-251-1

1. Auflage 2025

Translation Copyright für die deutschsprachige Ausgabe © 2025 dpunkt.verlag GmbH

Wieblinger Weg 17

69123 Heidelberg

E-Mail: [email protected]

Copyright © 2024 by James Forshaw. Title of English-language original: Windows Security Internals:

A Deep Dive into Windows Authentication, Authorization, and Auditing, ISBN 9781718501980, published by No Starch Press Inc. 245 8th Street, San Francisco, California United States 94103.

The German-language 1st edition Copyright © 2025 by dpunkt.verlag GmbH under license by No Starch Press Inc. All rights reserved.

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.

Weiter darf der Inhalt nicht zur Entwicklung, zum Training oder zur Anreicherung von KI-Systemen, insbesondere generativen KI-Systemen, verwendet werden. Die Nutzung für Text- und Data Mining ist untersagt.

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 noch Übersetzer können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.

Inhaltsverzeichnis

Vorwort

Danksagungen

Einleitung

Teil IEin Überblick über das Windows-Betriebssystem

1PowerShell-Testumgebung einrichten

1.1PowerShell-Version auswählen

1.2PowerShell konfigurieren

1.3Ein Überblick über die PowerShell-Sprache

1.4Zusammenfassung

2Der Windows-Kernel

2.1Die Windows Kernel Executive

2.2Der Sicherheitsreferenzmonitor

2.3Der Objekt-Manager

2.4Der Eingabe/Ausgabe-Manager

2.5Der Prozess- und Thread-Manager

2.6Der Speichermanager

2.7Codeintegrität

2.8Erweiterter lokaler Prozeduraufruf

2.9Der Konfigurationsmanager

2.10Beispiellösungen

2.11Zusammenfassung

3Anwendungen im Benutzermodus

3.1Win32 und die Windows-APIs im Benutzermodus

3.2Die Win32-GUI

3.3Win32-APIs und Systemaufrufe vergleichen

3.4Win32-Registrierungspfade

3.5DOS-Gerätepfade

3.6Prozesse erstellen

3.7Systemprozesse

3.8Beispiellösungen

3.9Zusammenfassung

Teil IIDer Sicherheitsreferenzmonitor

4Zugriffstoken

4.1Primäre Token

4.2Identitätswechseltoken

4.3Typ des Tokens konvertieren

4.4Pseudo-Token-Handle

4.5Token-Gruppen

4.6Privilegien

4.7Sandbox-Token

4.8Was zeichnet einen Administrator-Benutzer aus?

4.9Benutzerkontensteuerung

4.10Sicherheitsattribute

4.11Token erstellen

4.12Token zuweisen

4.13Beispiellösungen

4.14Zusammenfassung

5Sicherheitsdeskriptoren

5.1Der Aufbau eines Sicherheitsdeskriptors

5.2Die Struktur einer Sicherheitskennung (SID)

5.3Absolute und relative Sicherheitsdeskriptoren

5.4Header und Einträge in Zugriffssteuerungslisten

5.5Sicherheitsdeskriptoren erstellen und verändern

5.6Die Security Descriptor Definition Language

5.7Beispiellösungen

5.8Zusammenfassung

6Sicherheitsdeskriptoren lesen und zuweisen

6.1Sicherheitsdeskriptoren lesen

6.2Sicherheitsdeskriptoren zuweisen

6.3Win32-Sicherheits-APIs

6.4Server-Sicherheitsdeskriptoren und zusammengesetzte Zugriffssteuerungseinträge

6.5Zusammenfassung des Vererbungsverhaltens

6.6Beispiellösungen

6.7Zusammenfassung

7Der Prozess der Zugriffsprüfung

7.1Zugriffsprüfung durchführen

7.2Der Zugriffsprüfungsprozess in PowerShell

7.3Sandboxing

7.4Zugriffsprüfungen in Unternehmen

7.5Beispiellösungen

7.6Zusammenfassung

8Weitere Anwendungsfälle für die Zugriffsprüfung

8.1Traversal-Prüfung

8.2Zugriffsprüfung bei Handle-Duplikaten

8.3Zugriffsprüfung für Sandbox-Token

8.4Zugriffsprüfungen automatisieren

8.5Beispiellösungen

8.6Zusammenfassung

9Sicherheitsüberwachung

9.1Das Sicherheitsprotokoll

9.2Sicherheit und Überwachungsrichtlinien

9.3Beispiellösungen

9.4Zusammenfassung

Teil IIIDie lokale Sicherheitsautorität und die Authentifizierung

10Windows-Authentifizierung

10.1Domänenauthentifizierung

10.2Lokale Domänenkonfiguration

10.3LSA-Remotedienste

10.4Die Datenbanken SAM und SECURITY

10.5Beispiellösungen

10.6Zusammenfassung

11Active Directory

11.1Der Werdegang von Active Directory

11.2Eine Active-Directory-Domäne mit PowerShell untersuchen

11.3Objekte und definierte Namen

11.4Das Schema

11.5Sicherheitsdeskriptoren

11.6Zugriffsprüfungen

11.7Ansprüche und zentrale Zugriffsrichtlinien

11.8Gruppenrichtlinien

11.9Beispiellösung

11.10Zusammenfassung

12Interaktive Authentifizierung

12.1Desktop eines Benutzers erstellen

12.2Die LsaLogonUser-API

12.3Die API LsaLogonUser von PowerShell aus verwenden

12.4Einen neuen Prozess mit einem Token erstellen

12.5Der Anmeldetyp Service

12.6Beispiellösungen

12.7Zusammenfassung

13Netzwerkauthentifizierung

13.1NTLM-Netzwerkauthentifizierung

13.2Der NTLM-Relay-Angriff

13.3Beispiellösung

13.4Zusammenfassung

14Kerberos

14.1Interaktive Authentifizierung mit Kerberos

14.2Kerberos-Authentifizierung mit PowerShell durchführen

14.3Die AP-REQ-Nachricht entschlüsseln

14.4Die AP-REP-Nachricht entschlüsseln

14.5Domänenübergreifende Authentifizierung

14.6Kerberos-Delegierung

14.7Benutzer-zu-Benutzer-Authentifizierung in Kerberos

14.8Beispiellösungen

14.9Zusammenfassung

15Negotiate-Authentifizierung und andere Sicherheitspakete

15.1Sicherheitspuffer

15.2Das Negotiate-Protokoll

15.3Weniger verbreitete Sicherheitspakete

15.4Remote Credential Guard und eingeschränkter Administratormodus

15.5Anmeldeinformationsverwaltung

15.6Weitere Attributflags für Requests

15.7Netzwerkauthentifizierung mit einem LowBox-Token

15.8Das Ereignisprotokoll der Authentifizierungsereignisse

15.9Beispiellösungen

15.10Zusammenfassung

15.11Ein paar Gedanken zum Schluss

Teil IVAnhänge

AEin Windows-Domänennetzwerk für Testzwecke aufbauen

A.1Das Domänennetzwerk

A.2Windows Hyper-V installieren und konfigurieren

A.3Die virtuellen Maschinen erstellen

BZuordnung zwischen SID-Alias und SDDL-SID

Index

Gewidmet meiner wunderbaren Frau Huayiund meinem kleinen Jacob,ohne die ich nie etwas zustande bringen würde.

Vorwort

Ein technischer Mitarbeiter von Microsoft sagte mir einmal, er habe noch nie jemanden getroffen, der verstanden habe, wie die Sicherheit des Windows-Betriebssystems tatsächlich funktioniert. Ich glaube zwar nicht, dass er recht hatte (und ich werde ihm zum Beweis ein Exemplar dieses Buches schicken), dennoch ist da schon etwas dran. Obwohl von entscheidender Bedeutung, besteht kein Zweifel daran, dass die Windows-Sicherheit komplex ist.

Einer der Gründe dafür hängt mit dem grundlegenden architektonischen Unterschied zwischen Linux und Windows zusammen. Linux ist ein dateiorientiertes Betriebssystem, während Windows API-orientiert ist, und obwohl APIs einen viel größeren Funktionsumfang bieten können, gehen sie auf Kosten der Einfachheit. Die Erkundung eines API-orientierten Betriebssystems ist also schwieriger. Sie müssen die API-Dokumentation lesen, Code schreiben, ihn kompilieren und ausführen und die Ergebnisse debuggen.

Das ist ein sehr zeitaufwendiger Kreislauf und damit auch der Grund, warum so wenige Menschen ein tiefes Verständnis für die Funktionsweise der Windows-Sicherheit haben – es ist einfach zu schwer, dieses Thema zu erforschen.

Wegen dieser Probleme habe ich PowerShell erfunden. Ich wollte, dass Administratoren Windows automatisieren können, und hatte ursprünglich versucht, dies durch die kostenlose Verteilung von Unix-Tools zu erreichen. (Erinnern Sie sich an Windows Services for Unix?)

Dies scheiterte daran, dass Unix-Tools mit Dateien arbeiten, während alles Wichtige in Windows hinter einer API steckt. So funktionierte awk nicht mit der Registrierung, grep nicht mit Windows Management Instrumentation (WMI), sed nicht mit Active Directory und so weiter. Was wir brauchten, war eine API-orientierte Befehlszeilenschnittstelle und ein Skripting-Tool. Also habe ich PowerShell entwickelt.

Jetzt verwendet James, der Autor dieses Buches, PowerShell, um das Problem der Aneignung von Windows-Sicherheitsexpertise zu lösen; er hat das System erforschbar gemacht. Machen Sie den ersten Schritt: Installieren Sie sein PowerShell-Modul NTObjectManager, das über 550 Cmdlets zum Experimentieren mit allen Aspekten der Windows-Sicherheit bietet. Diese praktische Erkundung wird es Ihnen ermöglichen, zu verstehen, wie die Dinge wirklich funktionieren.

Dieses Buch gehört auf den Schreibtisch eines jeden Sicherheitsexperten und Entwicklers, der mit Windows-Sicherheit arbeitet. Teil I gibt einen Überblick über die Architektur der Windows-Sicherheit, Teil II erkundet die Details der Sicherheitsmechanismen und -dienste des Betriebssystems und Teil III untersucht die verschiedenen Aspekte der Windows-Authentifizierung. Jedes Kapitel enthält eine Reihe von PowerShell-Beispielen.

Ich empfehle Ihnen nachdrücklich, den Beispielen zu folgen; durch Erkundung werden Worte zu Erfahrung, und Erfahrung ist die Grundlage für Kompetenz. Führen Sie die Befehle aus, machen Sie absichtlich etwas nicht richtig, und schauen Sie, welche Fehler Sie erhalten. Auf diese Weise werden Sie ein tiefes Verständnis für das System entwickeln. Und glauben Sie mir: Es wird Spaß machen.

Jeffrey Snover

Erfinder von PowerShell, ehemaliger Chefarchitekt für Windows Server und ehemaliger Microsoft Technical Fellow

Danksagungen

Nur wenige Bücher werden komplett im Alleingang geschrieben, und dieses hier bildet ganz sicher keine Ausnahme. Ich möchte die Gelegenheit nutzen, um einigen der vielen Menschen zu danken, die dazu beigetragen haben, dass dieses Buch zustande gekommen ist. Ich entschuldige mich, falls ich jemanden vergessen haben sollte.

Zunächst muss ich den Beitrag meiner Frau Huayi würdigen, die mich aufmuntert, wenn ich niedergeschlagen bin, und mich (metaphorisch) tritt, wenn ich faul bin. Ohne sie an meiner Seite wären die letzten Jahre viel weniger angenehm gewesen. Der Rest meiner Familie ist genauso wichtig; ohne sie wäre mein Leben ganz anders verlaufen.

Als Nächstes möchte ich meinem technischen Lektor, Lee Holmes, danken, der das Review zu einer wertvollen Erfahrung gemacht hat, indem er mir viele PowerShell-Tricks beibrachte, von denen ich nicht wusste, dass sie existieren, und mir wichtiges Feedback zu Struktur und Inhalt gegeben hat.

Ich bin nicht die einzige Person, die sich intensiv mit Windows beschäftigt. Auch wenn es viel zu viele sind, um sie hier aufzulisten, möchte ich die folgenden Personen erwähnen, die wesentliche Beiträge zu meiner Arbeit geleistet haben. Da ist zunächst Alex Ionescu, der bekannte Windows-Interna-Guru und mein gelegentlicher Mitarbeiter (oder Konkurrent), der stets irgendwelche schrägen Details zu den Geheimnissen des Betriebssystems auf Lager hat. Dann sind da noch die vielen Praktiker der Windows-Sicherheitsforschung und -tests für Unternehmen, wie Lee Christensen, Will Schroeder und Nick Landers. Sie waren wichtige Gesprächspartner für mein Verständnis von Software wie Active Directory und Kerberos und haben meine Tooling-Projekte aktiv getestet und unterstützt.

Ich möchte nicht versäumen, die erstaunlichen Forscher aus meinen prägenden Jahren zu erwähnen, insbesondere Pete und Rich – ihr wisst, wer gemeint ist. Außerdem möchte ich Rob und seinem Team dafür danken, dass sie sich frühe Entwürfe der Kapitel meines Buches angesehen und mir wertvolles Feedback gegeben haben.

Meine Beziehung zu Microsoft hatte ihre Höhen und Tiefen. Dennoch möchte ich mich bei vielen aktuellen und ehemaligen Mitarbeitern bedanken, die mich auf meinem Weg unterstützt haben. Dazu gehört Katie Moussouris, die mich maßgeblich davon überzeugt hat, dass es sich lohnt, Fehler in Microsoft-Produkten zu finden. Dann ist da noch Nate Warfield, der viele Jahre lang mein Ansprechpartner im Microsoft Security Response Center (MSRC) war, wo er mich vor der Parteipolitik des Unternehmens schützte und dafür sorgte, dass die von mir gemeldeten Fehler zeitnah behoben wurden. Schließlich möchte ich mich bei den derzeitigen MSRC-Vertretern, darunter Nic Fillingham und Stephanie Calabrese, dafür bedanken, dass sie mir geholfen haben, wenn ich mit jemandem aus dem tiefsten Inneren des Unternehmens Kontakt aufnehmen musste, und dass sie mich mit Werbegeschenken versorgt haben.

Mein besonderer Dank gilt meinen Google-Kollegen, die mich dabei unterstützten, Fehler in Windows zu finden, um damit zu seiner Verbesserung beizutragen. Dazu gehört das gesamte aktuelle Google-Project-Zero-Team und seine ehemaligen Mitarbeiter: die beste Gruppe von Sicherheitsforschern, die Sie wahrscheinlich jemals an einem Ort versammelt finden werden. Dann ist da noch Will Harris, mein Freund und Kollege im Chromium-Windows-Sandbox-Team, der mir viele der Fragen zur Windows-Sicherheit gestellt hat, auf denen dieses Buch basiert. Und schließlich möchte ich Heather Adkins danken, die maßgeblich dazu beigetragen hat, dass ich ein Buch dieser Art schreiben und gleichzeitig meinen Job bei Google behalten konnte.

Ich möchte auch allen bei No Starch Press danken, die an diesem Buch gearbeitet haben und geduldig mit mir waren: insbesondere Alex Freed, meinem langjährigen Lektor, der leider den Verlag vor der Veröffentlichung verließ, und Frances Saux, die nach Alex’ Weggang meine neue Lektorin wurde und dieses Buch mit aller Kraft zur Vollendung gebracht hat. Schließlich muss ich Bill Pollock danken, der ein guter Freund ist und nicht nur immer tolle Tipps fürs Bücherschreiben gibt, sondern auch stets neue Empfehlungen für fantastische Restaurants.

Ich habe hier nicht den Platz, um alle zu nennen, aber abschließend möchte ich all den Freunden und Kollegen danken, die jeden Tag einen großen Beitrag zu meinem Leben und meinem Erfolg leisten. Danke auch an Sie, dass Sie mein Buch in die Hand genommen haben. Ich hoffe, dass die darin enthaltenen Informationen über Windows-Sicherheit nützlich für Sie sind.

Einleitung

Hunderte Millionen von Geräten nutzen die Microsoft-Windows-Plattform. Viele der weltweit größten Unternehmen verlassen sich auf die Sicherheit von Windows, um ihre Daten und ihre Kommunikation zu schützen, ebenso wie jeder, der seinen Code in der Azure-Cloud hostet. Aber weil Windows so wichtig für die Sicherheit des modernen Internets ist, ist es auch ein beliebtes Ziel für Angriffe.

Das Betriebssystem Windows NT begann 1993 damit, Sicherheitsaspekte in sein Design einzubeziehen, als es Benutzerkonten, die Kontrolle über Ressourcen und den Fernzugriff über ein Netzwerk einführte. In den mehr als 30 Jahren, die seitdem vergangen sind, hat sich bei der Windows-Sicherheit viel getan. Microsoft hat das ursprüngliche Authentifizierungsverfahren durch moderne Technologien ersetzt, den Mechanismus der Zugriffssteuerung um zusätzliche Features erweitert und die Plattform erheblich gegen Angriffe gehärtet.

Die Sicherheit der Windows-Plattform ist heute erstaunlich komplex, und viele Angriffe beruhen auf der Ausnutzung dieser Komplexität. Leider ist die Dokumentation von Microsoft in diesem Bereich oft unzureichend. Da Windows nicht quelloffen ist, kann man seine Sicherheit manchmal nur durch gründliche Forschung und Analyse verstehen.

Hier komme ich ins Spiel. Ich habe mehr als 20 Jahre als Entwickler und Sicherheitsforscher auf Windows-Plattformen verbracht und dabei ein Verständnis für die undokumentierten Ecken des Betriebssystems entwickelt. In diesem Buch gebe ich einen Teil meines umfangreichen Fachwissens in leicht verständlicher Form weiter. Wenn Sie die Prinzipien der Windows-Sicherheit beherrschen, werden Sie in der Lage sein, Ihr eigenes Forschungsprojekt zu starten oder Ihr Softwareprodukt zu verbessern.

An wen sich dieses Buch richtet

Ich habe dieses Buch für Menschen geschrieben, die mit Windows-Sicherheit arbeiten. Vielleicht sind Sie ein Entwickler von Windows-Software und möchten gewährleisten, dass Ihr Produkt sicher ist. Oder Sie sind ein Systemadministrator, der mit der Sicherung von Windows in einem Unternehmen betraut ist und nicht ganz versteht, wie die verschiedenen Sicherheitsfunktionen zusammenwirken, um die Plattform zu schützen. Oder Sie möchten als Forscher Löcher in das Betriebssystem bohren, um Sicherheitsschwachstellen zu finden.

Dieses Buch setzt voraus, dass Sie mit der Windows-Benutzeroberfläche und ihren grundlegenden Funktionen, wie beispielsweise dem Bearbeiten von Dateien, vertraut sind. Dennoch müssen Sie kein Windows-Experte sein: Für diejenigen, die ein wenig mehr Grundwissen benötigen, bieten die Kapitel 2 und 3 einen Überblick über das Betriebssystem und wie die verschiedenen Komponenten zusammenwirken.

Ich stütze mich in hohem Maße auf die Verwendung von PowerShell-Skripten, daher ist es hilfreich, wenn Sie einige Erfahrung mit dieser Sprache sowie mit dem .NET-Framework haben, auf dem sie basiert. Um Sie auf den neuesten Stand zu bringen, gibt Kapitel 1 einen schnellen Überblick über einige PowerShell-Features. Andernorts werde ich mich bemühen, esoterische Funktionen der Sprache zu vermeiden, damit der Code auch für Leser mit Kenntnissen anderer Skriptsprachen oder Shell-Umgebungen (wie Bash) zugänglich bleibt.

Aufbau des Buches

In jedem Kapitel werden wir die wichtigsten Sicherheitsfeatures behandeln, die in modernen Versionen von Windows implementiert sind. Außerdem werden wir mehrere in PowerShell geschriebene Beispiellösungen durchgehen, die Ihnen ein besseres Verständnis der im Kapitel vorgestellten Befehle vermitteln sollen. Im Folgenden finden Sie eine kurze Zusammenfassung der Inhalte der einzelnen Kapitel.

Teil I

gibt einen Überblick über das Windows-Betriebssystem aus der Programmierperspektive. Er soll Ihnen die Grundlagen vermitteln, die Sie zum Verständnis der anderen Teile des Buches benötigen.

Kapitel 1

:

PowerShell-Testumgebung einrichten

In diesem Kapitel richten Sie PowerShell ein, damit Sie die Beispiele aus den folgenden Kapiteln ausführen können. Dazu gehört die Installation eines von mir geschriebenen PowerShell-Moduls, das mit Windows und seinen Sicherheitsfunktionen interagiert. Das Kapitel bietet auch einen Überblick über die PowerShell.

Kapitel 2

:

Der Windows-Kernel

In diesem Kapitel werden die Grundlagen des Windows-Kernels und seiner Systemaufrufschnittstelle behandelt, ein Thema, das für die Entwicklung eines soliden Verständnisses der Windows-Sicherheit entscheidend ist. Ich beschreibe auch den Objekt-Manager, der zur Verwaltung von Ressourcen dient.

Kapitel 3

:

Anwendungen im Benutzermodus

Die meisten Anwendungen verwenden nicht direkt die Systemaufrufschnittstelle des Kernels, sondern eine Reihe von Programmierschnittstellen (APIs) auf höherer Ebene. Dieses Kapitel befasst sich mit Windows-Funktionen wie der Dateiverwaltung und der Registry.

Teil II

behandelt die für die Sicherheit wichtigste Komponente des Windows-Kernels, den Sicherheitsreferenzmonitor (Security Reference Monitor, SRM). Wir werden uns alle Aspekte der Zugriffssteuerung ansehen, angefangen bei der Erstellung der Benutzeridentität bis zur Sicherung einer einzelnen Ressource, wie beispielsweise einer Datei.

Kapitel 4

:

Zugriffstoken

Windows weist jedem laufenden Prozess ein Zugriffstoken zu, das die Identität des Benutzers gegenüber dem System darstellt. In diesem Kapitel werden die verschiedenen Komponenten beschrieben, die im Token gespeichert sind und zur Überprüfung des Zugriffs verwendet werden.

Kapitel 5

:

Sicherheitsdeskriptoren

Jede sicherheitsrelevante Ressource benötigt eine Beschreibung, wer auf sie zugreifen darf und welche Art von Zugriff gewährt wird. Dies ist der Zweck von Sicherheitsdeskriptoren. In diesem Kapitel werden wir ihre interne Struktur behandeln und beschreiben, wie Sie sie erstellen und manipulieren können.

Kapitel 6

:

Sicherheitsdeskriptoren lesen und zuweisen

Um die Sicherheit des Systems zu überprüfen, müssen Sie in der Lage sein, den Sicherheitsdeskriptor einer Ressource abzufragen. In diesem Kapitel wird erklärt, wie diese Abfrage für verschiedene Arten von Ressourcen erfolgt. Es behandelt auch die vielen komplexen Möglichkeiten, mit denen Windows den Ressourcen Sicherheitsdeskriptoren zuweist.

Kapitel 7

:

Der Prozess der Zugriffsprüfung

Windows verwendet die Zugriffsprüfung, um festzustellen, welcher Zugriff einem Benutzer auf eine Ressource gewährt werden soll. Bei diesem Vorgang werden das Token und der Sicherheitsdeskriptor verwendet und ein Algorithmus zur Bestimmung des gewährten Zugriffs wird angewendet. In diesem Kapitel wird eine PowerShell-Implementierung des Algorithmus durchgespielt, um dessen Aufbau eingehend zu untersuchen.

Kapitel 8

:

Weitere Anwendungsfälle für die Zugriffsprüfung

Obwohl Windows die Zugriffsprüfung in erster Linie verwendet, um den Zugriff auf Ressourcen zu gewähren, wird sie manchmal auch verwendet, um andere Sicherheitseigenschaften zu bestimmen, wie beispielsweise die Sichtbarkeit von Ressourcen und ob ein Prozess mit einer niedrigen Berechtigungsstufe läuft. Dieses Kapitel behandelt diese alternativen Anwendungsfälle für die Zugriffsprüfung.

Kapitel 9

:

Sicherheitsüberwachung

Die Zugriffsprüfung kann Protokolle über die Ressourcen erstellen, auf die ein Benutzer zugegriffen hat, und zwar mit welcher Zugriffsebene. In diesem Kapitel werden diese Richtlinien zur Systemüberwachung behandelt.

Teil III

enthält Einzelheiten zur Windows-Authentifizierung, zu den Mechanismen, die die Identität eines Benutzers für die Zwecke der Zugriffssteuerung überprüfen.

Kapitel 10

:

Windows-Authentifizierung

Da das Thema Authentifizierung recht komplex ist, fasst dieses Kapitel die Authentifizierungsstruktur und -dienste zusammen, von denen der Rest der Authentifizierungsmechanismen abhängt.

Kapitel 11

:

Active Directory

Mit Windows 2000 wurde ein neues Modell für die Vernetzung von Windows-Systemen in Unternehmen eingeführt, bei dem alle Authentifizierungsinformationen in einem Netzwerkverzeichnis gespeichert werden, das Benutzer und Administratoren abfragen und ändern können. Dieses Kapitel behandelt, wie Active Directory Informationen speichert und vor böswilligen Änderungen schützt.

Kapitel 12

:

Interaktive Authentifizierung

Das häufigste Authentifizierungsszenario unter Windows besteht darin, dass ein Benutzer seinen Benutzernamen und sein Kennwort in seinen Computer eingibt und Zugriff auf den Desktop erhält. Dieses Kapitel beschreibt, wie das Betriebssystem diesen Authentifizierungsprozess implementiert.

Kapitel 13

:

Netzwerkauthentifizierung

Wenn ein Benutzer auf einen Netzwerkdienst in einem Windows-Unternehmensnetzwerk zugreifen möchte, muss er sich in der Regel bei diesem Dienst authentifizieren. Windows stellt spezielle Netzwerkprotokolle zur Verfügung, um diese Authentifizierung zu implementieren, ohne die Anmeldeinformationen des Benutzers an ein potenziell feindliches Netzwerk weiterzugeben. In diesem Kapitel wird der Prozess der Netzwerkauthentifizierung erläutert, wobei der Schwerpunkt auf dem Authentifizierungsprotokoll New Technology LAN Manager (NTLM) liegt.

Kapitel 14

:

Kerberos

Zusammen mit Active Directory führte Windows 2000 auch die Verwendung des offenen Kerberos-Authentifizierungsprotokolls für die Authentifizierung im Unternehmensnetzwerk ein. Dieses Kapitel erklärt, wie Kerberos in Windows funktioniert, um einen Benutzer interaktiv und über ein Netzwerk zu authentifizieren.

Kapitel 15

:

Negotiate-Authentifizierung und andere Sicherheitspakete

Im Laufe der Jahre hat Windows weitere Arten von Netzwerk-Authentifizierungsprotokollen hinzugefügt. Dieses Kapitel behandelt diese neuen Typen, einschließlich Negotiate, als Ergänzung zu den in den

Kapiteln 13

und

14

behandelten.

In den beiden Anhängen finden Sie schließlich Einzelheiten zur Konfiguration und weitere Ressourcen.

Anhang A

:

Ein Windows-Domänennetzwerk für Testzwecke aufbauen

Um einige der Beispiele in diesem Buch auszuführen, benötigen Sie ein Windows-Domänennetzwerk. Dieser Anhang beschreibt einige Schritte, wie Sie PowerShell zur Konfiguration eines Testnetzwerks verwenden können.

Anhang B

:

Zuordnung zwischen SID-Alias und SDDL-SID

Dieser Anhang enthält eine Tabelle der Konstanten, auf die in

Kapitel 5

verwiesen wird.

In diesem Buch verwendete PowerShell-Konventionen

Die Skriptsprache PowerShell, die in allen Versionen von Windows enthalten ist, ist eine der besten Möglichkeiten, um flexibel mit den Interna des Betriebssystems zu experimentieren, ohne viel zusätzliche Software installieren zu müssen. Da PowerShell auf der .NET-Laufzeitumgebung basiert, verwendet dieses Buch eine .NET-Bibliothek, die ich für die Interaktion mit Windows geschrieben habe und die die Entwicklung komplexer Skripte erleichtert. Die Beispielskripte für dieses Buch stehen in einer englischsprachigen und einer deutschsprachigen Version zur Verfügung. Wenn Sie eine englischsprachige Version von Windows verwenden, laden Sie die Beispielskripte von https://github.com/tyranid/windows-security-internals herunter. Die Skripte für eine deutschsprachige Windows-Version finden Sie auf der Website zu diesem Buch unter https://dpunkt.de/produkt/praxisbuch-windows-sicherheit. Die beiden Varianten unterscheiden sich im Wesentlichen dadurch, dass in der deutschsprachigen Version der Skripte die Textkonstanten für die Namen der integrierten Gruppen und Benutzer angepasst wurden, damit diese mit deutschen Windows-Versionen funktionieren.

Die PowerShell-Beispiele in den einzelnen Kapiteln folgen einer Reihe gemeinsamer Stilkonventionen, die Ihnen helfen sollen, die Verwendung der Beispiele zu verstehen. Jedes Beispiel wird in Form eines Listings bereitgestellt, wobei es zwei Arten gibt: interaktive und nicht interaktive. Interaktive PowerShell-Listings sind diejenigen, die Sie auf der Befehlszeile eingeben, um die Ergebnisse zu beobachten. Hier ist ein Beispiel für ein interaktives Listing:

PS> ls C:\

Verzeichnis: C:\

Mode LastWriteTime Length Name

---- ------------- ------ ----

d-r--- 05.12.2024 21:15 Program Files

d-r--- 18.09.2024 09:27 Program Files (x86)

--gekürzt--

Vor jedem einzugebenden Befehl steht die Eingabeaufforderung im PowerShell-Stil (PS>), und der Befehl selbst wird in fetter Schrift angezeigt . Die Ausgabe des Befehls wird unter dem Befehl angezeigt . Manchmal kann die Ausgabe ziemlich lang sein; um Platz zu sparen, verwende ich --gekürzt--, um darauf hinzuweisen, dass die Ausgabe gekürzt wurde . Beachten Sie auch, dass die Ausgabe in einigen Beispielen indikativ ist; sie kann je nach Betriebssystem oder Netzwerkkonfiguration geringfügig anders aussehen.

Die meisten interaktiven Listings sind so konzipiert, dass sie unter einem normalen Benutzerkonto ausgeführt werden können. Einige müssen jedoch unter einem Administratorkonto ausgeführt werden, um auf bestimmte geschützte Funktionen zugreifen zu können. Wenn Sie die Befehle nicht als Administrator ausführen, werden die Ergebnisse nicht korrekt sein. Im Text vor jedem Listing wird erläutert, ob Sie den Befehl als Administrator ausführen müssen.

Ein nicht interaktives Listing enthält PowerShell-Code, den Sie zur Wiederverwendung in eine Skriptdatei kopieren können, z.B. so:

function Get-Hello { "Hello"

}

In nicht interaktiven Listings wird die PowerShell-Eingabeaufforderung nicht vorangestellt und der Code wird nicht fett gedruckt.

Wenn Sie schon einmal Skripte in PowerShell geschrieben haben, wissen Sie, dass die Sprache für ihre ausführlichen Befehls- und Parameternamen berüchtigt ist. Dies macht es schwierig, bestimmte Befehle in einer einzigen Zeile im Buch unterzubringen. Hier ist ein Beispiel für eine lange PowerShell-Zeile und einige Möglichkeiten, wie das Buch sie aufteilen könnte, damit sie auf die Seite passt:

PS> Get-ChildItem -LiteralPath "C:\" -Filter "*.exe" -Recurse-Hidden -System -Depth 5 | Where-Object {

$_.Name -eq "Hallo"

}

Die erste Zeile, die den Befehl Get-ChildItem verwendet, ist zu lang, um auf die Seite zu passen, und wird daher auf eine nachfolgende Zeile umgebrochen. Sie können nicht einfach einen Zeilenumbruch in der Mitte eines solchen Befehls einfügen. Wenn Sie ihn also in die Shell oder eine Datei eingeben, sollten Sie ihn als einzelne Zeile behandeln. Der Hauptindikator dafür, dass die Zeile weiterläuft und nicht Teil der Ausgabe ist, ist ein fettes Zeichen als erstes Zeichen der neuen Zeile. Außerdem ist am Ende der vorherigen Zeile das Zeichen sichtbar, das Sie darauf hinweist, dass wir aus satztechnischen Gründen einen Zeilenumbruch eingefügt haben.

PowerShell kann lange Zeilen durch bestimmte Zeichen unterbrechen, z.B. das Pipe-Symbol (|), das Komma (,) oder geschweifte Klammern ({}). In diesem Listing habe ich nach der öffnenden geschweiften Klammer ({) einen Zeilenumbruch und die nachfolgenden Befehle in den geschweiften Block eingefügt, der um eine Ebene eingerückt ist . In diesem Fall kümmert sich die Shell um die neue Zeile. Beachten Sie, dass die schließende Klammer (}) in der ersten Spalte steht, sodass Sie vermuten könnten, dass sie in der vorherigen Zeile stehen muss. Das Verschieben der Klammer in die vorherige Zeile funktioniert zwar in diesem speziellen Fall, ist aber unnötig.

Beachten Sie, dass sich das Windows-Betriebssystem noch in der aktiven Entwicklung befindet. Zwar wurden alle PowerShell-Beispiele auf den neuesten Versionen von Windows getestet, die zum Zeitpunkt der Erstellung dieses Buches verfügbar waren, es besteht jedoch die Möglichkeit, dass zu dem Zeitpunkt, an dem Sie dieses Buch lesen, neue Sicherheitsfeatures eingeführt wurden oder andere veraltet sind. Im Folgenden finden Sie eine Liste der Versionen, auf denen die Beispiele getestet wurden, zusammen mit der Buildnummer des Betriebssystems:

Windows 11 (Betriebssystembuild 22631)

Windows 10 (Betriebssystembuild 19045)

Windows Server 2022 (Betriebssystembuild 20384)

Windows Server 2019 (Betriebssystembuild 17763)

Wenn im Text von »den neuesten Versionen« die Rede ist, sind damit diese Versionen gemeint. Im Rahmen der Übersetzung wurden die Beispiele auch mit Windows Server 2025 (Betriebssystembuild 26100) getestet.

Kontakt

Ich bin immer daran interessiert, positives und negatives Feedback zu meiner Arbeit zu erhalten, und dieses Buch ist da keine Ausnahme. Sie können mir eine E-Mail schicken an [email protected]. Sie können auch meinen Blog unter https://www.tiraniddo.dev abonnieren, in dem ich einige meiner neuesten fortgeschrittenen Sicherheitsforschungen veröffentliche.

Mit Anmerkungen, Fragen oder Verbesserungsvorschlägen zu diesem Buch können Sie sich auch an den dpunkt.verlag wenden:

[email protected]

Bitte beachten Sie, dass über unsere E-Mail-Adresse kein Software-Support angeboten wird. Für Supportinformationen bezüglich der hier verwendeten Microsoft-Produkte besuchen Sie die Microsoft-Website:

https://support.microsoft.com

IEin Überblick über das Windows-Betriebssystem

1PowerShell-Testumgebung einrichten

In diesem Kapitel werden Sie PowerShell so konfigurieren, dass Sie die im Buch vorgestellten Codebeispiele durcharbeiten können. Anschließend geben wir einen kurzen Überblick über die PowerShell-Sprache, einschließlich ihrer Typen, Variablen und Ausdrücke. Außerdem erfahren Sie, wie Sie Befehle ausführen, wie Sie Hilfe erhalten und wie Sie Daten zur späteren Verwendung exportieren.

1.1PowerShell-Version auswählen

Das wichtigste Tool, das Sie für die effektive Nutzung dieses Buches benötigen, ist PowerShell, das seit Windows 7 standardmäßig auf dem Windows-Betriebssystem installiert ist. Allerdings gibt es viele verschiedene Versionen dieses Tools. Die Version, die standardmäßig auf den derzeit unterstützten Windows-Versionen installiert ist, ist die Version 5.1. Diese Version ist für unsere Zwecke geeignet, auch wenn Microsoft diese PowerShell-Version nicht mehr vollständig unterstützt. Neuere Versionen von PowerShell sind plattformübergreifend und quelloffen, müssen aber unter Windows separat installiert werden.

Der gesamte in diesem Buch vorgestellte Code läuft sowohl in PowerShell 5.1 als auch in der neuesten Open-Source-Version, sodass es keine Rolle spielt, welche Sie verwenden. Wenn Sie die Open-Source-PowerShell verwenden möchten, besuchen Sie die GitHub-Seite des Projekts unter https://github.com/PowerShell/PowerShell. Dort finden Sie Installationsanleitungen für die von Ihnen benutzte Windows-Version.

1.2PowerShell konfigurieren

Als Erstes müssen wir in PowerShell die Skript-Ausführungsrichtlinie festlegen, die bestimmt, welche Arten von Skripts PowerShell ausführen kann. Für Windows-Clients, auf denen PowerShell 5.1 ausgeführt wird, ist der Standardwert Restricted, der die Ausführung aller Skripte blockiert, sofern sie nicht mit einem vertrauenswürdigen Zertifikat signiert sind. Da die Skripte in diesem Buch nicht signiert sind, ändern wir die Ausführungsrichtlinie auf RemoteSigned. Mit dieser Ausführungsrichtlinie können wir unsignierte PowerShell-Skripte ausführen, wenn sie lokal erstellt wurden, aber wir können keine unsignierten Skripte ausführen, die in einem Webbrowser heruntergeladen wurden oder an E-Mails angehängt waren. Führen Sie den folgenden Befehl aus, um die Ausführungsrichtlinie festzulegen:

PS> Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force

Der Befehl ändert die Ausführungsrichtlinie nur für den aktuellen Benutzer, nicht für das gesamte System. Wenn Sie die Ausführungsrichtlinie für alle Benutzer ändern möchten, müssen Sie PowerShell als Administrator starten, den Befehl erneut ausführen und hierbei den Parameter Scope entfernen.

Wenn Sie die Open-Source-Version von PowerShell oder Version 5.1 auf Windows Server verwenden, ist die Standardrichtlinie für die Skriptausführung RemoteSigned, und Sie müssen nichts ändern.

Da wir nun unsignierte Skripts ausführen können, können wir das PowerShell-Modul installieren, das wir in diesem Buch verwenden werden. Ein PowerShell-Modul ist ein Paket von Skripts und .NET-Binärdateien, die PowerShell-Befehle exportieren. Auf jeder PowerShell-Installation sind mehrere Module für Aufgaben vorinstalliert, die von der Konfiguration Ihrer Anwendungen bis zur Einrichtung von Windows Update reichen. Sie können ein Modul manuell installieren, indem Sie die entsprechenden Dateien kopieren. Am einfachsten ist es jedoch, die PowerShell-Gallery (https://www.powershellgallery.com) zu verwenden. Hierbei handelt es sich um ein Online-Repository für Module.

Um ein Modul aus der PowerShell-Gallery zu installieren, verwenden wir den PowerShell-Befehl Install-Module. Für dieses Buch müssen wir das Modul NtObjectManager installieren, was wir mit dem folgenden Befehl tun können:

PS> Install-Module NtObjectManager -Scope CurrentUser -Force

Stellen Sie sicher, dass Sie Ja sagen, wenn das Installationsprogramm Ihnen Fragen stellt (nachdem Sie die Fragen gelesen und verstanden haben, versteht sich). Wenn Sie das Modul bereits installiert haben, können Sie sicherstellen, dass Sie die neueste Version verwenden, indem Sie den Befehl Update-Module verwenden:

PS> Update-Module NtObjectManager

Sobald das Modul installiert ist, können Sie es mit dem Befehl Import-Module importieren:

PS> Import-Module NtObjectManager

Wenn Sie nach dem Importieren des Moduls Fehlermeldungen sehen, überprüfen Sie, ob Sie die Ausführungsrichtlinie richtig eingestellt haben; das ist der häufigste Grund dafür, dass das Modul nicht richtig geladen wird. Als letzten Test führen wir einen Befehl aus, der in dem Modul enthalten ist, um zu prüfen, ob es funktioniert. Führen Sie den Befehl in Listing 1.1 aus und überprüfen Sie, ob die hier gezeigte Ausgabe mit der in der PowerShell-Konsole übereinstimmt. Wir werden den Zweck dieses Befehls in einem späteren Kapitel untersuchen.

PS> New-NtSecurityDescriptor

Owner DACL ACE Count SACL ACE Count Integrity Level

----- -------------- -------------- ---------------

NONE NONE NONE NONE

Listing 1.1Testen, ob das ModulNtObjectManagerfunktioniert

Wenn alles funktioniert und Sie mit PowerShell vertraut sind, können Sie mit dem nächsten Kapitel fortfahren. Wenn Sie eine kurze Auffrischung zur PowerShell-Sprache benötigen, lesen Sie im nächsten Abschnitt weiter.

1.3Ein Überblick über die PowerShell-Sprache

Eine vollständige Einführung in die PowerShell-Sprache würde den Rahmen dieses Buches sprengen. In diesem Abschnitt werden jedoch verschiedene PowerShell-Features behandelt, mit denen Sie vertraut sein müssen, damit Sie das Buch möglichst effektiv nutzen können.

1.3.1Datentypen, Variablen und Ausdrücke verstehen

PowerShell unterstützt viele verschiedene Datentypen, angefangen bei einfachen Ganzzahlen und Zeichenfolgen bis hin zu komplexen Objekten. Tabelle 1.1 zeigt einige der gebräuchlichsten integrierten Typen, zusammen mit den zugrunde liegenden .NET-Laufzeittypen und einigen einfachen Beispielen.

Datentyp

.NET-Typ

Beispiele

int

System.Int32

142, 0x8E, 0216

long

System.Int64

142L, 0x8EL, 0216L

string

System.String

"Hello", 'World!'

double

System.Double

1.0, 1e10

bool

System.Boolean

$true, $false

array

System.Object[]

@(1, "ABC", $true)

hashtable

System.Collections.Hashtable

@{A=1; B="ABC"}

Tab. 1.1Allgemeine grundlegende PowerShell-Typen mit .NET-Typen und Beispielen

Um Berechnungen mit den Grunddatentypen durchzuführen, können wir bekannte Operatoren wie +, -, * und / verwenden. Diese Operatoren können überladen werden; zum Beispiel wird + sowohl für die Addition von Zahlen als auch für die Verkettung von Zeichenketten und Arrays verwendet. Tabelle 1.2 enthält eine Liste der gängigen Operatoren mit einfachen Beispielen und ihren Ergebnissen. Sie können die Beispiele selbst testen, um die Ausgabe der einzelnen Operatoren zu überprüfen.

Tab. 1.2Allgemeine Operatoren

Listing 1.2Ein Array einer Variablen zuweisen und dann ein Element über den Variablennamen indizieren

Außerdem gibt es einige vordefinierte Variablen, die wir im weiteren Verlauf dieses Buches verwenden werden. Diese Variablen sind:

$null

Stellt den NULL-Wert dar, der bei Vergleichen das Fehlen eines Wertes anzeigt

$pwd

Enthält das aktuelle Arbeitsverzeichnis

$pid

Enthält die Prozess-ID der Shell

$env

Zugriff auf die Prozessumgebung (z.B.

$env:WinDir

, um das Windows-Verzeichnis abzurufen)

Sie können alle Variablen mit dem Befehl Get-Variable auflisten.

Vielleicht haben Sie in Tabelle 1.1 bemerkt, dass es zwei Zeichenfolgenbeispiele gab, eines mit doppelten Anführungszeichen und eines mit einfachen Anführungszeichen. Ein Unterschied zwischen den beiden besteht darin, dass eine Zeichenfolge mit doppelten Anführungszeichen die Zeichenfolgeninterpolation unterstützt, bei der Sie einen Variablennamen als Platzhalter in die Zeichenfolge einfügen und PowerShell den Wert in das Ergebnis aufnimmt. Listing 1.3 zeigt, was passiert, wenn Sie dies bei Zeichenfolgen in doppelten und einfachen Anführungszeichen tun.

Listing 1.3Beispiele für Zeichenfolgeninterpolation

Zunächst definieren wir eine Variable mit dem Wert 42, die wir in eine Zeichenfolge einfügen wollen. Dann erstellen wir eine Zeichenfolge in doppelten Anführungszeichen; diese enthält den Namen der Variablen. Das Ergebnis ist die Zeichenkette, in der der Variablenname durch seinen Wert ersetzt und als Zeichenfolge formatiert wurde. (Wenn Sie mehr Kontrolle über die Formatierung haben möchten, können Sie den in Tabelle 1.2 definierten Formatoperator für Zeichenfolgen verwenden.)

Um das unterschiedliche Verhalten einer Zeichenfolge in einfachen Anführungszeichen zu demonstrieren, definieren wir als Nächstes eine solche Zeichenfolge, die den Variablennamen inline enthält. In diesem Fall wird der Variablenname wortwörtlich kopiert und nicht durch den Wert ersetzt.

Ein weiterer Unterschied besteht darin, dass eine Zeichenkette in doppelten Anführungszeichen Escape-Zeichen enthalten kann, die in Zeichenketten in einfachen Anführungszeichen ignoriert werden. Diese Escape-Zeichen verwenden eine ähnliche Syntax wie in der Programmiersprache C, aber anstelle eines Backslashs () verwendet PowerShell den Backtick (`). Der Grund dafür ist, dass Windows den Backslash als Trennzeichen in Pfaden verwendet und das Schreiben von Dateipfaden sehr lästig wäre, wenn Sie jeden Backslash escapen müssten. Tabelle 1.3 enthält eine Liste der Maskierungszeichen (Escape-Sequenzen), die Sie in PowerShell verwenden können.

Maskierungszeichen

Name

`0

NUL-Zeichen mit einem Wert von Null

`a

Glocke

`b

Rücktaste

`n

Zeilenvorschub

`r

Wagenrücklauf

`t

Horizontaler Tabulator

`v

Vertikaler Tabulator

``

Backtick-Zeichen

`"

Doppeltes Anführungszeichen

Tab. 1.3Maskierungszeichen für Zeichenfolgen

Wenn Sie ein doppeltes Anführungszeichen in eine Zeichenkette mit doppelten Anführungszeichen einfügen möchten, müssen Sie die Escape-Sequenz `" verwenden. Um ein einfaches Anführungszeichen in eine Zeichenkette mit einfachen Anführungszeichen einzufügen, verdoppeln Sie das Anführungszeichen. So würde beispielsweise "Hello''There" in "Hello'There" umgewandelt. Beachten Sie, dass diese Tabelle auch das NUL-Zeichen erwähnt. Da PowerShell den .NET-Stringtyp verwendet, kann er eingebettete NUL-Zeichen enthalten. Anders als in der Sprache C führt das Hinzufügen eines NUL-Zeichens nicht zu einem vorzeitigen Abbruch der Zeichenfolge.

Da alle Werte .NET-Typen sind, können wir Methoden aufrufen und auf Eigenschaften eines Objekts zugreifen. Im Folgenden wird beispielsweise die Methode ToCharArray für eine Zeichenfolge aufgerufen, um sie in ein Array aus einzelnen Zeichen zu konvertieren:

PS> "Hallo".ToCharArray()

H

e

l

l

o

Wir können PowerShell verwenden, um fast jeden .NET-Typ zu konstruieren. Der einfachste Weg, dies zu tun, besteht darin, für einen Wert eine Typumwandlung vorzunehmen, indem der .NET-Typ in eckigen Klammern angegeben wird. Beim Casting, der erzwungenen Typumwandlung, versucht PowerShell, einen geeigneten Konstruktor für den aufzurufenden Typ zu finden. Mit dem folgenden Befehl wird beispielsweise eine Zeichenfolge in ein System.Guid-Objekt konvertiert; PowerShell sucht einen Konstruktor, der eine Zeichenfolge akzeptiert, und ruft ihn auf:

PS> [System.Guid]"6c0a3a17-4459-4339-a3b6-1cdb1b3e8973"

Sie können einen Konstruktor auch explizit aufrufen, indem Sie für diesen Typ die Methode new aufrufen. Das vorherige Beispiel kann wie folgt umgeschrieben werden:

PS> [System.Guid]::new("6c0a3a17-4459-4339-a3b6-1cdb1b3e8973")

Diese Syntax lässt sich auch verwenden, um statische Methoden für den Typ aufzurufen. Im Folgenden wird beispielsweise die statische Methode NewGuid aufgerufen, um einen neuen globalen eindeutigen Bezeichner (GUID) zu erstellen:

PS> [System.Guid]::NewGuid()

Sie können neue Objekte erstellen, indem Sie den Befehl New-Object verwenden:

PS> New-Object -TypeName Guid -ArgumentList "6c0a3a17-4459-4339-a3b6-1cdb1b3e8973"

Dieses Beispiel entspricht dem Aufruf der statischen Funktion new.

1.3.2Befehle ausführen

Fast alle Befehle in PowerShell werden nach einem gemeinsamen Muster benannt: Sie bestehen aus einem Verb und einem Substantiv, die durch einen Bindestrich getrennt sind. Nehmen Sie zum Beispiel den Befehl Get-Item. Das Verb Get impliziert das Abrufen einer vorhandenen Ressource, während Item den Typ der zurückzugebenden Ressource angibt.

Jeder Befehl kann eine Liste von Parametern akzeptieren, die das Verhalten des Befehls steuern. Der Befehl Get-Item akzeptiert beispielsweise den Path-Parameter, der die abzurufende Ressource angibt, wie hier gezeigt:

PS> Get-Item -Path "C:\Windows"

Der Path-Parameter ist ein Positionsparameter. Das bedeutet, dass Sie den Namen des Parameters weglassen können und PowerShell bemüht sich, die beste Übereinstimmung auszuwählen. Der vorherige Befehl kann also auch wie folgt geschrieben werden:

PS> Get-Item "C:\Windows"

Wenn ein Parameter einen Zeichenfolgenwert annimmt und die Zeichenfolge keine Sonderzeichen oder Leerzeichen enthält, müssen Sie die Zeichenfolge nicht in Anführungszeichen setzen. Der Befehl Get-Item würde zum Beispiel auch mit dem folgenden Befehl funktionieren:

PS> Get-Item C:\Windows

Die Ausgabe eines einzelnen Befehls besteht aus null oder mehr Werten, die einfache oder komplexe Objekttypen sein können. Sie können die Ausgabe eines Befehls an einen anderen Befehl als Eingabe übergeben, indem Sie eine Pipeline verwenden, die durch das vertikale Balkenzeichen | dargestellt wird. Wir werden Beispiele für die Verwendung einer Pipeline sehen, wenn wir später in diesem Kapitel das Filtern, Gruppieren und Sortieren besprechen.

Sie können das Ergebnis eines gesamten Befehls oder einer Pipeline in einer Variablen erfassen und dann mit den Ergebnissen interagieren. Im Folgenden wird beispielsweise das Ergebnis des Befehls Get-Item in einer Variablen erfasst und danach die Eigenschaft FullName abgefragt:

Wenn Sie das Ergebnis nicht in einer Variablen speichern wollen, können Sie den Befehl in runde Klammern einfassen und direkt auf seine Eigenschaften und Methoden zugreifen:

PS> (Get-Item -Path "C:\Windows").FullName

C:\Windows

Die Länge einer Befehlszeile ist praktisch unbegrenzt. Sie sollten jedoch versuchen, lange Zeilen aufzuteilen, damit die Befehle besser lesbar sind. Die Shell teilt eine Zeile automatisch nach dem Pipe-Zeichen. Wenn Sie eine lange Zeile ohne Pipe-Symbol aufteilen müssen, können Sie das Backtick-Zeichen verwenden und dann eine neue Zeile beginnen. Der Backtick muss das letzte Zeichen in der Zeile sein, andernfalls tritt beim Parsen des Skripts ein Fehler auf.

1.3.3Befehle kennenlernen und Hilfe erhalten

Bei einer Standardinstallation von PowerShell stehen Hunderte von Befehlen zur Auswahl. Das bedeutet, dass es schwierig sein kann, einen Befehl für eine bestimmte Aufgabe zu finden, und selbst wenn Sie den Befehl finden, ist möglicherweise nicht klar, wie Sie ihn verwenden. Als Hilfe können Sie zwei eingebaute PowerShell-Befehle verwenden: Get-Command und Get-Help. Mit dem Befehl Get-Command können Sie alle Ihnen zur Verfügung stehenden Befehle auflisten. In seiner einfachsten Form können Sie ihn ohne Parameter ausführen, und es werden alle Befehle aus allen Modulen ausgegeben. Es ist jedoch wahrscheinlich sinnvoller, nach einem bestimmten Wort zu filtern, an dem Sie interessiert sind. Listing 1.4 listet zum Beispiel nur die Befehle auf, in deren Namen das Wort SecurityDescriptor vorkommt.

PS> Get-Command -Name *SecurityDescriptor*

CommandType Name Source

----------- ---- ------

Function Add-NtSecurityDescriptorControl NtObjectManager

Function Add-NtSecurityDescriptorDaclAce NtObjectManager

Function Clear-NtSecurityDescriptorDacl NtObjectManager

Function Clear-NtSecurityDescriptorSacl NtObjectManager

--gekürzt--

Listing 1.4Get-Commandzum Auflisten von Befehlen verwenden

Dieser Befehl verwendet eine Platzhaltersyntax, um nur Befehle aufzulisten, deren Namen das angegebene Wort enthalten. In der Wildcard-Syntax wird ein *-Zeichen verwendet, um ein beliebiges Zeichen oder eine beliebige Reihe von Zeichen darzustellen. Hier steht das * auf beiden Seiten von SecurityDescriptor, um anzuzeigen, dass davor oder danach beliebiger Text stehen kann.

Sie können auch die in einem Modul verfügbaren Befehle auflisten. In Listing 1.5 werden zum Beispiel nur die Befehle aufgelistet, die vom NtObjectManager-Modul exportiert werden und mit dem Verb Start beginnen.

PS> Get-Command -Module NtObjectManager -Name Start-*

CommandType Name Source

----------- ---- ------

Function Start-AccessibleScheduledTask NtObjectManager

Function Start-NtFileOplock NtObjectManager

Function Start-Win32ChildProcess NtObjectManager

Cmdlet Start-NtDebugWait NtObjectManager

Cmdlet Start-NtWait NtObjectManager

Listing 1.5Get-Commandzum Auflisten von Befehlen im ModulNtObjectManagerverwenden

Wenn Sie einen vielversprechenden Befehl gefunden haben, können Sie den Befehl Get-Help verwenden, um seine Parameter zu überprüfen und einige Anwendungsbeispiele zu erhalten. In Listing 1.6 nehmen wir den Befehl Start-NtWait aus Listing 1.5 und übergeben ihn an Get-Help.

PS> Get-Help Start-NtWait

NAME

Start-NtWait

ÜBERSICHT

Wait on one or more NT objects to become signaled.

SYNTAX

Start-NtWait [-Object] <NtObject[]> [-Alertable <SwitchParameter>]

[-Hour <int>] [-MilliSecond <long>] [-Minute <int>] [-Second <int>]

[-WaitAll <SwitchParameter>] [<CommonParameters>]

Start-NtWait [-Object] <NtObject[]> [-Alertable <SwitchParameter>]

[-Infinite <SwitchParameter>] [-WaitAll <SwitchParameter>]

[<CommonParameters>]

BESCHREIBUNG

This cmdlet allows you to issue a wait on one or more NT objects until they become signaled.

--gekürzt--

Listing 1.6Hilfe für den BefehlStart-NtWaitanzeigen

Standardmäßig gibt Get-Help den Namen des Befehls , eine kurze Übersicht , die Syntax des Befehls sowie eine ausführlichere Beschreibung aus. Im Abschnitt über die Befehlssyntax sehen Sie die verschiedenen möglichen Betriebsarten: in diesem Fall entweder die Angabe einer Zeit in Stunden, Minuten, Sekunden und/oder Millisekunden oder die Angabe von Infinite, um unbegrenzt zu warten.

Wenn ein Teil der Syntax in eckigen Klammern [] angegeben wird, bedeutet dies, dass er optional ist. Zum Beispiel ist der einzige erforderliche Parameter Object, der ein Array von NtObject-Werten annimmt. Selbst der Name dieses Parameters ist optional, da -Object in eckigen Klammern steht.

Weitere Informationen über einen Parameter erhalten Sie mit dem Parameter Parameter.Listing 1.7 ruft die Details für den Parameter Object ab.

PS> Get-Help Start-NtWait -Parameter Object

-Object <NtObject[]>

Specify a list of objects to wait on.

Erforderlich? True

Position? 0

Standardwert

Pipelineeingaben akzeptieren? true (ByValue)

Platzhalterzeichen akzeptieren? false

Listing 1.7MitParameterDetails über den ParameterObjectabfragen.

Sie können auch die Wildcard-Syntax verwenden, um eine Gruppe von ähnlichen Parameternamen auszuwählen. Wenn Sie zum Beispiel Obj* angeben, erhalten Sie Informationen über alle Parameter, deren Namen mit dem Präfix Obj beginnen.

Wenn Sie Verwendungsbeispiele für einen Befehl wünschen, verwenden Sie den Parameter Examples, wie in Listing 1.8 gezeigt.

Listing 1.8Anzeigen von Beispielen fürStart-NtWait

Jedes Beispiel sollte einen ein- oder zweizeiligen Ausschnitt aus einem PowerShell-Skript und eine Beschreibung seiner Funktion enthalten. Sie können auch die vollständige Hilfeausgabe für den Befehl anzeigen, indem Sie den Parameter Full angeben. Um diese Ausgabe in einem separaten Popup-Fenster anzuzeigen, verwenden Sie den Parameter ShowWindow. Versuchen Sie zum Beispiel, diesen Befehl auszuführen:

PS> Get-Help Start-NtWait -ShowWindow

Sie sollten das in Abbildung 1.1 gezeigte Dialogfeld sehen.

Abb. 1.1Ein Dialogfeld mit der Ausgabe vonGet-Helpunter Verwendung des ParametersShowWindow

Ein letztes Thema, das für Befehle erwähnt werden sollte, ist, dass Sie Aliasnamen oder alternative Namen für die Befehle einrichten können. So können Sie beispielsweise einen Alias verwenden, um die Eingabe von Befehlen abzukürzen. In PowerShell sind bereits viele Aliasnamen vordefiniert, und Sie können mit dem Befehl New-Alias eigene definieren. Zum Beispiel können wir dem Befehl Start-NtWait den Alias swt zuweisen, indem wir Folgendes tun:

PS> New-Alias -Name swt -Value Start-NtWait

Um eine Liste aller definierten Aliasse anzuzeigen, verwenden Sie den Befehl Get-Alias. Wir werden in diesem Buch die Verwendung von Aliassen vermeiden, da sie die Skripte schlechter lesbar machen, wenn Sie nicht wissen, wofür ein Alias steht.

1.3.4Funktionen definieren

Wie bei allen Programmiersprachen zahlt es sich auch in PowerShell aus, die Komplexität zu reduzieren. Eine Möglichkeit, die Komplexität zu reduzieren, besteht darin, allgemeinen Code in einer Funktion zusammenzufassen. Sobald eine Funktion definiert ist, kann das PowerShell-Skript die Funktion aufrufen und muss nicht denselben Code an mehreren Stellen wiederholen. Die grundlegende Funktionssyntax in PowerShell ist einfach; Listing 1.9 zeigt ein Beispiel.

Listing 1.9Definieren einer einfachen PowerShell-Funktion namensGet-NameValue

Die Syntax zum Definieren einer Funktion beginnt mit dem Schlüsselwort function, gefolgt vom Namen der zu definierenden Funktion. Es ist zwar nicht erforderlich, die standardmäßige PowerShell-Namenskonvention (Verb gefolgt von einem Substantiv) zu verwenden, aber es lohnt sich, dies zu tun, da es anderen Benutzern verdeutlicht, was Ihre Funktion tut.

Als Nächstes definieren Sie die benannten Parameter der Funktion. Wie Variablen werden auch Parameter durch einen Namen mit vorangestelltem $-Zeichen definiert, wie Sie in Listing 1.9 sehen können. In diesem Beispiel ist $Name eine Zeichenkette, aber der Parameter $Value kann einen beliebigen Wert vom Aufrufer annehmen. Die Angabe von benannten Parametern ist nicht erforderlich. Wenn kein param-Block enthalten ist, werden alle übergebenen Argumente in das Array $args gestellt. Der erste Parameter befindet sich in $args[0], der zweite in $args[1] und so weiter.

Der Hauptteil der Funktion Get-NameValue nimmt die Parameter und erstellt eine Zeichenfolge mithilfe der Zeichenfolgeninterpolation. Die Funktion gibt die Zeichenfolge mit dem Schlüsselwort return zurück, mit dem die Funktion auch sofort beendet wird. Sie können das Schlüsselwort return in diesem Fall weglassen, da PowerShell alle Werte zurückgibt, die nicht in Variablen erfasst wurden.

Nachdem wir die Funktion definiert haben, rufen wir sie auf. Sie können die Parameternamen explizit angeben. Wenn der Aufruf jedoch eindeutig ist, ist die Angabe der Parameternamen nicht erforderlich. Listing 1.9 zeigt beide Ansätze.

Wenn Sie einen kleinen Codeblock ausführen möchten, ohne eine Funktion zu definieren, können Sie einen Skriptblock erstellen. Ein Skriptblock besteht aus einer oder mehreren Anweisungen, die in geschweifte Klammern {} eingeschlossen sind. Dieser Block kann einer Variablen zugewiesen und bei Bedarf mit dem Befehl Invoke-Command oder dem Operator & ausgeführt werden, wie in Listing 1.10 gezeigt.

Listing 1.10Einen Skriptblock erstellen und ausführen

1.3.5Objekte anzeigen und manipulieren

Wenn Sie einen Befehl ausführen und die Ergebnisse nicht in einer Variablen erfassen, werden die Ergebnisse an die PowerShell-Konsole übergeben. Die Konsole verwendet ein Format, um die Ergebnisse entweder in einer Tabelle oder in einer Liste anzuzeigen (das Format wird je nach den in den Ergebnissen enthaltenen Objekttypen automatisch ausgewählt). Es ist auch möglich, benutzerdefinierte Formatierer anzugeben. Wenn Sie beispielsweise den integrierten Befehl Get-Process verwenden, um die Liste der laufenden Prozesse abzurufen, verwendet PowerShell einen benutzerdefinierten Formatierer, um die Einträge als Tabelle anzuzeigen, wie in Listing 1.11 gezeigt.

PS> Get-Process

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName

------- ------ ----- ----- ------ -- -- -----------

476 27 25896 32044 2.97 3352 1 ApplicationFrameHost

623 18 25096 18524 529.95 19424 0 audiodg

170 8 6680 5296 0.08 5192 1 bash

557 31 23888 332 0.59 10784 1 Calculator

--gekürzt--

Listing 1.11Prozessliste als Tabelle ausgeben

Wenn Sie die Anzahl der Spalten in der Ausgabe reduzieren möchten, können Sie den Befehl Select-Object verwenden, um nur die benötigten Eigenschaften auszuwählen. In Listing 1.12 werden beispielsweise nur die Eigenschaften Id und ProcessName ausgewählt und angezeigt.

PS> Get-Process | Select-Object Id, ProcessName

Id ProcessName

-- -----------

3352 ApplicationFrameHost

19424 audiodg

5192 Bash

10784 Calculator

--gekürzt--

Listing 1.12Nur die EigenschaftenIdundProcessNameauswählen

Sie können das Standardverhalten der Ausgabe ändern, indem Sie die Befehle Format-Table oder Format-List verwenden, die eine Tabellen- bzw. Listenformatierung erzwingen. Listing 1.13 zeigt exemplarisch, wie Sie mit dem Befehl Format-List die Ausgabe als Liste anzeigen können.

PS> Get-Process | Format-List

Id : 3352

Handles : 476

CPU : 2.96875

SI : 1

Name : ApplicationFrameHost

--gekürzt--

Listing 1.13Verwendung vonFormat-Listzur Anzeige von Prozessen in einer Listenansicht

Um die Namen der verfügbaren Eigenschaften zu finden, können Sie auf eines der von Get-Process zurückgegebenen Objekte den Befehl Get-Member anwenden. In Listing 1.14 sind beispielsweise die Eigenschaften des Process-Objekts aufgeführt.

PS> Get-Process | Get-Member -Type Property

TypeName: System.Diagnostics.Process

Name MemberType Definition

---- ---------- ----------

BasePriority Property int BasePriority {get;}

Container Property System.ComponentModel.IContainer Container {get;}

EnableRaisingEvents Property bool EnableRaisingEvents {get;set;}

ExitCode Property int ExitCode {get;}

ExitTime Property datetime ExitTime {get;}

--gekürzt--

Listing 1.14Den BefehlGet-Memberzum Auflisten von Eigenschaften des ObjektsProcessverwenden

Möglicherweise werden Sie feststellen, dass es weitere Eigenschaften gibt, die in der Ausgabe nicht enthalten sind. Um sie anzuzeigen, müssen Sie die benutzerdefinierte Formatierung außer Kraft setzen. Der einfachste Weg, auf die verborgenen Eigenschaften zuzugreifen, ist die Verwendung von Select-Object, um die Werte explizit zu extrahieren, oder die Angabe der anzuzeigenden Eigenschaften im Befehl Format-Table oder Format-List. Sie können * als Platzhalter verwenden, um alle Eigenschaften anzuzeigen, wie in Listing 1.15 zu sehen.

PS> Get-Process | Format-List *

Name : ApplicationFrameHost

Id : 3352

PriorityClass : Normal

FileVersion : 10.0.18362.1 (WinBuild.160101.0800)

HandleCount : 476

WorkingSet : 32968704

PagedMemorySize : 26517504

--gekürzt--

Listing 1.15Alle Eigenschaften desProcess-Objekts in einer Liste anzeigen

Viele Objekte besitzen außerdem Methoden, die Sie aufrufen können, um eine Aktion mit dem Objekt durchzuführen. Listing 1.16 zeigt, wie Sie Get-Member verwenden können, um nach Methoden zu suchen.

PS> Get-Process | Get-Member -Typ Method

TypName: System.Diagnostics.Process

Name MemberType Definition

---- ---------- ----------

BeginErrorReadLine Method void BeginErrorReadLine()

BeginOutputReadLine Method void BeginOutputReadLine()

CancelErrorRead Method void CancelErrorRead()

CancelOutputRead Method void CancelOutputRead()

Close Method void Close()

--gekürzt--

Listing 1.16Die Methoden einesProcess-Objekts anzeigen

Wenn die Ausgabe eines Befehls zu lang ist, um auf den Bildschirm zu passen, können Sie die Ausgabe seitenweise anzeigen lassen, sodass nur der erste Teil angezeigt wird, und die Konsole wartet, bis Sie eine Taste drücken, bevor sie weitere Informationen anzeigt. Sie können das Paging aktivieren, indem Sie die Ausgabe über die Pipeline an den Befehl Out-Host weiterleiten und den Parameter Paging angeben oder indem Sie den Befehl more verwenden. Listing 1.17 zeigt ein Beispiel.

PS> Get-Process | Out-Host -Paging

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName

------- ------ ----- ----- ------ -- -- -----------

476 27 25896 32044 2.97 3352 1 ApplicationFrameHost

623 18 25096 18524 529.95 19424 0 audiodg

170 8 6680 5296 0.08 5192 1 bash

557 31 23888 332 0.59 10784 1 Calculator

--gekürzt--

<SPACE> Nächste Seite, <CR> Nächste Zeile, Q Beenden

Listing 1.17Seitenweise Ausgabe mit Out-Host

Sie können direkt in das Konsolenfenster schreiben, indem Sie den Befehl Write-Host in Ihren eigenen Skripten verwenden. Hiermit können Sie die Farben der Ausgabe nach Ihrem Geschmack ändern, indem Sie die Parameter ForegroundColor und BackgroundColor verwenden. Dies hat auch den Vorteil, dass sie standardmäßig keine Objekte in die Pipeline einfügt, wie hier gezeigt:

Das bedeutet, dass Sie die Ausgabe standardmäßig nicht in eine Datei oder in eine Pipeline umleiten können. Sie können jedoch die Host-Ausgabe umleiten, indem Sie ihren Stream mit einem Befehl wie dem folgenden in den Standardausgabestream umleiten:

PowerShell unterstützt auch eine einfache grafische Benutzeroberfläche zum Anzeigen von Tabellen mit Objekten. Um darauf zuzugreifen, verwenden Sie den Befehl Out-GridView. Beachten Sie, dass die benutzerdefinierte Formatierung weiterhin einschränkt, welche Spalten PowerShell anzeigt. Wenn Sie andere Spalten anzeigen möchten, verwenden Sie Select-Object in der Pipeline, um die Eigenschaften auszuwählen. Im folgenden Beispiel werden alle Eigenschaften in der Tabellenansicht angezeigt:

PS> Get-Process | Select-Object * | Out-GridView

Wenn Sie diesen Befehl ausführen, sollte ein Dialogfeld wie das in Abbildung 1.2 erscheinen.

Abb. 1.2Anzeige von Prozessobjekten in einer Rasteransicht

Sie können die Daten in der grafischen Benutzeroberfläche der Rasteransicht filtern und manipulieren. Versuchen Sie, mit den Steuerelementen herumzuspielen. Sie können für Out-GridView auch den Parameter PassThru angeben, sodass der Befehl darauf wartet, dass Sie in der grafischen Benutzeroberfläche auf die Schaltfläche OK klicken. Alle Zeilen in der Ansicht, die ausgewählt sind, wenn Sie auf OK klicken, werden in die Befehlspipeline geschrieben.

1.3.6Objekte filtern, sortieren und gruppieren

Eine herkömmliche Shell übergibt Rohtext zwischen Befehlen; PowerShell hingegen übergibt Objekte. Durch die Übergabe von Objekten können Sie auf einzelne Eigenschaften der Objekte zugreifen und die Pipeline einfach filtern. Sie können die Objekte sogar problemlos sortieren und gruppieren.

Sie können Objekte mit dem Befehl Where-Object filtern, der die Aliasnamen Where und ? hat. Der einfachste Filter besteht darin, nach dem Wert eines Parameters zu suchen, wie in Listing 1.18 gezeigt, wo wir die Ausgabe des integrierten Befehls Get-Process filtern, um den Explorer-Prozess zu finden.

PS> Get-Process | Where-Object ProcessName -EQ "explorer"

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName

------- ------ ----- ----- ------ -- -- -----------

2792 130 118152 158144 624.83 6584 1 explorer

Listing 1.18Filtern einer Liste von Prozessen mitWhere-Object

In Listing 1.18 lassen wir nur Process-Objekte durch, deren ProcessName gleich (-EQ) "explorer" lautet. Es gibt zahlreiche Operatoren, die Sie zum Filtern verwenden können, einige davon sind in Tabelle 1.4 aufgeführt.

Operator

Beispiel

Beschreibung

-EQ

Processname -EQ "explorer"

Gleich dem Wert

-NE

Processname -NE "explorer"

Ungleich dem Wert

-Match

ProcessName -Match "ex.*"

Gleicht eine Zeichenfolge mit einem regulären Ausdruck ab

-NotMatch

ProcessName -NotMatch "ex.*"

Umkehrung des Operators -Match

-Like

ProcessName -Like "ex*"

Gleicht eine Zeichenkette mit einem Platzhalter ab

-NotLike

ProcessName -NotLike "ex*"

Umkehrung des Operators -Like

-GT

ProcessName -GT "ex"

Größer-als-Vergleich

-LT

ProcessName -LT "ex"

Kleiner-als-Vergleich

Tab. 1.4Maskierungszeichen für Zeichenfolgen

Sie können alle unterstützten Operatoren untersuchen, indem Sie Get-Help für den Befehl Where-Object verwenden. Wenn die Bedingung, nach der gefiltert werden soll, komplexer ist als ein einfacher Vergleich, können Sie einen Skriptblock verwenden. Der Skriptblock sollte True zurückgeben, um das Objekt in der Pipeline zu behalten, oder False, um es zu filtern. Sie könnten Listing 1.18 zum Beispiel auch wie folgt schreiben:

PS> Get-Process | Where-Object { $_.ProcessName -eq "explorer" }

Die an den Skriptblock übergebene Variable $_ steht für das aktuelle Objekt in der Pipeline. Durch die Verwendung eines Skriptblocks können Sie beim Filtern auf alle Features der Sprache zugreifen, einschließlich des Aufrufs von Funktionen.

Um Objekte zu sortieren, verwenden Sie den Befehl Sort-Object. Wenn die Objekte sortiert werden können, wie im Fall von Zeichenfolgen oder Zahlen, müssen Sie die Objekte nur über die Pipeline in den Befehl eingeben. Andernfalls müssen Sie eine Eigenschaft angeben, nach der sortiert werden soll. Sie können die Prozessliste beispielsweise nach der Anzahl der Handles sortieren, die durch die Eigenschaft Handles dargestellt wird, wie in Listing 1.19 gezeigt.

PS> Get-Process | Sort-Object Handles

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName

------- ------ ----- ----- ------ -- -- -----------

0 0 60 8 0 0 Idle

32 9 4436 6396 1032 1 fontdrvhost

53 3 1148 1080 496 0 smss

59 5 804 1764 908 0 LsaIso

--gekürzt--

Listing 1.19Prozesse nach der Anzahl der Handles sortieren

Um in absteigender statt in aufsteigender Reihenfolge zu sortieren, verwenden Sie den Parameter -Descending wie in Listing 1.20 gezeigt.

PS> Get-Process | Sort-Object Handles -Descending

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName

------- ------ ----- ----- ------ -- -- -----------

5143 0 244 15916 4 0 System

2837 130 116844 156356 634.72 6584 1 explorer

1461 21 11484 16384 1116 0 svchost

1397 52 55448 2180 12.80 12452 1 Microsoft.Photos

Listing 1.20Prozesse nach der Anzahl der Handles in absteigender Reihenfolge sortieren

Es ist auch möglich, in diesem Stadium doppelte Einträge herauszufiltern, indem an Sort-Object der Parameter Unique übergeben wird.

Schließlich können Sie mit dem Befehl Group-Object Objekte auf der Grundlage eines Eigenschaftsnamens gruppieren. Listing 1.21 zeigt, dass dieser Befehl eine Liste von Objekten zurückgibt, die jeweils die Eigenschaften Count, Name und Group aufweisen.

PS> Get-Process | Group-Object ProcessName

Count Name Group

----- ---- -----

1 ApplicationFrameHost {System.Diagnostics.Process (ApplicationFrameHost)}

1 calculator {System.Diagnostics.Process (calculator)}

11 conhost {System.Diagnostics.Process (conhost)...}

--gekürzt--

Listing 1.21Gruppierung von Prozessobjekten nach Prozessname gruppieren

Alternativ können Sie alle diese Befehle zusammen in einer Pipeline verwenden, wie in Listing 1.22 gezeigt.

PS> Get-Process | Group-Object ProcessName |

Where-Object Count -GT 10 | Sort-Object Count

Count Name Group

----- ---- -----

11 conhost {System.Diagnostics.Process (conhost),...}

83 svchost {System.Diagnostics.Process (svchost),...}

Listing 1.22Kombinieren vonWhere-Object, Group-ObjectundSort-Object

1.3.7Daten exportieren

Sobald Sie den perfekten Satz von Objekten gefunden haben, die Sie untersuchen möchten, möchten Sie diese Informationen möglicherweise in einer Datei auf der Festplatte speichern. PowerShell bietet hierfür zahlreiche Optionen, von denen ich hier einige erläutern möchte. Die erste Option besteht darin, die Objekte mit Out-File als Text in eine Datei auszugeben. Dieser Befehl erfasst die formatierte Textausgabe und schreibt sie in eine Datei. Sie können Get-Content verwenden, um die Datei wieder einzulesen, wie in Listing 1.23 gezeigt.

PS> Get-Process | Out-File processes.txt

PS> Get-Content processes.txt

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName

------- ------ ----- ----- ------ -- -- -----------

476 27 25896 32044 2.97 3352 1 ApplicationFrameHost

623 18 25096 18524 529.95 19424 0 audiodg

170 8 6680 5296 0.08 5192 1 bash

557 31 23888 332 0.59 10784 1 Calculator

--gekürzt--

Listing 1.23Inhalt in eine Textdatei schreiben und wieder einlesen

Sie können auch das Größer-als-Zeichen verwenden, um die Ausgabe in eine Datei zu senden, wie in anderen Shells. Hier ein Beispiel:

PS> Get-Process > processes.txt

Wenn Sie ein strukturierteres Format wünschen, können Sie das Objekt mit Export-Csv in ein Tabellenformat mit kommagetrennten Werten (CSV, comma-separated values) konvertieren. Diese Datei können Sie dann in ein Tabellenkalkulationsprogramm importieren, um sie offline zu analysieren. Das Beispiel in Listing 1.24 wählt einige Eigenschaften des Objekts Process aus und exportiert sie in die CSV-Datei processes.csv.

PS> Get-Process | Select-Object Id, ProcessName |

Export-Csv processes.csv -NoTypeInformation

PS> Get-Content processes.csv

"Id","ProcessName"

"3352","ApplicationFrameHost"

"19424","audiodg"

"5192","bash"

"10784","Calculator"

--gekürzt--

Listing 1.24Objekte in eine CSV-Datei exportieren

Es ist möglich, die CSV-Daten mit dem Befehl Import-Csv wieder zu importieren. Wenn Sie jedoch vorhaben, die Daten zu exportieren und später wieder zu importieren, werden Sie wahrscheinlich das CLI-XML-Format bevorzugen. Dieses Format kann die Struktur und den Typ des ursprünglichen Objekts enthalten, sodass Sie es beim Importieren der Daten rekonstruieren können. Listing 1.25 zeigt, wie Sie die Befehle Export-CliXml und Import-CliXml verwenden können, um Objekte in diesem Format zu exportieren und anschließend wieder zu importieren.

Listing 1.25Exportieren und Reimportieren von CLI-XML-Dateien

Damit geht diese kurze Einführung in die PowerShell-Sprache zu Ende. Wenn PowerShell nicht mehr richtig präsent ist, empfehle ich Ihnen ein gutes Buch zu diesem Thema, zum Beispiel PowerShell for Sysadmins von Adam Bertram (No Starch Press, 2020) oder Windows PowerShell von Tobias Weltner (O’Reilly, 2022).

1.4Zusammenfassung

Dieses Kapitel gab einen kurzen Überblick darüber, wie Sie Ihre PowerShell-Umgebung so einrichten, dass Sie die im Buch enthaltenen Codebeispiele ausführen können. Wir haben die Konfiguration von PowerShell zur Ausführung von Skripten und die Installation des erforderlichen externen PowerShell-Moduls besprochen.

Der Rest des Kapitels vermittelte ein wenig Hintergrundwissen über die PowerShell-Sprache. Dazu gehörten die Grundlagen der PowerShell-Syntax sowie das Auffinden von Befehlen mit Get-Command, das Abrufen von Hilfe mit Get-Help und das Anzeigen, Filtern, Gruppieren und Exportieren von PowerShell-Objekten.

Nachdem die Grundlagen der PowerShell geklärt sind, können wir nun in das Innenleben des Windows-Betriebssystems eintauchen. Im nächsten Kapitel werden wir den Windows-Kernel besprechen und zeigen, wie Sie mithilfe der PowerShell mit dem Kernel interagieren können.

2Der Windows-Kernel

Windows ist ein sicheres Mehrbenutzer-Betriebssystem. Gleichzeitig ist es jedoch auch eines der modernen Betriebssysteme, deren Details sehr schwierig zu verstehen sind. Bevor wir uns in die Feinheiten der Sicherheit vertiefen, werde ich Ihnen in diesem Teil des Buches einen Überblick über die Struktur des Windows-Betriebssystems geben. Bei dieser Gelegenheit werden wir uns auch die Verwendung des PowerShell-Moduls ansehen, das den Kern dieses Buches bildet.