Een van de eerste dingen die je moet doen bij het oplossen van een probleem zoals dit, is het inschakelen van DNS-debuglogging. Maar wanneer je gedwongen bent om naar het door debuglogging gegenereerde logbestand te kijken, zul je onaangenaam verrast worden. Maak het gemakkelijker door een DNS-debuglogparser-script te maken met PowerShell!
Hoe je een DNS-debuglogparser kunt maken met PowerShell
Je hebt talloze verschillende opties om te debuggen, maar in mijn geval heb ik meer informatie nodig met betrekking tot dynamische updates. Dit is hoe mijn configuratie eruitziet op een van mijn DNS-servers.

Wanneer dit is ingeschakeld, begint het een logbestand aan te maken op de opgegeven bestandslocatie, dat er als volgt uitziet:

De eerste rij gemarkeerde regels is het IP-adres en de laatste rij is het DNS-record dat het probeerde bij te werken. Deze zijn gemarkeerd om voor de hand liggende redenen. Afhankelijk van de gekozen opties kan dit logbestand enorm worden en is het niet in het gemakkelijkste formaat om te lezen.
Wat als ik slechts één IP wil filteren of het wil beperken tot een bepaalde tijdsperiode? Dat kun je niet doen met het standaard logbestand. Daarom heb ik een DNS-debuglogparser-script gemaakt met PowerShell.
Het onderstaande script neemt dit logbestand en analyseert het in een mooi CSV-bestand dat er als volgt uitziet:

Dat ziet er veel beter uit, toch? Het script doorzoekt het logbestand op fouten en haalt de datum, IP en de fout eruit, en plaatst het in een mooi opgemaakte CSV. Het sluit ook alle DNS-server-IP’s uit.
Om de een of andere reden, ongeacht welke optie je kiest, merkte ik dat de DNS-server-IP’s zelf bleven verschijnen. Ik moet gewoon het IP-adres van de client weten dat problemen heeft met het bijwerken van zijn DNS-record.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#requires -Module ActiveDirectory | |
$dnsServer = ‘‘ ## This is the server name as a NETBIOS or FQDN | |
$OutputFilePath = ‘C:\DNSDebugLogSummary.csv‘ ## The CSV file that will be created | |
## The log file you specified in the debug logging dialog box | |
$DnsDebugLogFilePath = “\$dnsServer\c$\DnsDebugLog.log“ | |
## Find all of the DNS server IPs in the current domain | |
$DnsServerIPs = ((Get-ADDomain).ReplicaDirectoryServers | Resolve-DnsName).IPAddress | |
Write-Verbose –Message “Found DNS servers $($DnsServerIPs -join ‘,‘)“ | |
## Find all lines in the log file that don’t contain the strings ‘NOERROR’ or are blank. This | |
## retrieves only the lines with errors in them. | |
Select-String –Pattern ‘NOERROR|^\s*‘ –Path $DnsDebugLogFilePath -NotMatch | foreach { | |
try { | |
## Find lines containing an IP address | |
if ($_.Line -match ‘\b(?:\d{1,3}\.){3}\d{1,3}\b‘) { | |
Write-Verbose –Message ‘Found line with IP address.‘ | |
$IP = $Matches[0] | |
## If the IP isn’t a DNS server it must be a client IP | |
if ($DnsServerIPs -notcontains $IP) { | |
Write-Verbose “Processing IP ‘$IP‘“ | |
$Split = $_.Line.Split(‘ ‘) | |
$Date = $Split[0] | |
$Time = $Split[1] + $Split[2] | |
$Err = [regex]::Match($_.Line, ‘\[(.*)\]‘).Groups[1].Value | |
[pscustomobject]@{ ‘Date‘ = “$Date $Time“; ‘IP‘ = $IP; ‘Error‘ = $Err } | |
} | |
} | |
} catch { | |
Write-Warning $_.Exception.Message | |
} | |
} | Export-Csv –Path $OutputFilePath –Append –NoTypeInformation |