# Übersicht

> Was DNSServer.DebugLogParser macht, wie ein Windows DNS-Debug-Log aussieht und wann sich die Umwandlung in CSV lohnt.

---

LLMS index: [llms.txt](/llms.txt)

---

Windows DNS Server kann ein Debug-Log schreiben. Es ist eine Textdatei, die für Menschen lesbar ist und an einem stark genutzten Domänencontroller täglich um mehrere hundert Megabyte wächst. Diese Kombination macht sie nahezu nutzlos, sobald du eine Frage beantworten willst wie *„Welcher Client hat diese Domain letzte Nacht 40.000 Mal abgefragt?“*

**DNSServer.DebugLogParser** verwandelt diese Textdatei in eine CSV-Tabelle. Eine Logzeile wird zu einer Zeile mit benannten Spalten, sodass du sie in Excel öffnen, in Power BI laden, massenhaft in SQL Server einfügen oder an dein SIEM schicken kannst.

Das Modul enthält einen einzigen Befehl:

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Windows\System32\dns\dns.log"
```

Das ist der ganze Einstiegspunkt. Alles andere auf dieser Seite dreht sich darum, es im großen Stil, nach Zeitplan und über mehrere Server hinweg zu machen.

## Wie ein DNS-Debug-Log aussieht

Ein roher Eintrag ist eine einzelne Zeile mit Positionsfeldern, einige davon in Klammern:

```text
2026-01-20 23:00:16 0FE0 PACKET 000002C53117D990 UDP Rcv 10.0.0.2 c049 Q [0001 D NOERROR] A (3)odc(9)officeapps(4)live(3)com(0)
```

Nach der Umwandlung ist dasselbe Ereignis eine CSV-Zeile, die du filtern und sortieren kannst:

```text
DateTime;ThreadId;Context;PacketId;Protocol;Direction;ClientIP;Xid;Type;Opcode;FlagsHex;FlagsChar;ResponseCode;QuestionType;QuestionName;Information;Details;ComputerName
2026-01-20 23:00:16;0FE0;Packet;000002C53117D990;UDP;Rcv;10.0.0.2;c049;Query;Standard;0001;RecursionDesired;NOERROR;A;"odc.officeapps.live.com";"";"";dc01
```

Beachte zwei Dinge, die das rohe Format erschwert und der Parser für dich erledigt:

- Der abgefragte Name ist im DNS-Wire-Format gespeichert, `(3)odc(9)officeapps(4)live(3)com(0)`, und wird zu einem normalen FQDN.
- Ein einzelnes Ereignis ist nicht immer eine einzelne Zeile. `PACKET`-Detailblöcke und Ereignismeldungen setzen sich in eingerückten Folgelinien fort. Der Parser hängt diese an den zugehörigen Datensatz an, anstatt sie zu verwerfen oder verwaiste Zeilen zu erzeugen.

Jeder Eintrag enthält bis zu 16 native Felder — Zeitstempel, Protokoll, Richtung, Client-IP, Abfragetyp, abgefragter Name, Antwortcode, Flags und mehr. Die vollständige Spaltenliste findest du in [Ausgabeformate](../02-output-formats/).

## Warum die Umwandlung lohnt

### Fehlerbehebung

- Herausfinden, warum ein Name nicht aufgelöst wird und ob die Abfrage überhaupt den Server erreicht hat
- Fehlkonfigurierte Clients oder Anwendungen identifizieren, die den Server überlasten
- Nachverfolgen, wo eine problematische Abfrage tatsächlich herkommt
- Zonentransfers und allgemeines DNS-Verhalten überprüfen

### Leistung und Kapazität

- Clients nach Abfragevolumen sortieren und die lauten Kandidaten finden
- Sehen, welche Record-Typen deinen Traffic dominieren
- Konfigurationsfehler erkennen, die vermeidbare Abfragen verursachen
- Serverlast über die Zeit verfolgen statt zu raten

### Sicherheitsanalyse

- DNS-Tunneling und Datenexfiltration erkennen (typischerweise sichtbar als übermäßiger `TXT`-Traffic — siehe das [SQL Server Analysebeispiel](../examples/security-analysis-sql/))
- Abfragen gegen Malware- und Command-and-Control-Domains finden
- Abfragemuster eines kompromittierten Hosts erkennen
- DNS-Amplification-Missbrauch beobachten
- Rekonstruieren, was während eines Vorfalls passiert ist

### Compliance und Auditing

- Protokollierungs- und Aufbewahrungspflichten erfüllen
- Eine Audit-Trail der Netzwerkaktivität führen
- Berichte für Management oder Auditoren erstellen

## Wie das Modul funktioniert

`Convert-DNSDebugLogFile` liest das Log als Stream und schreibt die CSV ebenfalls als Stream. Die Datei wird nie komplett in den Speicher geladen, sodass ein 100 MB Log ungefähr genauso viel RAM benötigt wie ein 10 MB Log. Details findest du unter [Performance](../04-performance/).

Das bekommst du:

| Fähigkeit | Details |
|---|---|
| Konsistentes CSV-Layout | 18 Spalten, immer in derselben Reihenfolge, unabhängig davon, welche Kontexte im Log auftauchen |
| Mehrzeilige Einträge | `PACKET`-Detailblöcke und Ereignistexte bleiben am zugehörigen Eintrag hängen |
| DNS Server Versionen | Logformate von 2012 R2 bis 2025 |
| PowerShell-Versionen | Windows PowerShell 5.1+ und PowerShell 7.x |
| Dateigröße | Getestet mit Logs über 100 MB; Streaming in einem Durchgang |
| Header-Validierung | Lehnt Dateien ab, die keine DNS-Debug-Logs sind (kann deaktiviert werden) |
| Statistiken | Optionale Tageszusammenfassungen, pro Kontext und pro Client/Protokoll/Typ |
| Pipeline-Unterstützung | `Get-ChildItem *.log \| Convert-DNSDebugLogFile` |
| Kompression | Optionale ZIP-Ausgabe, typischerweise 90 % kleiner |
| Quellbereinigung | Optionales Löschen des Logs nach erfolgreichem Lauf |
| Internationale Logs | Parst und schreibt Datumsangaben kulturabhängig, sodass ein `de-DE` Log auf einem `en-US` Rechner gelesen werden kann |
| Netzwerkpfade | Liest Quellen von SMB/UNC-Pfaden |
| Gesperrte Dateien | Liest Logs, die DNS Server (oder andere Prozesse) gerade geöffnet haben |

## Aktives Log vs. rotiertes Log

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">Aktive Logs mit Vorsicht lesen</div>


Das Modul kann die Logdatei lesen, in die DNS Server gerade schreibt. Das ist praktisch für einen schnellen Blick, aber die Datei ändert sich während der Umwandlung ständig. Das Ergebnis kann die neuesten Einträge vermissen oder mit einem abgeschnittenen Eintrag enden.

Für alles Geplante oder Produktionsrelevante solltest du stattdessen **rotierte, geschlossene** Logdateien umwandeln und niemals ein aktives Log mit `-RemoveSourceFile` kombinieren.
</div>


Das praktische Muster ist, auf dem DNS-Server die Protokollrotation zu aktivieren und die geplante Umwandlung die neueste Datei überspringen zu lassen:

```powershell
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
    Sort-Object LastWriteTime -Descending |
    Select-Object -Skip 1 |
    Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
```

Eine vollständige, auf Gruppenrichtlinien basierende Umsetzung ist im [GPO-gesteuerten Sammelbeispiel](../examples/gpo-driven-collection/) dokumentiert.

## Wohin als Nächstes

- [Ausgabeformate](../02-output-formats/) — was die Spalten bedeuten, mit echten Beispieldateien
- [Parameter und Optionen](../03-parameters-and-options/) — die Stellschrauben, einfach erklärt
- [Performance](../04-performance/) — warum es schnell ist und wie es schnell bleibt
- [Integration](../05-integration/) — Excel, Power BI, SQL, SIEM, Python
- [Betriebliche Best Practices](../06-operational-best-practices/) — Einsatz im Produktivbetrieb
- [Anwendungsbeispiele](../examples/) — geplante Tasks, GPO-Rollout, SQL-Analysen
- [Befehlsreferenz](../commands/convert-dnsdebuglogfile/) — die autoritative Parameterliste

## Lizenz und Support

MIT-Lizenz. Community-Support läuft über GitHub Issues; Fehlerberichte und Featurewünsche sind willkommen.

- GitHub-Repository: [AndiBellstedt/DNSServer.DebugLogParser](https://github.com/AndiBellstedt/DNSServer.DebugLogParser)
- PowerShell Gallery: [DNSServer.DebugLogParser](https://www.powershellgallery.com/packages/DNSServer.DebugLogParser)
