2012年5月28日月曜日

WindowsのDNSサーバのAレコードの消失等を監視するPowerShellスクリプト

このエントリは、ほぼ自分用です。
設定ファイルの仕様など、かなり手抜きなので、コピペでの利用はおすすめしません。

WindowsのDNSサーバに静的に登録したAレコードが、なぜか動的レコードに突然変わったり、気がついたら消えているという現象に悩まされた(NETLOGONサービスが悪さをしている模様?)。
原因は追究できていないのだが、とりあえずレコードの状態を監視しようということでPowerShellスクリプトを書いた。
仕様
  • 監視したいレコードの一覧をテキストファイルで定義。 
  • Aレコードが見つからなかった(消えていた)ら、イベントログにErrorを出力。 
  • Aレコードが動的に変わっていたら、イベントログにWarningを出力。 
レコード一覧ファイルの書式
1
2
3
4
5
dnsserver1 ←1行目にDNSサーバ名を記述(FQDNでもよい)
example.com ←2行目はチェック対象とするゾーン名を記述
server1.example.com ←3行目以降にチェック対象レコードを列挙
server2.example.com
....
コード
CheckDnsRecords.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# CheckDnsRecords.ps1
# 2012.05.16 dsp74118
# Usage: CheckDnsRecords.ps1 <record list file>
# Record list file Format:
#  Line 1: DNS server name
#  Line 2: DNS container(Zone) name
#  Line 3-: Records
 
$MYPATH = [System.IO.Path]::GetDirectoryName($myInvocation.Mycommand.Definition)
 
If ($args.length -lt 1) {
 "Usage: CheckDnsRecords.ps1 <record list file>"
 Exit 1
}
 
$basename = (Get-ChildItem -Path $args | ForEach-Object {$_.basename})
$logfile = "$MYPATH\$basename" + "_log.log"
 
# Init Log
function InitLog($str) {
 $str | Out-File -FilePath $logfile
}
 
# Log Writer
function WriteLog($str) {
 $str | Out-File -FilePath $logfile -Append
}
 
# Warning Log Writer
function WriteWarning($str, $eventId) {
 "Warning: $str" | Out-File -FilePath $logfile -Append
 [Diagnostics.EventLog]::WriteEntry("CheckDnsRecords", $str, "Warning", $eventId)
}
 
# Error Log Writer
function WriteError($str, $eventId) {
 "Error: $str" | Out-File -FilePath $logfile -Append
 [Diagnostics.EventLog]::WriteEntry("CheckDnsRecords", $str, "Error", $eventId)
}
 
# Log Initgetialize
InitLog((Get-Date).datetime + " Check Start.")
 
# Read Record list
$servers = get-content -Path "$args"
 
$DNSServer = $servers[0]
$Container = $servers[1]
 
# Get A-Records
$records = Get-WmiObject -class MicrosoftDNS_AType -Namespace "root\MicrosoftDNS" `
 -computerName $DNSServer -Filter "ContainerName='$Container'" | `
 Select-Object -property OwnerName,RecordData,Timestamp
 
# Get OwnerName(hostname) into array
$ownernames = @()
foreach ($record in $records) {
 $ownernames += $record.OwnerName.ToString()
}
 
# Check record existence.
for ($i = 2; $i -lt $servers.length; $i++) {
 $server = $servers[$i]
 if (($ownernames -contains $server) -eq $true) {
  WriteLog($server + " のAレコードの存在を確認しました。" )
  $a = $records | where-object {$_.OwnerName -eq $server}
  if ($a.Timestamp -ne 0) {
   WriteWarning "$server のAレコードが動的レコードになっています。" 60002
  }
 } else {
  WriteError "$server のAレコードが存在しません。" 60001
 }
}
 
# End Of Script
WriteLog((Get-Date).datetime + " Check End.")

0 コメント:

コメントを投稿