L’une des premières choses que vous devriez faire lorsque vous dépannez un problème comme celui-ci est d’activer le journal de débogage DNS. Mais lorsque vous êtes contraint de consulter le journal que crée le débogage, vous êtes confronté à un réveil brutal. Facilitez-vous la tâche en créant un script d’analyseur de journal de débogage DNS avec PowerShell!
Comment construire un analyseur de journal de débogage DNS avec PowerShell
Vous avez une multitude d’options différentes pour le débogage, mais dans mon cas, j’ai besoin de plus d’informations concernant les mises à jour dynamiques. Voici à quoi ressemble ma configuration sur l’un de mes serveurs DNS.

Lorsque cela est activé, cela commencera à créer un fichier journal dans le chemin d’accès que vous spécifiez, qui ressemble à ceci:

La première ligne des lignes barrées est l’adresse IP et la dernière ligne est l’enregistrement DNS qu’elle a tenté de mettre à jour. Ces lignes ont été barrées pour des raisons évidentes. Selon les options que vous choisissez, ce fichier journal peut devenir énorme et n’est pas dans le format le plus facile à lire.
Que se passe-t-il si je veux filtrer juste une seule IP ou la restreindre à une certaine période? Vous ne pouvez pas le faire avec le fichier journal par défaut. C’est pourquoi j’ai créé un script d’analyseur de journal de débogage DNS avec PowerShell.
Le script ci-dessous prend ce fichier journal et le convertit en un joli fichier CSV qui ressemble à ceci :

Cela semble bien meilleur, non ? Le script examine le fichier journal à la recherche d’erreurs et extrait la date, l’adresse IP et l’erreur, puis les place dans un fichier CSV bien formaté. Il exclut également toutes les adresses IP des serveurs DNS.
Pour une raison quelconque, peu importe l’option choisie, les adresses IP des serveurs DNS continuent de s’afficher. Je dois simplement connaître l’adresse IP du client qui rencontre un problème lors de la mise à jour de son enregistrement DNS.
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 |