واحدة من أول الأمور التي يجب عليك القيام بها عند حل مشكلة مثل هذه هي تمكين تسجيل التصحيح لـ تسجيل DNS للتصحيح. ولكن عندما تجد نفسك مضطرًا للنظر في سجل التصحيح الذي يتم إنشاءه، فإنك على موعد مع مفاجأة غير سارة. اجعلها أسهل عن طريق إنشاء سكريبت محلل سجل تصحيح DNS باستخدام PowerShell!
كيفية إنشاء سكريبت تحليل سجل تصحيح DNS باستخدام PowerShell
لديك العديد من الخيارات المختلفة لإجراء التصحيح، ولكن في حالتي، أحتاج إلى مزيد من المعلومات بخصوص التحديثات الديناميكية. هذا هو شكل تكويني على أحد خوادم DNS الخاصة بي.

عند تمكين هذا، سيبدأ في إنشاء ملف تسجيل في المسار الذي تحدده والذي يبدو مشابهًا لهذا:

الصف الأول من السطور المشطبة هو عنوان IP والصف الأخير هو سجل DNS الذي حاول تحديثه. تم تشطيب هذه لأسباب واضحة. اعتمادًا على الخيارات التي تختارها، يمكن أن يصبح هذا الملف السجل ضخمًا وليس في أسهل صيغة للقراءة.
ماذا لو أردت تصفية مخرجات على سبيل المثال إلى عنوان IP واحد فقط أو تقييد ذلك في إطار زمني معين؟ لا يمكنك فعل ذلك باستخدام ملف السجل الافتراضي. هذا هو السبب في أنني قمت بإنشاء سكريبت محلل سجل تصحيح DNS باستخدام PowerShell.
السكريبت أدناه يأخذ هذا ملف السجل ويحلله إلى ملف CSV لطيف يبدو مشابهًا لهذا:

ذلك يبدو أفضل بكثير، أليس كذلك؟ يقوم البرنامج بفحص ملف السجل للعثور على أي أخطاء ويقوم بتحليل التاريخ وعنوان الآيبي والخطأ، ثم يضعها في ملف CSV بتنسيق جميل. كما يستبعد جميع عناوين آيبي لخوادم DNS.
لسبب ما، بغض النظر عن الخيار الذي تختاره، اكتشفت أن عناوين آيبي لخوادم DNS نفسها كانت تظهر بشكل متكرر. أحتاج فقط إلى معرفة عنوان الآيبي الخاص بالعميل الذي يواجه مشكلة في تحديث سجل 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 |