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

Zur Standardansicht zurückkehren.

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.

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"

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:

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.