Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. Druckvorgang starten.

Zur Standardansicht zurückkehren.

About this documentation

Dies ist die offizielle Dokumentationsseite für DNSServer.DebugLogParser, ein PowerShell-Modul, das Windows DNS Server Debug-Logdateien in strukturierte, analysierbare CSV-Daten umwandelt.

Das Modul wird von Andreas Bellstedt (Andi) entwickelt und gepflegt, einem IT-Experten mit über 20 Jahren Erfahrung in Unternehmensumgebungen. Sein stärkster Fokus liegt auf Identity & Access Management und Automatisierung, mit PowerShell im Zentrum seiner täglichen Arbeit.

Über das Modul

DNSServer.DebugLogParser entstand aus einem realen Bedarf: Windows DNS Server Debug-Logs sind menschenlesbar, aber nicht für Analysen oder Berichte geeignet. Dieses Modul schließt diese Lücke, indem es Roh-Logdateien in strukturiertes CSV-Format konvertiert, das sich in gängige Tools wie Excel, Power BI, SQL-Datenbanken und SIEM-Systeme integriert.

Zentrale Designprinzipien:

  • Performance zuerst — optimiert für 100MB+ Dateien mit Streaming-I/O und String-Operationen
  • Editionsübergreifende Kompatibilität — unterstützt PowerShell Desktop (5.1+) und Core (7.x)
  • Produktionsbereit — mit Header-Validierung, Fehlerbehandlung und optionaler Komprimierung
  • Pipeline-freundlich — integriert sich natürlich in die Pipeline-Architektur von PowerShell

Ressourcen

Mitwirken

Beiträge sind willkommen. Wenn Sie Fehler finden oder Verbesserungsvorschläge haben, öffnen Sie bitte ein Issue oder einen Pull Request auf dem GitHub-Repository.

1 - Übersicht

DNSServer.DebugLogParser ist ein PowerShell-Modul, das Windows DNS-Server-Debugprotokolldateien in strukturierte, analysierbare CSV-Daten für Sicherheitsanalysen, Leistungsüberwachung, Fehlerbehebung und Compliance-Berichte umwandelt.

Was ist ein DNS-Debugprotokoll?

DNS-Debug-Logging ist eine Funktion des Windows DNS-Servers, die detaillierte Informationen über DNS-Vorgänge aufzeichnet. Wenn aktiviert, schreibt der DNS-Server Protokolleinträge in eine Textdatei (typischerweise dns.log) im Verzeichnis des DNS-Servers.

Jeder Protokolleintrag enthält bis zu 16 Felder, darunter:

  • Datum und Uhrzeit der Abfrage
  • Verwendetes Protokoll (UDP oder TCP)
  • Richtung (Senden oder Empfangen)
  • Client-IP-Adresse
  • Abfragetyp (A, AAAA, MX, PTR usw.)
  • Abgefragter Domainname
  • Antwortcode (NOERROR, NXDOMAIN usw.)
  • Abfrageflags und Optionen
  • IP-Adresse in der Antwort (bei erfolgreichen Abfragen)
  • Portnummern und weitere technische Details

Warum DNS-Debugprotokolle parsen?

DNS-Protokolle sind entscheidend für:

Fehlerbehebung

  • Diagnose von Namensauflösungsfehlern
  • Identifikation falsch konfigurierter Clients oder Anwendungen
  • Auffinden der Quelle problematischer Abfragen
  • Überprüfung der korrekten DNS-Konfiguration und Zonentransfers

Leistungsüberwachung

  • Erkennung von Quellen mit hohem Abfragevolumen
  • Analyse von Abfragetypen und -mustern zur Optimierung der DNS-Infrastruktur
  • Erkennung von Konfigurationsproblemen, die zu übermäßigen Abfragen führen
  • Verfolgung von Antwortzeiten und Erfolgsraten
  • Überwachung der DNS-Server-Auslastung und Kapazität

Sicherheitsanalyse

  • Erkennung von DNS-Tunneling und Datenexfiltrationsversuchen
  • Identifikation von Domains, die mit Malware und Command-and-Control-Servern in Verbindung stehen
  • Verfolgung verdächtiger Abfragemuster, die auf kompromittierte Systeme hinweisen können
  • Überwachung von DNS-Amplifikationsangriffen
  • Untersuchung von Sicherheitsvorfällen und Nachverfolgung von Angreiferaktivitäten

Compliance und Auditing

  • Erfüllung regulatorischer Anforderungen an Protokollierung und Aufbewahrung
  • Dokumentation der Netzwerkaktivität für Prüfpfade
  • Erstellung von Berichten für Management und Compliance-Beauftragte
  • Nachweis der Sorgfaltspflicht bei der Sicherheitsüberwachung

Funktionsweise des Moduls (auf hoher Ebene)

Das Modul ist für große Dateien optimiert und verarbeitet DNS-Debugprotokolle zu strukturiertem CSV-Ausgabeformat. Es unterstützt mehrzeilige Einträge (z. B. PACKET-Detailblöcke und eingerückte Fortsetzungszeilen), sodass Ereignis-/Diagnosemeldungen und Paketdetails dem korrekten Eintrag zugeordnet bleiben.

Wichtige Funktionen:

  • Parst die nativen DNS-Debugprotokollfelder und erzeugt ein konsistentes CSV-Layout
  • Unterstützt mehrere DNS-Server-Versionen (2012 R2 bis 2025)
  • Funktioniert mit PowerShell Desktop (5.1+) und Core (7.x)
  • Verarbeitet Dateien beliebiger Größe (getestet mit über 100 MB großen Dateien)
  • Validiert Protokolldateikopfzeilen zur Sicherstellung der Datenintegrität
  • Erzeugt optionale statistische Zusammenfassungen
  • Unterstützt Batch-Verarbeitung über die PowerShell-Pipeline
  • Komprimiert Ausgabedateien optional zur Einsparung von Speicherplatz
  • Kann Quell-Dateien nach erfolgreicher Verarbeitung automatisch löschen
  • Kulturabhängige Datumsparsing für internationale DNS-Server-Protokolle
  • Kulturabhängige Datumsformatierung für internationale Ausgabeanforderungen

Lizenzierung und Support

Das Modul wird unter der MIT-Lizenz veröffentlicht. Community-Support ist über GitHub Issues verfügbar.

2 - Ausgabeformate

DNSServer.DebugLogParser kann zwei Arten von Ausgaben erzeugen:

  • Eine CSV-Datendatei mit allen geparsten Einträgen
  • Optionale Statistikdateien für die tägliche Aggregation

Um reale Beispiele für jeden Ausgabetyp zu sehen, schau dir das Beispiel in diesem Artikel an.

CSV-Datendatei

Beispiel-Ausgabedateien:

Die CSV-Datendatei enthält alle geparsten Logeinträge mit den folgenden Spalten:

  • DateTime: Datum und Uhrzeit der DNS-Anfrage/-Antwort
  • ThreadId: Interne DNS-Server-Thread-ID
  • Context: Betriebskontext (z. B. Packet, Event, Note, DSPoll, Init, Lookup, Recurse, Remote, Tombstone)
  • PacketId: DNS-Paket-ID
  • Protocol: UDP oder TCP
  • Direction: Rcv (empfangen/Anfrage) oder Snd (gesendet/Antwort)
  • ClientIP: Client-IP-Adresse
  • Xid: Transaktions-ID (Hex)
  • Type: Anfrage oder Antwort
  • Opcode: Standard, Notify, Update oder Unknown
  • FlagsHex: Anfrage-/Antwortflags (Hex)
  • FlagsChar: Flags dekodiert (Authoritative, Truncated, RecursionDesired, RecursionAvailable)
  • ResponseCode: NOERROR, NXDOMAIN, SERVFAIL, etc.
  • QuestionType: DNS-Datensatztyp (A, AAAA, MX, PTR, etc.)
  • QuestionName: Abgefragter Domainname
  • Information: Zusätzliche Informationen (für Event/Note/etc.; für Paket-Detailblöcke enthält es die TCP/UDP-Detail-Headerzeile)
  • Details: JSON-Daten für Paket-Einträge mit Detailblöcken (ansonsten leer)
  • ComputerName: Quellservername (immer vorhanden; leer, wenn nicht angegeben)

Hinweis: Die Spalte ComputerName ist immer am Ende jedes Eintrags enthalten, um eine konsistente Ausgabestruktur sicherzustellen. Das erleichtert Szenarien zur Konsolidierung von Logs mehrerer Server.

Statistikdateien (optional)

Beispiel-Ausgabedateien:

Wenn Statistiken erzeugt werden, entstehen zwei separate Dateien:

1) Kontextstatistiken (*_Statistic.csv)

Spalten:

  • Date: Datum (yyyy-MM-dd)
  • Context: Kontextname (z. B. Packet, Event, Note)
  • Count: Anzahl der Einträge
  • ComputerName: Quellservername

2) Paketstatistiken (*_PacketStatistic.csv)

Spalten:

  • Date: Datum (yyyy-MM-dd)
  • ClientIP: Client-IP-Adresse
  • Protocol: UDP oder TCP
  • Direction: Rcv oder Snd
  • QuestionType: DNS-Datensatztyp
  • Count: Anzahl der Einträge
  • ComputerName: Quellservername

3 - Operative Best Practices

Bei der Verwendung von DNSServer.DebugLogParser in der Produktion:

  1. Regelmäßige Verarbeitung planen

    • Nutze den Taskplaner, um neue Protokolldateien täglich oder wöchentlich automatisch zu konvertieren.
  2. Protokolle angemessen rotieren

    • DNS-Debug-Protokolle können schnell wachsen; konfiguriere die Rotation bei einer handhabbaren Größe (z. B. 100 MB).
  3. Ausgabe validieren

    • Überprüfe die ersten konvertierten Dateien, bevor du die Automatisierung vollständig einsetzt.
  4. Speicherbedarf planen

    • Selbst mit Kompression solltest du den Speicherbedarf basierend auf DNS-Volumen und Aufbewahrungszeit planen.
  5. Sensible Daten sichern

    • DNS-Protokolle können sensible Informationen enthalten; schütze die Ausgaben mit geeigneten Zugriffskontrollen.
  6. Deinen Workflow dokumentieren

    • Dokumentiere Verarbeitungspläne, Speicherorte und die Nutzung der Analyse.
  7. Mit Beispieldateien testen

    • Validere Parameter und Ausgabeformat, bevor du kritische Protokolle verarbeitest.
  8. Auf Fehler überwachen

    • Achte auf beschädigte Protokolle, Zugriffsprobleme oder unzureichenden Speicherplatz.

4 - Fehlerbehebung

Häufige Probleme und Lösungen

„Die Datei ist keine gültige DNS-Debug-Logdatei“

  • Stelle sicher, dass du eine tatsächliche Debug-Logdatei des DNS-Servers konvertierst.
  • Die Datei sollte mit Message logging started at beginnen oder DNS-Abfrageeinträge enthalten.
  • Wenn du sicher bist, dass die Datei gültig ist, der Header aber abweicht, verwende -SkipHeaderValidation.

Ausgabedatei ist leer oder unvollständig

  • Überprüfe, ob die Eingabedatei gültige Logeinträge enthält.
  • Manche Logs enthalten nur Header-Informationen, wenn keine Abfragen stattgefunden haben.
  • Vergewissere dich, dass die Logdatei nicht beschädigt ist und tatsächliche Abfragedaten enthält.

Verarbeitung ist sehr langsam

  • Stelle sicher, dass genügend Arbeitsspeicher vorhanden ist und die Festplatte nicht stark ausgelastet ist.
  • Ziehe in Betracht, kleinere Logdateien zu verarbeiten.
  • Nutze -CompressOutput mit geplanter Verarbeitung, um kleinere Chargen zu verarbeiten.

„Zugriff verweigert“-Fehler

  • Starte PowerShell mit den erforderlichen Berechtigungen, um die Quell-Logdateien zu lesen und in das Zielverzeichnis zu schreiben.
  • DNS-Logdateien erfordern möglicherweise Administratorrechte.

Komprimierte Ausgabe ist größer als erwartet

  • Logs mit vielen einzigartigen Werten komprimieren sich weniger effizient; das kann normal sein.
  • ZIP-Kompression erzielt dennoch meist eine deutliche Reduzierung.

Statistikdatei entspricht nicht den Erwartungen

  • Überprüfe, ob du -OutputType Both oder -OutputType Statistic verwendest.
  • Statistiken sind aggregierte Zählwerte (tägliche Gruppierungen), daher stellen die Werte Gesamtsummen dar.

Probleme melden

Wenn du auf Probleme stößt, die hier nicht behandelt werden:

  1. Vergewissere dich, dass du die neueste Version des Moduls verwendest.
  2. Prüfe die GitHub Issues auf ähnliche Probleme.
  3. Sammle Diagnosedaten:
    • PowerShell-Version ($PSVersionTable)
    • Modulversion (Get-Module DNSServer.DebugLogParser)
    • Beispiel-Logdatei (wenn möglich)
    • Vollständige Fehlermeldung und Stacktrace
  4. Erstelle ein neues GitHub Issue mit den Details.

5 - Modulbefehle Referenz

Hier findest du eine Referenz für alle Befehle im Modul. Diese Referenz soll dir helfen, schnell den benötigten Befehl zu finden und zu verstehen, wie du ihn effektiv einsetzt.

Wenn du auf einen Befehl klickst, gelangst du zu einer Detailseite, die umfassende Informationen zum Befehl bietet, einschließlich Syntax, Parameter, Beispiele sowie zusätzliche Hinweise oder Tipps zur Verwendung.

5.1 - Convert-DNSDebugLogFile

SYNOPSIS

Wandelt Windows DNS-Server-Debugprotokolle in ein strukturiertes CSV-Format zur Analyse und Berichterstellung um.

SYNTAX

__AllParameterSets

Convert-DNSDebugLogFile [-InputFile] <string[]> [[-OutputFile] <string>] [[-Delimiter] <string>]
 [[-ComputerName] <string>] [[-OutputType] <string>] [[-ContextFilter] <string[]>]
 [[-InputCulture] <cultureinfo>] [[-OutputCulture] <cultureinfo>] [-SkipHeaderValidation]
 [-RemoveSourceFile] [-CompressOutput] [-NoDetailsParsing] [-WhatIf] [-Confirm] [<CommonParameters>]

ALIASES

Dieses Cmdlet hat die folgenden Aliase,

BESCHREIBUNG

Konvertiert Windows DNS-Server-Debugprotokolldateien in strukturierte CSV-Daten, die in Excel, Power BI, SQL-Datenbanken oder SIEM-Tools analysiert werden können. Entwickelt für Sicherheitsanalysen, Leistungsüberwachung, Fehlerbehebung und Compliance-Berichterstattung.

Das Cmdlet analysiert DNS-Debugprotokolle und schreibt eine konsistente CSV-Ausgabe zur Analyse. Die CSV-Ausgabe enthält 18 Spalten, darunter eine Information-Spalte für Ereignis-/Diagnosetext, eine optionale Details-JSON-Spalte für Paket-Detailblöcke und eine immer vorhandene ComputerName-Spalte (leer, sofern nicht angegeben).

WICHTIGE FUNKTIONEN:

  • Hochleistungsfähige Analyse, optimiert für große Dateien (100 MB+)
  • Anpassbarer CSV-Trennzeichen (Standard: Semikolon)
  • Optionale statistische Zusammenfassungen mit aggregierten Metriken
  • Kontextfilterung (Packet, Event, Note und weitere Kontexte) zur Fokussierung auf bestimmte Protokolleintragstypen
  • Kulturabhängige Datumsanalyse und -formatierung für internationale Server
  • Pipeline-Unterstützung für die Stapelverarbeitung mehrerer Dateien
  • Optionale Komprimierung der Ausgabedateien (ZIP-Format)
  • Optionale automatische Entfernung der Quelldateien nach der Verarbeitung
  • Kopfzeilenvalidierung zur Sicherstellung der Datenintegrität

AUSGABEFORMAT: Die Spalte ComputerName ist immer am Ende jedes Datensatzes enthalten. Wenn der Parameter -ComputerName nicht angegeben wird, bleibt die Spalte leer. Dies gewährleistet eine konsistente Ausgabestruktur für Multi-Server-Konsolidierungsszenarien.

LEISTUNG: Optimiert durch Verwendung von StreamReader/StreamWriter mit 64 KB Puffern, String-Operationen statt Regex, manueller CSV-Erzeugung und effizienter Hashtable-basierter Statistik-Erfassung.

KOMPATIBILITÄT:

  • PowerShell 5.1+ (Desktop- und Core-Editionen)
  • Windows Server 2016+
  • DNS-Server 2012 R2 bis 2025 Logformate

BEISPIELE

BEISPIEL 1

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log"

Konvertiert das DNS-Debugprotokoll mit Standardeinstellungen (Daten- und Statistikdateien mit Semikolon-Trennzeichen).
Ausgabe:

  • C:\Logs\dns.csv
  • C:\Logs\dns_Statistic.csv
  • C:\Logs\dns_PacketStatistic.csv

BEISPIEL 2

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputType CSV

Erzeugt nur die Datendatei ohne Statistiken.
Ausgabe: C:\Logs\dns.csv

BEISPIEL 3

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputType Statistic

Erzeugt nur die Statistikdateien mit aggregierten Metriken.
Ausgabe:

  • C:\Logs\dns_Statistic.csv
  • C:\Logs\dns_PacketStatistic.csv

BEISPIEL 4

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputFile "C:\Output\parsed.csv"

Konvertiert das Protokoll an einen benutzerdefinierten Speicherort.
Ausgabe: C:\Output\parsed.csv

BEISPIEL 5

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -Delimiter "," -ComputerName "DNS01" -OutputType Both

Konvertiert mit Komma als Trennzeichen und fügt die Spalte ComputerName mit dem Wert “DNS01” hinzu.
Ausgabe:

  • C:\Logs\dns.csv
  • C:\Logs\dns_Statistic.csv
  • C:\Logs\dns_PacketStatistic.csv

BEISPIEL 6

PS C:\> Get-ChildItem "C:\Logs\*.log" | Convert-DNSDebugLogFile -OutputType Both

Batch-Verarbeitung mehrerer DNS-Debugprotokolldateien über die Pipeline.
Ausgabe: Für jede .log-Datei werden .csv- und _statistic.csv-Dateien erzeugt.

BEISPIEL 7

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput

Konvertiert und komprimiert die Ausgabe in ein ZIP-Archiv.
Ausgabe: C:\Logs\dns.zip (enthält dns.csv + Statistikdateien)

BEISPIEL 8

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -RemoveSourceFile -Verbose

Konvertiert das Protokoll und entfernt die Quelldatei nach erfolgreicher Verarbeitung.
Ausführliche Ausgabe bestätigt die Dateientfernung.

BEISPIEL 9

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE' -OutputCulture 'en-US'

Parst deutsches Datumsformat (TT.MM.JJJJ) und gibt im US-Format (MM/TT/JJJJ) aus.
Verwende dies bei der Verarbeitung von Protokollen von Servern mit unterschiedlichen Regionaleinstellungen.

BEISPIEL 10

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter 'Packet'

Konvertiert nur DNS-Abfrage-/Antwortpakete, schließt EVENT- und Note-Einträge aus.
Verwende dies, um die Analyse auf den tatsächlichen DNS-Verkehr zu fokussieren.

BEISPIEL 11

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter 'Packet','Event'

Konvertiert sowohl DNS-Abfrage-/Antwortpakete als auch Serverereignisse, schließt Note- und andere Einträge aus.
Verwende dies, um DNS-Verkehr zusammen mit Serverereigniskontext zu analysieren.

BEISPIEL 12

PS C:\> Get-ChildItem "C:\Logs\*.log" | Convert-DNSDebugLogFile -RemoveSourceFile -CompressOutput

Automatisierte Protokollarchivierung: verarbeitet alle Protokolle, komprimiert die Ausgabe und entfernt Quelldateien.
Ideal für geplante Protokollverarbeitungspipelines.

BEISPIEL 13

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\large-dns.log" -NoDetailsParsing

Verarbeitet eine große Protokolldatei mit deaktivierter Detailanalyse für maximale Leistung.
PACKET-Detailblöcke werden übersprungen, die Details-Spalte bleibt leer.
Verwende dies bei sehr großen Dateien, wenn die detaillierte Paketstruktur nicht benötigt wird.

PARAMETER

-CompressOutput

Komprimiert die Ausgabedateien im CSV-Format nach der Erstellung in ein ZIP-Archiv.

Erstellt eine .zip-Datei, die die generierten CSV-Dateien enthält, und entfernt anschließend die unkomprimierten CSV(s).
Die ZIP-Datei wird im selben Verzeichnis wie die Ausgabedatei mit demselben Basisnamen erstellt.

Vorteile:

  • Reduziert den Speicherplatzbedarf erheblich (CSV-Dateien komprimieren sich typischerweise um 90 % oder mehr)
  • Vereinfacht Dateiverwaltung und Archivierung
  • Geeignet für die Langzeitarchivierung

Beispiel: Die Eingabedatei ‘dns.log’ erzeugt ‘dns.csv’, die zu ‘dns.zip’ komprimiert wird, danach wird ‘dns.csv’ entfernt.

Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-ComputerName

Legt den Wert für die Spalte ComputerName in der CSV-Ausgabe fest.
Die Spalte ComputerName ist immer in der Ausgabe enthalten – wenn dieser Parameter nicht angegeben wird, bleibt die Spalte leer.

Verwende dies bei der Konsolidierung von Protokollen mehrerer DNS-Server, um den Quellserver in kombinierten Datensätzen zu identifizieren.

Hinweis: Dies ist kein Remoting-Parameter.
Das Cmdlet verarbeitet nur lokale Dateien.

Type: String
DefaultValue: ''
SupportsWildcards: false
Aliases:
- Server
- DNSServer
- HostName
ParameterSets:
- Name: (All)
  Position: 3
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-Confirm

Fordert vor der Ausführung des Cmdlets eine Bestätigung an.

Wenn angegeben, erfolgt eine Abfrage vor:

  • Verarbeitung jeder DNS-Debugprotokolldatei
  • Entfernen der Quelldateien (wenn -RemoveSourceFile angegeben ist)
  • Überschreiben vorhandener Ausgabedateien

Nützlich für interaktive Verarbeitung, wenn du steuern möchtest, welche Dateien verarbeitet werden.

Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- cf
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-ContextFilter

Filtert, welche Protokolleintragstypen in die Ausgabe aufgenommen werden.
Akzeptiert einzelne oder mehrere Werte.

DNS-Debugprotokolle enthalten verschiedene Kontexttypen:

  • PACKET: DNS-Abfrage- und Antwortpaketinformationen (primäre Daten)
  • EVENT: DNS-Serverereignisse (z. B. “Der DNS-Server wurde gestartet.”)
  • Note: Diagnosenotizen und Warnungen (z. B. Socket-Fehler, interne Zustände)
  • DSPoll, Init, Lookup, Recurse, Remote, Tombstone: Weitere Kontexttypen

Gültige Werte:

  • ‘All’: Alle Kontexttypen einschließen (Standard)
  • ‘Packet’: Nur PACKET-Einträge einschließen (DNS-Abfragen/-Antworten)
  • ‘Event’: Nur EVENT-Einträge einschließen (Serverereignisse)
  • ‘Note’: Nur Note-Einträge einschließen (Diagnoseinformationen)
  • Beliebige Kombination: Mehrere Werte angeben, um spezifische Kontexttypen einzuschließen

Standard: All

Beispiele:

  • ‘Packet’ filtert nur DNS-Verkehr
  • ‘Packet’,‘Event’ umfasst DNS-Verkehr und Serverereignisse
  • ‘Note’,‘Event’ umfasst Diagnosehinweise und Serverereignisse

Hinweis: Bei Filterung auf ‘Event’ oder ‘Note’ enthalten nur die Spalten DateTime, ThreadId, Context und Information Daten. Andere Spalten (Protokoll, ClientIP usw.) bleiben leer.

Type: String[]
DefaultValue: "@('All')"
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 5
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-Delimiter

Legt das Trennzeichen für die CSV-Ausgabe fest.

Standard: Semikolon (;)

Gängige Alternativen: Komma (,), Tabulator (`t), Pipe (|)

Verwende Semikolon in Regionen, in denen Komma als Dezimaltrennzeichen verwendet wird (Europa).
Verwende Komma für Standard-CSV-Tools und Datenbanken, die kommagetrennte Werte erwarten.

Type: String
DefaultValue: ;
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 2
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-InputCulture

Legt die Kultur/Region fest, die für das Parsen von Datums-/Uhrzeitwerten im DNS-Debugprotokoll verwendet wird.

DNS-Server-Debugprotokolle verwenden das Datumsformat der Windows-Regionaleinstellung des Servers, auf dem das Protokoll erstellt wurde.
Verwende diesen Parameter bei der Verarbeitung von Protokollen von Servern mit unterschiedlichen Regionaleinstellungen.

Standard: Aktuelle Kultur

Gängige Beispiele:

  • ‘de-DE’ oder ‘de-AT’: Deutsches Format (TT.MM.JJJJ oder TT/MM/JJJJ)
  • ’en-US’: US-Format (MM/TT/JJJJ mit AM/PM)
  • ’en-GB’: UK-Format (TT/MM/JJJJ mit 24-Stunden-Zeit)
  • ‘sv-SE’: Schwedisches/ISO-Format (JJJJ-MM-TT)
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 6
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-InputFile

Legt den Pfad zur zu analysierenden DNS-Debugprotokolldatei fest.
Unterstützt Arrays zur Verarbeitung mehrerer Dateien.

Akzeptiert Pipeline-Eingaben von Get-ChildItem oder anderen Cmdlets, die Dateien liefern.

Type: String[]
DefaultValue: ''
SupportsWildcards: false
Aliases:
- FullName
- FilePath
- InputPath
- File
- Path
ParameterSets:
- Name: (All)
  Position: 0
  IsRequired: true
  ValueFromPipeline: true
  ValueFromPipelineByPropertyName: true
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-NoDetailsParsing

Überspringt das Parsen von PACKET-Detailblöcken in ein strukturiertes JSON-Format.

Wenn angegeben, enthalten PACKET-Datensätze mit Detailblöcken die TCP/UDP-Infozeile in der Spalte Information, aber die Spalte Details bleibt leer.
Dies verbessert die Verarbeitungsgeschwindigkeit bei großen Protokolldateien erheblich, wenn keine detaillierte Paketstrukturanalyse erforderlich ist.

Verwende diesen Schalter, wenn:

  • Sehr große Protokolldateien (100 MB+) verarbeitet werden und nur grundlegende Abfrageinformationen benötigt werden
  • Die Detailstruktur (Nachrichtenflags, DNS-Abschnitte) für die Analyse nicht erforderlich ist
  • Maximale Parsing-Geschwindigkeit wichtiger ist als Datenvollständigkeit

Leistungsauswirkung: Kann die Verarbeitungsgeschwindigkeit um 30-50 % verbessern bei Protokollen mit vielen PACKET-Detailblöcken.

Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-OutputCulture

Legt die Kultur/Region fest, die für die Formatierung von Datums-/Uhrzeitwerten in den Ausgabedateien im CSV-Format verwendet wird.

Steuert, wie DateTime-Werte in die CSV-Datei geschrieben werden.
Verwende dies, wenn CSV-Dateien von Anwendungen oder Systemen mit spezifischen Regionaleinstellungen verarbeitet werden.

Standard: Aktuelle Kultur

Gängige Beispiele:

  • ’en-US’: US-Format (MM/TT/JJJJ)
  • ‘de-DE’: Deutsches Format (TT.MM.JJJJ)
  • ‘sv-SE’ oder InvariantCulture: ISO-Format (JJJJ-MM-TT) für maximale Kompatibilität
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 7
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-OutputFile

Legt den Pfad für die Ausgabedatei im CSV-Format fest.
Wenn nicht angegeben, wird der Eingabedateiname mit der Erweiterung .csv im selben Verzeichnis wie die Eingabedatei verwendet.

Wichtig: Muss ein Dateipfad sein, kein Verzeichnis.
Wenn du das Verzeichnis der Eingabedatei mit einem benutzerdefinierten Namen verwenden möchtest, gib den vollständigen Pfad inklusive Dateiname an.

Type: String
DefaultValue: ''
SupportsWildcards: false
Aliases:
- Output
- Destination
- OutFile
- OutputPath
ParameterSets:
- Name: (All)
  Position: 1
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-OutputType

Legt den Typ der zu erzeugenden Ausgabe fest.

Gültige Werte:

  • ‘CSV’: Erzeugt nur die Datendatei mit allen geparsten Protokolleinträgen
  • ‘Statistic’: Erzeugt nur die Statistikdateien mit aggregierten Metriken
  • ‘Both’: Erzeugt sowohl Daten- als auch Statistikdateien (Standard)

Standard: Both

Wenn Statistiken erzeugt werden, entstehen zwei separate Dateien:

  • ‘_Statistic.csv’: Zusammenfassende Zählungen pro Kontexttyp pro Tag (Datum, Kontext, Anzahl, ComputerName)
  • ‘_PacketStatistic.csv’: Detaillierte PACKET-Zählungen pro Tag nach Client-IP, Protokoll, Richtung und Abfragetyp (Datum, ClientIP, Protokoll, Richtung, FrageTyp, Anzahl, ComputerName)
Type: String
DefaultValue: Both
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 4
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-RemoveSourceFile

Entfernt die Quell-DNS-Debugprotokolldatei nach erfolgreicher Verarbeitung.

Verwende dies für automatisierte Protokollverarbeitungspipelines oder zur Verwaltung des Speicherplatzes.
Die Quelldatei wird nur entfernt, wenn die Verarbeitung erfolgreich abgeschlossen wurde und alle Ausgabedateien erstellt sind.

Sicherheit: Kann nicht zusammen mit -SkipHeaderValidation verwendet werden, um versehentliches Löschen ungültiger Dateien zu verhindern.

Warnung: Quelldateien werden dauerhaft gelöscht.
Stelle sicher, dass die Ausgabedateien gültig sind, bevor du diese Option verwendest.

Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-SkipHeaderValidation

Umgeht die Validierungsprüfung der DNS-Debugprotokoll-Kopfzeile.

Standardmäßig prüft das Cmdlet, ob Eingabedateien eine gültige DNS-Server-Debugprotokoll-Kopfzeile besitzen.
Verwende diesen Schalter, um Dateien ohne Validierung zu verarbeiten, was nützlich sein kann für:

  • Geänderte oder benutzerdefinierte Protokollformate
  • Fehlerbehebung bei Validierungsproblemen
  • Nicht standardmäßige oder vorverarbeitete Protokolle

Warnung: Kann zu Verarbeitungsfehlern führen, wenn die Datei kein gültiges DNS-Protokoll ist.

Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-WhatIf

Zeigt an, was passieren würde, wenn das Cmdlet ausgeführt wird.
Das Cmdlet wird nicht ausgeführt.

Wenn angegeben, werden detaillierte Informationen über die auszuführenden Operationen angezeigt, ohne diese tatsächlich auszuführen.
Nützlich für:

  • Vorschau, welche Dateien verarbeitet würden
  • Überprüfung der Ausgabepfade vor der Verarbeitung
  • Testen von Skripten vor dem produktiven Einsatz
Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- wi
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

CommonParameters

Dieses Cmdlet unterstützt die allgemeinen Parameter: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction und -WarningVariable. Weitere Informationen findest du unter about_CommonParameters.

EINGABEN

System.String[]

HINWEISE

Version : 1.7.0.0
Autor : Andi Bellstedt, Copilot
Datum : 2026-01-25
Schlüsselwörter : Microsoft Windows Server, DNSServer, DNS, DebugLog, LogParser

6 - Anwendungsbeispiele

Hier findest du praktische Beispiele, wie du das Modul in realen Szenarien einsetzen kannst. Diese Beispiele sollen dir helfen, die Funktionsweise des Moduls besser zu verstehen.

Dies sind Beispiele mit etwas mehr Tiefe und Kontext. Wenn du nur die Verwendung der Befehle aus dem Modul sehen möchtest, schau dir die Befehlsreferenz an.

6.1 - Geplantes Aufgaben-Beispiel

Dieses Beispiel zeigt, wie man eine Windows-Geplante Aufgabe erstellt, die täglich ein PowerShell-Skript ausführt, um DNS-Debug-Protokolle zu verarbeiten.

Dieses Skript erstellt eine Windows-Geplante Aufgabe, die täglich um 2:00 Uhr morgens ausgeführt wird. Es importiert das Modul und verarbeitet alle Protokolldateien im Ordner, in dem das Skript ausgeführt wird (in diesem Beispiel “C:\Administration\Logs\DNS”). Der Prozess komprimiert die Ausgabe in ZIP-Dateien und entfernt die Originaldateien, um Ordnung zu halten.

$actionParams = @{
    Execute = "powershell.exe"
    Argument = '-ExecutionPolicy RemoteSigned -Command "Import-Module DNSServer.DebugLogParser; Get-ChildItem .\*.log | Sort-Object lastwritetime, Name -Descending | Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME -Delimiter \";\" -OutputType Both -ContextFilter Packet -OutputCulture sv-SE -CompressOutput"'
    WorkingDirectory = "C:\Administration\Logs\DNS"
}
$Action = New-ScheduledTaskAction @actionParams

$Trigger = New-ScheduledTaskTrigger -Daily -At "2:00AM"

Register-ScheduledTask -TaskName "Process DNS Logs" -Action $Action -Trigger $Trigger -Description "Convert DNS debug logs to CSV daily"

6.2 - Praktische Anwendung in einer Domänenumgebung (GPO-gesteuerte Sammlung und Konvertierung)

Dieses Beispiel zeigt, wie ein GPO-gesteuerter Workflow zur Sammlung und Konvertierung von DNS-Debug-Protokollen auf Domänencontrollern implementiert wird.

Dieses Dokument beschreibt ein praktisches, durchgängiges Beispiel für den Einsatz von DNSServer.DebugLogParser in einer Active Directory-Domänenumgebung, mit Fokus auf die Konvertierung von Windows DNS-Server-Debug-Protokollen auf Domänencontrollern.

Dieses Beispiel wird von einem ZIP-Archiv begleitet, das die Richtlinien-Artefakte enthält, die zur Umsetzung des hier beschriebenen Workflows verwendet werden.
Die wichtigsten Artefakte sind das Backup-Manifest, der GPO-Bericht, Files.xml, Set-DNSServerDebugLogging.ps1 und ScheduledTasks.xml.

Szenario

  • Mehrere Domänencontroller (DCs) hosten die DNS-Serverrolle.
  • DNS-Debug-Protokollierung ist aktiviert und wird auf jedem DC über eine geplante Aufgabe einheitlich konfiguriert (Schreiben der Protokolldateien nach C:\Administration\Logs\DNSServer).
  • Ein zentral verwalteter Prozess konvertiert die Protokolle in CSV für:
    • Sicherheitsanalysen
    • Betriebsberichte
    • Fehlerbehebung
    • Compliance/Aufbewahrung

Zielsetzungen

  • Einheitliche Konvertierungseinstellungen auf allen DCs
  • Vorhersehbarer Speicherort und Namensgebung der Ausgaben
  • Optionale Komprimierung zur Reduzierung des Speicherplatzbedarfs
  • Optionale Statistik-Ausgaben für schnelle tägliche Zusammenfassungen
  • Minimales Risiko auf dem Host mit expliziten Wiederholungs- und Bereinigungsmaßnahmen

Vorgeschlagene Architektur

Sammelmodell: lokale Konvertierung + zentrale Abholung

  1. Jeder DC schreibt DNS-Debug-Protokolle mit aktivierter Roll-over-Funktion auf die Festplatte.
  2. Jeder DC konvertiert die rotierten *.log-Dateien in eine Daten-CSV und Statistik-CSVs und komprimiert die Ausgaben dann zeitgesteuert (Task Scheduler) in *.zip.
  3. Die Ausgaben werden neben den Protokolldateien abgelegt, damit die Pipeline einfach bleibt.
  4. Ein zentraler Server sammelt die *.zip-Ausgaben, z. B. über Dateifreigabe, geplante Kopie, SIEM-Forwarder oder einen agentenbasierten Collector.

Dieses Modell minimiert Netzwerkzugriffe auf große Rohprotokolle und hält die Verarbeitung nahe an den Daten.

GPO-Workflow

Der Workflow wird über Gruppenrichtlinien (Computerkonfiguration) implementiert, um konsistente Einstellungen auf allen Domänencontrollern sicherzustellen.

Referenzimplementierung in diesem Repository enthalten (GPO-Bericht):

  • Archiv-/Berichtsname: T0-C-Analytics-DNSDebugLogging
  • Backup-ID: {2B6F16BC-0E7C-4787-83D7-2854FED882EE}
  • GPO-Ziel: corp.company.com/Domain Controllers
  • Filter für Elemente (für Datei-Bereitstellung und geplante Aufgaben): gilt nur, wenn C:\Windows\System32\dns.exe vorhanden ist

1) Voraussetzungen (Ordner + Modul)

Das bereitgestellte Backup setzt voraus, dass diese Ordner bereits existieren. Füge separate GPP-Elemente hinzu, wenn die Bereitstellung sie automatisch erstellen soll:

  • C:\Administration\Scripts
  • C:\Administration\Logs\DNSServer

Das Backup setzt außerdem voraus, dass Convert-DNSDebugLogFile bereits auf den DCs verfügbar ist. Die Konvertierungsaufgabe startet Windows PowerShell 5.1 mit -NoProfile und importiert das Modul nicht explizit, daher muss das Modul in einem maschinenweiten Windows PowerShell-Modulpfad installiert sein, der für LocalSystem sichtbar ist. Empfohlene Vorgehensweisen:

  • Installiere DNSServer.DebugLogParser auf den DCs, z. B. aus der PowerShell Gallery (wenn Richtlinie dies erlaubt).
  • Stelle das Modul über ein internes Repository / Dateifreigabe bereit, sodass es in $env:PSModulePath auffindbar ist.
  • Füge der Aufgabenaktion ein explizites Import-Module hinzu, wenn du ein deterministisches Ladeverhalten möchtest.

2) Bereitstellung des Debug-Logging-Konfigurationsskripts (GPP Dateien)

Die GPO stellt das Skript bereit:

  • Quelle (im SYSVOL via GPP): %GptPath%\Preferences\Files\Set-DNSServerDebugLogging.ps1
  • Ziel (auf jedem DC): C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1

Dies ist im GPP-Dateielement in Files.xml implementiert.

3) Geplante Aufgabe: DNS-Debug-Logging konfigurieren

Die GPO erstellt eine geplante Aufgabe namens Set-DNSServerDebugLogging.

  • Sicherheitskontext im bereitgestellten Backup: SYSTEM mit Anmeldetyp S4U
  • Trigger im Backup: täglich (Startzeitpunkt 2025-03-01T00:00:01)
  • Aktion in ScheduledTasks.xml:
    • powershell.exe -ExecutionPolicy RemoteSigned -command " & { C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1 }"
    • Arbeitsverzeichnis: C:\Administration\Scripts

Das verlinkte Set-DNSServerDebugLogging.ps1-Skript konfiguriert DNS-Debug-Logging über Get-DnsServerDiagnostics / Set-DnsServerDiagnostics und insbesondere:

  • Aktiviert Protokollierung in Datei + Roll-over
  • Schreibt nach: C:\Administration\Logs\DNSServer\DnsDebugLog_<COMPUTERNAME>.<Domain>_.log
  • Verwendet eine Roll-over-Größe von 10 MB pro Datei
  • Erfasst hauptsächlich abfragebezogene Aktivitäten (Abfragen + Benachrichtigungen + Updates + Frage-Transaktionen) und schließt vollständige Paketprotokollierung aus

4) Geplante Aufgabe: konvertiere rotierte Debug-Protokolle in komprimierte CSV

Die GPO erstellt eine geplante Aufgabe namens Convert-DNSDebugLogs.

  • Sicherheitskontext im Backup: SYSTEM mit Anmeldetyp InteractiveToken
  • Trigger im Backup: täglich (Startzeitpunkt 2026-01-01T00:30:00)
  • Arbeitsverzeichnis: C:\Administration\Logs\DNSServer
  • Aktion in ScheduledTasks.xml (zur besseren Lesbarkeit formatiert):
Get-ChildItem .\*.log |
  Sort-Object lastwritetime, Name -Descending |
  Select-Object -Skip 1 |
  Convert-DNSDebugLogFile `
    -ComputerName $env:COMPUTERNAME `
    -Delimiter ';' `
    -OutputType Both `
    -ContextFilter Packet `
    -OutputCulture sv-SE `
    -CompressOutput

Designhinweise:

  • Select-Object -Skip 1 vermeidet absichtlich die Verarbeitung der neuesten (aktiven) Protokolldatei.
  • Das bedeutet, aktuelle Daten werden erst nach dem Roll-over exportiert; bei DCs mit geringem Volumen kann die aktive Protokolldatei mehr als einen Tag unberührt bleiben.
  • Da Convert-DNSDebugLogFile standardmäßig -OutputFile auf „gleicher Ordner, gleicher Name, .csv“ setzt, landen die Ausgaben neben den *.log-Eingaben.
  • Mit -CompressOutput erzeugt jede verarbeitete Protokolldatei eine *.zip und die Zwischen-CSV-Dateien werden entfernt.
  • Sofern du verarbeitete *.log-Dateien nicht archivierst oder löschst, werden spätere Läufe jede nicht-aktive Protokolldatei erneut verarbeiten.
  • Die Aufgabe wirft einen Fehler, wenn $Error.Count -gt 0 ist, um einen fehlgeschlagenen Lauf zu signalisieren.

5) Zentrale Aufnahme

Optionen (eine auswählen):

  • Dateifreigabe-Aufnahme: DC schreibt (oder kopiert) C:\Administration\Logs\DNSServer\*.zip nach \\fileserver\share\dns\$env:COMPUTERNAME\... (gewähre Freigabe- und NTFS-Rechte für die DC-Computer-Konten oder die Gruppe Domänencontroller, falls die Aufgabe als SYSTEM läuft)
  • Pull-Modell: zentraler Job liest \\dc\C$\Administration\Logs\DNSServer\*.zip (am wenigsten bevorzugt; erfordert Admin-Freigaben)
  • Agent-Forwarder: SIEM / Log-Pipeline, die die *.zip-Ausgaben versendet

Betriebliche Überlegungen

  • Least Privilege: Aufgaben laufen als SYSTEM; stelle sicher, dass die lokalen Ordner beschreibbar sind und dass eventuelle UNC-Ziele Zugriff für das Computerkonto gewähren, falls verwendet.
  • Signierungsrichtlinie: Beide Aufgaben verwenden -ExecutionPolicy RemoteSigned; signiere oder hebe die Blockierung für das bereitgestellte Skript und Modul gemäß deiner Richtlinie auf.
  • Speicherplatz: -CompressOutput hilft erheblich, aber dieser Workflow entfernt die Quellprotokolle nicht; plane Aufbewahrung und Bereinigung.
  • Wiederverarbeitungsverhalten: Sofern du verarbeitete Protokolle nicht archivierst oder löschst, verarbeitet die Konvertierungsaufgabe bei späteren Läufen jede nicht-aktive *.log-Datei erneut. Das ist einfach und robust, kann aber Ausgaben überschreiben und doppelte nachgelagerte Aufnahmen erzeugen, wenn dein Collector nicht dedupliziert.
  • Multi-DC-Konsolidierung: -ComputerName $env:COMPUTERNAME ist enthalten, damit konsolidierte Datensätze nachvollziehbar bleiben.
  • Validierung: Header-Validierung bleibt aktiviert, da die Aufgabe -SkipHeaderValidation nicht verwendet (empfohlen).

Validieren und anpassen (mit dem ZIP)

Nutze das ZIP-Archiv als Referenzimplementierung und passe dann folgende Aspekte an deine Umgebung an:

  • Zielumfang: welche DCs / OUs die Richtlinie erhalten
  • Ausführungsidentität: bestätige, dass beide geplanten Aufgaben den vorgesehenen Anmeldetyp verwenden (S4U vs. InteractiveToken) oder normalisiere sie auf deinen Standard
  • Ordnererstellung: entscheide, ob C:\Administration\Scripts und C:\Administration\Logs\DNSServer woanders vorab bereitgestellt oder durch zusätzliche GPP-Elemente erstellt werden sollen
  • Pfade: bestätige, dass C:\Administration\Scripts und C:\Administration\Logs\DNSServer deinen Standards entsprechen
  • Aufbewahrung: entscheide, ob Rohprotokolle behalten werden und wie lange (besonders bei Aktivierung von Bereinigungsoptionen)
  • Aufnahme: bestätige, wo CSV/ZIP-Ausgaben geschrieben werden und wie sie zentral gesammelt werden

Wenn du die genaue GPO-Konfiguration ohne Import validieren möchtest, sind die maßgeblichen Quellen in diesem Repo:

6.3 - Sicherheitsanalyse-Workflow mit SQL Server

Konvertiere DNS-Debug-Logs mit DNSServer.DebugLogParser in CSV, importiere das Ergebnis in SQL Server und führe eine einfache Abfrage zur Erkennung verdächtiger TXT-Record-Aktivitäten aus.

Dieses Beispiel zeigt einen praktischen Workflow für Sicherheitsanalysen: Ein DNS-Debug-Log wird mit Convert-DNSDebugLogFile geparst, die erzeugte CSV-Datei in SQL Server importiert und eine Abfrage ausgeführt, die ungewöhnlich hohe Mengen an TXT-Record-Abfragen hervorhebt.

Für beste Interoperabilität schreibt dieses Beispiel Zeitstempel in einem ISO-ähnlichen Format, indem -OutputCulture 'sv-SE' verwendet wird.

Erforderliche Module

Dieses Beispiel verwendet folgende PowerShell-Module:

  • DNSServer.DebugLogParser
  • SqlServer

Installiere sie bei Bedarf:

Install-Module -Name DNSServer.DebugLogParser -Scope CurrentUser
Install-Module -Name SqlServer -Scope CurrentUser

Szenario

Nutze diesen Workflow, wenn du geparste DNS-Debug-Log-Daten in SQL Server verschieben möchtest, um:

  • große Datensätze effizient zu durchsuchen
  • wiederholbare Erkennungsabfragen zu erstellen
  • Aktivitäten über mehrere DNS-Server hinweg zu korrelieren
  • normalisierte Daten für spätere Untersuchungen zu speichern

Ausgabe des Konvertierungsschritts

Convert-DNSDebugLogFile schreibt nicht direkt in SQL Server. Zuerst wird eine CSV-Datei erstellt. Diese CSV-Datei ist der Datensatz, der in die Datenbank importiert wird.

In diesem Beispiel:

  • Eingabe-Log: C:\Administration\Logs\DNS\dns.log
  • erzeugte CSV: C:\Administration\Logs\DNS\dns.csv
  • Ziel-Tabelle: dbo.DNSQueries

Erstelle die Zieltabelle

Führe die folgende Anweisung einmalig in SQL Server aus, um die Zieltabelle zu erstellen.

IF OBJECT_ID('dbo.DNSQueries', 'U') IS NULL
BEGIN
    CREATE TABLE dbo.DNSQueries (
        DateTime      datetime2(0)   NOT NULL,
        ThreadId      int            NULL,
        Context       nvarchar(20)   NULL,
        PacketId      int            NULL,
        Protocol      nvarchar(10)   NULL,
        Direction     nvarchar(10)   NULL,
        ClientIP      nvarchar(64)   NULL,
        Xid           nvarchar(16)   NULL,
        Type          nvarchar(16)   NULL,
        Opcode        nvarchar(16)   NULL,
        FlagsHex      nvarchar(16)   NULL,
        FlagsChar     nvarchar(16)   NULL,
        ResponseCode  nvarchar(32)   NULL,
        QuestionType  nvarchar(32)   NULL,
        QuestionName  nvarchar(512)  NULL,
        Information   nvarchar(max)  NULL,
        Details       nvarchar(max)  NULL,
        ComputerName  nvarchar(256)  NULL
    );
END;

Konvertiere das Log und importiere die CSV

Das folgende PowerShell-Beispiel führt den kompletten Workflow aus:

  1. Importiert die benötigten Module
  2. Konvertiert das DNS-Debug-Log in CSV
  3. Lädt die erzeugte CSV-Datei
  4. Importiert die Zeilen per Bulk-Import in SQL Server
# Requires -Modules DNSServer.DebugLogParser, SqlServer

Import-Module -Name DNSServer.DebugLogParser -ErrorAction Stop
Import-Module -Name SqlServer -ErrorAction Stop

$logPath = 'C:\Administration\Logs\DNS\dns.log'
$csvPath = 'C:\Administration\Logs\DNS\dns.csv'
$serverInstance = 'SQLServer'
$databaseName = 'DNSLogs'
$delimiter = ';'

$createTableSql = @'
IF OBJECT_ID('dbo.DNSQueries', 'U') IS NULL
BEGIN
    CREATE TABLE dbo.DNSQueries (
        DateTime      datetime2(0)   NOT NULL,
        ThreadId      int            NULL,
        Context       nvarchar(20)   NULL,
        PacketId      int            NULL,
        Protocol      nvarchar(10)   NULL,
        Direction     nvarchar(10)   NULL,
        ClientIP      nvarchar(64)   NULL,
        Xid           nvarchar(16)   NULL,
        Type          nvarchar(16)   NULL,
        Opcode        nvarchar(16)   NULL,
        FlagsHex      nvarchar(16)   NULL,
        FlagsChar     nvarchar(16)   NULL,
        ResponseCode  nvarchar(32)   NULL,
        QuestionType  nvarchar(32)   NULL,
        QuestionName  nvarchar(512)  NULL,
        Information   nvarchar(max)  NULL,
        Details       nvarchar(max)  NULL,
        ComputerName  nvarchar(256)  NULL
    );
END
'@

Convert-DNSDebugLogFile `
    -InputFile $logPath `
    -ComputerName 'DNS01' `
    -OutputType CSV `
    -OutputFile $csvPath `
    -Delimiter $delimiter `
    -OutputCulture 'sv-SE'

$rows = Import-Csv -Path $csvPath -Delimiter $delimiter

if (-not $rows) {
    throw "Die erzeugte CSV-Datei '$csvPath' enthält keine Zeilen."
}

$dataTable = [System.Data.DataTable]::new()
foreach ($columnName in $rows[0].PSObject.Properties.Name) {
    $null = $dataTable.Columns.Add($columnName, [string])
}

foreach ($row in $rows) {
    $dataRow = $dataTable.NewRow()
    foreach ($column in $dataTable.Columns) {
        $columnName = $column.ColumnName
        $dataRow[$columnName] = $row.$columnName
    }

    $null = $dataTable.Rows.Add($dataRow)
}

$connectionString = "Server=$serverInstance;Database=$databaseName;Integrated Security=True"
$connection = [System.Data.SqlClient.SqlConnection]::new($connectionString)

try {
    $connection.Open()

    $command = $connection.CreateCommand()
    $command.CommandText = $createTableSql
    $null = $command.ExecuteNonQuery()

    $bulkCopy = [System.Data.SqlClient.SqlBulkCopy]::new($connection)
    $bulkCopy.DestinationTableName = 'dbo.DNSQueries'

    foreach ($column in $dataTable.Columns) {
        $null = $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName)
    }

    $bulkCopy.WriteToServer($dataTable)
}
finally {
    $connection.Dispose()
}

Abfrage nach verdächtiger TXT-Record-Aktivität

Sobald die Daten in SQL Server sind, kannst du nach Clients suchen, die ungewöhnlich viele TXT-Record-Abfragen stellen.

SELECT
    ComputerName,
    ClientIP,
    QuestionName,
    COUNT(*) AS QueryCount
FROM dbo.DNSQueries
WHERE QuestionType = 'TXT'
GROUP BY
    ComputerName,
    ClientIP,
    QuestionName
HAVING COUNT(*) > 100
ORDER BY QueryCount DESC;

Wenn du die Abfrage lieber aus PowerShell heraus ausführst, nutze Invoke-Sqlcmd aus dem SqlServer-Modul:

$query = @'
SELECT
    ComputerName,
    ClientIP,
    QuestionName,
    COUNT(*) AS QueryCount
FROM dbo.DNSQueries
WHERE QuestionType = 'TXT'
GROUP BY
    ComputerName,
    ClientIP,
    QuestionName
HAVING COUNT(*) > 100
ORDER BY QueryCount DESC;
'@

Invoke-Sqlcmd `
    -ServerInstance 'SQLServer' `
    -Database 'DNSLogs' `
    -Query $query

Warum TXT-Abfragen interessant sind

Hohe Volumina von TXT-Record-Abfragen können eine Überprüfung wert sein, da sie auf Folgendes hinweisen können:

  • DNS-Tunneling
  • Datenexfiltration über DNS
  • Missbrauch von TXT-Records durch Malware oder Tools
  • ungewöhnlich laute oder falsch konfigurierte Clients

Diese Abfrage ist nur ein Ausgangspunkt. Im produktiven Einsatz solltest du die Schwelle anpassen und Filter hinzufügen, die zu deiner Umgebung passen.

Betriebshinweise

  • Import-Csv liest die gesamte Datei in den Speicher ein. Bei sehr großen Log-Exports solltest du einen Streaming-Ansatz statt eines vollständigen DataTable-Aufbaus in Betracht ziehen.
  • Behalte -ComputerName im Konvertierungsschritt bei, damit die Datensätze nach zentraler Einspeisung zugeordnet bleiben.
  • Verwende während Export und Import einen konsistenten Trenner und eine konsistente Kultur.
  • Prüfe Aufbewahrung, Indizierung und Zugriffskontrolle in SQL Server, bevor du diesen Workflow für Langzeitspeicherung nutzt.