作成 2010.01.07
更新 2011.04.24
更新 2011.04.24
VBScript で DNS リゾルバの設定
コード
' DNS リゾルバの変更 ' 動作仕様 ' 動作確認OS ' Windows 2000 Professional SP4 ' Windows XP Professional SP3 ' 基本機能 ' プライベートIPアドレスのNICのDNSリゾルバを変更します。 ' 以下の状態であればエラーメッセージを出して終了します ' DNS の変更権限がない場合 ' DHCP が有効のNICしか見つからない場合 ' DNS リゾルバが設定済みの場合 ' プライベートIPアドレスが設定されているNICが1つも見つからない場合 ' 複数IPアドレスが設定されているNICで、ひとつでもプライベートIPアドレスでない場合 ' その他 ' 複数NICが存在する可能性を想定しています。(無線、有線のノートパソコンなど) ' ひとつのNICで複数IPアドレスがある可能性を想定しています。 ' 複数NICがある場合で、プライベートアドレスのみのNICは全て設定します。 ' IPv6 は想定していません。 ' 無効化しているNICは無視します。 ' ////////////////////////////////// Option Explicit ' 設定するDNSサーバーアドレス Const DNS_SERVERS = "192.168.0.10,192.168.10.10" ' ////////////////////////////////// ' DHCP が有効だったら停止 Const STOP_ON_DHCP = True ' IPv6 は無視 Const IGNORE_IPV6 = True ' ////////////////////////////////// Const WMI_QUERY = "Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = TRUE" Dim wmiLocator Dim wmiService Dim objEnumerator Dim objInstance Dim arrayDNS Dim newDNS_SERVERS Dim oldDNS_SERVERS Dim strAddress Dim strDNS Dim dnsCount Dim dnsMismatch Dim IsDhcp Dim IsComplete Dim IsPrivate Dim IsGlobal Dim AnError Dim IsAlreadySet Set wmiLocator = CreateObject("WbemScripting.SWbemLocator") Set wmiService = wmiLocator.ConnectServer IsDhcp = False IsComplete = False IsGlobal = False AnError = 0 IsAlreadySet = False arrayDNS = Split(DNS_SERVERS, ",") newDNS_SERVERS = "" ' DNS_SERVERS の整形 For dnsCount = 0 To UBound(arrayDNS) strDNS = Trim(arrayDNS(dnsCount)) If Len(strDNS) > 0 Then If dnsCount = 0 Then newDNS_SERVERS = strDNS Else newDNS_SERVERS = newDNS_SERVERS & "," & strDNS End If End If Next arrayDNS = Split(newDNS_SERVERS, ",") ' 設定するNICの検出 Set objEnumerator = wmiService.ExecQuery(WMI_QUERY) For Each objInstance In objEnumerator If STOP_ON_DHCP And objInstance.DHCPEnabled Then IsDhcp = True Else ' WScript.Echo objInstance.Index IsPrivate = True For Each strAddress In objInstance.IPAddress If Len(strAddress) < 1 Then IsPrivate = False If Not IsPrivateAddress(strAddress) Then IsPrivate = False Next If IsPrivate Then ' DNS が設定済みか確認する dnsCount = 0 dnsMismatch = False oldDNS_SERVERS = "" On Error Resume Next For Each strDNS In objInstance.DNSServerSearchOrder If dnsCount = 0 Then oldDNS_SERVERS = Trim(strDNS) Else oldDNS_SERVERS = oldDNS_SERVERS & "," & Trim(strDNS) End If dnsCount = dnsCount + 1 Next If Err.Number <> 0 Then ' DNSの設定が無ければ該当する dnsMismatch = True ElseIf Not oldDNS_SERVERS = newDNS_SERVERS Then dnsMismatch = True End If On Error Goto 0 If dnsMismatch Then ' DNS リゾルバを設定する AnError = objInstance.SetDNSServerSearchOrder(arrayDNS) If AnError = 0 Then IsComplete = True Else IsComplete = True IsAlreadySet = True End If Else IsGlobal = True End If End If Next If IsComplete Then If IsAlreadySet Then WScript.Echo "このコンピュータは設定済みです。" Else WScript.Echo "設定終了しました。" End If ElseIf AnError <> 0 Then WScript.Echo "エラーが発生しました。設定する権限が無いようです" ElseIf IsDhcp Then WScript.Echo "DHCPのため設定しませんでした" ElseIf IsGlobal Then WScript.Echo "プライベートIPが見つからなかったため設定しませんでした" Else WScript.Echo "NICが見つかりませんでした。" End If ' プライベートアドレスか判断する ' プライベートアドレスだったら True Function IsPrivateAddress(strAddress) Dim returnValue Dim regEx Dim Matches Dim Match Dim intA(2) Dim count returnValue = False Set regEx = New RegExp regEx.Pattern = "^\d+\.\d+\.\d+\.\d+$" regEx.Global = False regEx.IgnoreCase = False If regEx.Test(strAddress) Then regEx.Pattern = "\d+" regEx.Global = True Set Matches = regEx.Execute(strAddress) count = 0 For Each Match In Matches intA(count) = CInt(Match) count = count + 1 If count >= 2 Then Exit For Next If intA(0) = 10 Then returnValue = True ElseIf intA(0) = 172 And intA(1) >= 16 And intA(1) < 32 Then returnValue = True ElseIf intA(0) = 192 And intA(1) = 168 Then returnValue = True End If Else If IGNORE_IPV6 Then ' IPv6 は判断しない returnValue = True Else ' fe8,fe9,fea,feb,fc,fd がプライベートアドレス regEx.Pattern = "^f(e8|e9|ea|eb|c|d)" regEx.IgnoreCase = True If regEx.Test(strAddress) Then returnValue = True End If End If End If IsPrivateAddress = returnValue End Function
変更履歴
- 2010/02/21 既存のプライマリDNSが同じで新しいDNSの方が数が多いと更新されない問題を修正