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 folgende 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-Berichte.
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-/Diagnosetexte, eine optionale Details-JSON-Spalte für Paketdetailblöcke und eine immer vorhandene ComputerName-Spalte (leer, sofern nicht angegeben).
WICHTIGE FUNKTIONEN:
- Streaming-Verarbeitung vermeidet das Laden der gesamten Datei in den Speicher (geeignet für sehr große Protokolle)
- Hochleistungs-Parsing 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 64KB-Puffern, Streaming-Verarbeitung für speichereffiziente Handhabung großer Dateien, String-Operationen statt Regex, manuelle CSV-Erzeugung und effiziente Hashtable-basierte Statistik-Erfassung.
KOMPATIBILITÄT:
- PowerShell 5.1+ (Desktop- und Core-Editionen)
- Windows Server 2016+
- DNS Server 2012 R2 bis 2025 Protokollformate
BEISPIELE
BEISPIEL 1
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log"
Konvertiert das DNS-Debugprotokoll mit Standardeinstellungen (sowohl Daten- als auch Statistikdateien mit Semikolon als 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.
Verbose-Ausgabe bestätigt die Dateientfernung.
BEISPIEL 9
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE' -OutputCulture 'en-US'
Parst das deutsche 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 die 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 gleichen Verzeichnis wie die Ausgabedatei mit dem gleichen Basisnamen erstellt.
Vorteile:
- Reduziert den Speicherplatzbedarf erheblich (CSV-Dateien komprimieren sich typischerweise um 90%+)
- Vereinfacht Dateiverwaltung und Archivierung
- Geeignet für Langzeitspeicherung
Beispiel: Eingabe ‘dns.log’ erzeugt ‘dns.csv’, das 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
Gibt den Wert für die Spalte ComputerName in der CSV-Ausgabe an.
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.
Er kennzeichnet nur die Ausgabe.
Wenn du -InputFile auf einen UNC-Pfad setzt, wird die Datei von diesem Pfad gelesen (keine WinRM-/Remote-Ausführung erfolgt).
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 Ausführung des Cmdlets eine Bestätigung an.
Wenn angegeben, erfolgt eine Abfrage vor:
- Verarbeitung jeder DNS-Debugprotokolldatei
- Entfernen von 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 Diagnosenotizen 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
Gibt das Trennzeichen für die CSV-Ausgabe an.
Standard: Semikolon (;)
Übliche 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 komma-separierte 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: ''
Gibt die Kultur/Region an, die zum Parsen von Datums-/Uhrzeitwerten im DNS-Debugprotokoll verwendet wird.
DNS-Server-Debugprotokolle verwenden das Datumsformat der Windows-Region auf dem Server, auf dem das Protokoll erstellt wurde.
Verwende diesen Parameter bei der Verarbeitung von Protokollen von Servern mit unterschiedlichen Regionaleinstellungen.
Standard: Aktuelle Kultur
Häufige 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’: Schwedisch/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: ''
Gibt den Pfad zur zu parsenden DNS-Debugprotokolldatei an.
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 Information-Spalte, aber die Details-Spalte bleibt leer.
Dies verbessert die Verarbeitungsgeschwindigkeit bei großen Protokolldateien erheblich, wenn die detaillierte Paketstruktur nicht benötigt wird.
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
- Die Parsing-Geschwindigkeit wichtiger als die Datenvollständigkeit ist
Leistungsverbesserung: Kann die Verarbeitungsgeschwindigkeit bei Protokollen mit vielen PACKET-Detailblöcken um 30-50 % steigern.
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
Gibt die Kultur/Region an, die zum Formatieren von Datums-/Uhrzeitwerten in den Ausgabedateien im CSV-Format verwendet wird.
Steuert, wie DateTime-Werte in die CSV geschrieben werden.
Verwende dies, wenn CSV-Dateien von Anwendungen oder Systemen mit spezifischen Regionaleinstellungen verarbeitet werden.
Standard: Aktuelle Kultur
Häufige 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
Gibt den Pfad für die Ausgabedatei im CSV-Format an.
Wenn nicht angegeben, wird der Eingabedateiname mit der Erweiterung .csv im gleichen 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
Gibt den Typ der zu erzeugenden Ausgabe an.
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, werden zwei separate Dateien erstellt:
- ‘_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 ist und alle Ausgabedateien erstellt wurden.
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: ''
Umgeht die Validierung 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 bei:
- Modifizierten oder benutzerdefinierten Protokollformaten
- Fehlerbehebung bei Validierungsproblemen
- Nicht standardmäßigen oder vorverarbeiteten Protokollen
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 Einsatz in der Produktion
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.1.1
Autor : Andi Bellstedt, Copilot
Datum : 2026-01-26
Schlüsselwörter : Microsoft Windows Server, DNSServer, DNS, DebugLog, LogParser
VERWANDTE LINKS
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
- Jeder DC schreibt DNS-Debug-Protokolle mit aktivierter Roll-over-Funktion auf die Festplatte.
- Jeder DC konvertiert die rotierten
*.log-Dateien in eine Daten-CSV und Statistik-CSVs und komprimiert die Ausgaben dann zeitgesteuert (Task Scheduler) in *.zip. - Die Ausgaben werden neben den Protokolldateien abgelegt, damit die Pipeline einfach bleibt.
- 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\ScriptsC:\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.DebugLogParserSqlServer
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:
- Importiert die benötigten Module
- Konvertiert das DNS-Debug-Log in CSV
- Lädt die erzeugte CSV-Datei
- 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.