Один из первых шагов, который следует предпринять при устранении проблемы подобного рода, – включить входную отладку DNS. Но когда вам приходится смотреть на созданный отладочный журнал, вы встретите неприятные сюрпризы. Упростите себе жизнь, создав сценарий разбора отладочного журнала DNS с помощью PowerShell!
Как создать разборщик отладочного журнала DNS с помощью PowerShell
У вас есть множество вариантов для отладки, но в моем случае мне нужна дополнительная информация о динамических обновлениях. Вот как выглядит моя конфигурация на одном из моих DNS-серверов.

Когда это включено, начнется создание файла журнала по указанному вами пути, который будет выглядеть примерно так:

Первая строка отмеченных линий – это IP-адрес, а последняя строка – запись DNS, которую он пытался обновить. Они были отмечены по очевидным причинам. В зависимости от выбранных вами параметров этот файл журнала может стать огромным и не всегда удобен для чтения.
Что если я хочу отфильтровать только один IP-адрес или сузить диапазон по определенному временному интервалу? Вы не можете сделать это с помощью стандартного файла журнала. Вот почему я создал сценарий разбора отладочного журнала DNS с помощью PowerShell.
Приведенный ниже сценарий берет этот файл журнала и разбирает его в удобный файл CSV, который выглядит следующим образом:

Это выглядит намного лучше, не правда ли? Скрипт просматривает файл журнала на наличие ошибок и извлекает дату, IP и ошибку, затем помещает их в красиво оформленный CSV. Также исключаются все IP-адреса DNS-серверов.
По какой-то причине, независимо от выбранного варианта, я обнаружил, что IP-адреса самих DNS-серверов все равно появляются. Мне просто нужно знать IP-адрес клиента, у которого возникают проблемы с обновлением его 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 |