タグ
  ANSI (1)
  ASP.NET (10)
  Active Directory (55)
  BAT (16)
  Backup (2)
  CSharp (11)
  CentOS (4)
  C言語 (4)
  DNS (4)
  Excel (3)
  FFmpeg (1)
  Fedora (4)
  FreeBSD (6)
  IPv6 (3)
  Java (11)
  JavaScript (8)
  LAN (1)
  Link (4)
  Linux (15)
  Mac (1)
  Mail (2)
  Microsoft (3)
  NIS (1)
  Node.js (6)
  OpenIndiana (1)
  OpenLDAP (2)
  OpenSSL (1)
  OpenSolaris (4)
  PHP (2)
  Perl (2)
  Postfix (1)
  PostgreSQL (2)
  PowerShell (34)
  RFC (3)
  SQL Server (5)
  Solaris (10)
  Ubuntu (9)
  VBScript (73)
  VCpp (2)
  VMware (3)
  Visual Basic (1)
  WMI (17)
  WSF (5)
  WSH (10)
  Windows (19)
  bash (1)
  bind (1)
  iSCSI (1)
  おまけ (3)
  作成中 (8)
  慣用句 (3)
  正規表現 (6)
  運用 (8)
作成 2010.01.07
更新 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の方が数が多いと更新されない問題を修正
[リロード] [記事修正] [新規作成] [使用方法]
©2004-2012 UPKEN IPv4