自动配置客户端上的 TCP/IP 网络

第 5 部分:使用脚本来管理客户端上的 DNS

发布日期: 2004年11月16日

域名系统 (DNS) 是在大多数 TCP/IP 网络上使用的主要名称解析机制,也是 Windows 2000、Windows XP、Windows Server 2003 的默认名称解析协议。现在,与 DHCP 服务器一起运行时,使用 DNS 动态更新的 DNS 服务器可以自动完成许多以前由手动配置的 HOSTS 文件处理的名称解析工作。DNS 还可以与 Active Directory 进行集成,从而使名称解析与目录管理结合起来。

当客户端使用 DHCP 时,它们还可以从 DHCP 服务器获取 DNS 配置。图 10 显示了“Internet 协议 [TCP/IP] 属性”对话框(可通过“网络连接”进行访问);您可以通过单击该对话框中的“自动获得 DNS 服务器地址”单选按钮来指定该设置。这样,无须使用脚本,DHCP 就可帮助您自动完成客户端上的 DNS 设置。

05ATNC01.gif

图 10   使用 Windows 界面自动完成客户端上的 DNS 设置
查看大图

Ipconfig.exe 命令行工具也可以检索 DNS 客户端设置,并执行清除 DNS 客户端解析程序缓存之类的任务。

不过,在某些情况(例如,使用新的 DNS 服务器替换旧的 DNS 服务器,在服务器上进行更改,或者更改子网配置)下,您需要以远程方式配置 DNS 客户端,或者需要成批地进行配置。在这些情况下,手动配置各个主机是无法高效利用管理时间的。与其他 TCP/IP 协议一样,WMI 提供了 Win32_NetworkAdapterConfiguration 类的一些方法和属性,可用来自动完成 DNS 客户端配置。

注意,Win32_ NetworkAdapterConfiguration 没有提供任何与“自动获得 DNS 服务器地址”设置显式对应的属性或方法。DNSServerSearchOrder 属性显示客户端上配置的任何 DNS 服务器的 IP 地址,无论这些地址是在本地设置的,还是从 DHCP 服务器获得的。

或者,您也可以通过使用 DhcpNameServer 和 NameServer 这两个注册表项来检索或设置与“自动获得 DNS 服务器地址”相对应的值;您可以从下面的注册表位置找到这两项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
\{AdapterIdentifier}

如果 NameServer 的值为空,则客户端将尝试自动从 DHCP 服务器获得一个 DNS 服务器地址。如果 NameServer 的值中包含一个 IP 地址,则该 IP 地址将替代从 DHCP 服务器获得的任何 DNS 服务器地址。在这种情况下,DhcpNameServer 注册表项中的任何值都不会出现在对话框中。

WMI 还包含了一个 DNS 服务器提供程序(最初包含在 Windows 2000 Resource Kit 中;现在是 Windows Server 2003 操作系统的一部分),它可帮助您使用脚本来自动完成服务器操作。有关通过脚本来使用 DNS 服务器提供程序的信息不在本文的讨论范围之内。

命令行工具 Dnscmd.exe 也提供了许多用于 DNS 服务器配置的选项。

本节提供了用于执行以下任务的脚本步骤和示例脚本:

显示 DNS 客户端信息。

启用 DNS。

更改 DNS 服务器搜索顺序、DNS 域、DNS 域后缀搜索顺序和 DNS 注册设置。

本页内容
显示 DNS 客户端信息显示 DNS 客户端信息
启用 DNS启用 DNS
更改 DNS 服务器搜索顺序更改 DNS 服务器搜索顺序
更改 DNS 域更改 DNS 域
更改 DNS 域后缀搜索顺序更改 DNS 域后缀搜索顺序
更改动态 DNS 注册设置更改动态 DNS 注册设置
方案:更改 DNS 服务器和域方案:更改 DNS 服务器和域
通过脚本管理客户端上 DNS 所用的工具通过脚本管理客户端上 DNS 所用的工具

显示 DNS 客户端信息

与 DHCP 一样,在您管理客户端上的 DNS 时,第一步通常是确定当前的设置。图 11 显示了“高级 TCP/IP 设置”对话框的“DNS”选项卡,它提供了一种通过 Windows 界面访问这些设置的方法。

05ATNC02.gif

图 11   使用 Windows 界面显示当前的 DNS 设置
查看大图

对于使用 WMI 的脚本,Win32_NetworkAdapterConfiguration 类提供了几个属性,可帮助您使用脚本来管理 DNS 客户端配置。表 13 描述了这些 DNS 属性。

表 13   Win32_NetworkAdapterConfiguration 的 DNS 属性

属性类型说明

DNSDomain

字符串

后跟一个句点和一个扩展名(指示组织类型)的组织名称,例如 microsoft.com。该名称可以是字母 A–Z、数字 0–9 和连字符 (-) 的任意组合,再加上用作分隔符的句点 (.) 字符。

示例:“microsoft.com”

DNSDomainSuffixSearchOrder

字符串

在名称解析期间,附加到主机名末尾的 DNS 域后缀的列表(各后缀之间以空格分隔)。当尝试仅从一个主机名来解析一个完全限定的域名 (FQDN) 时,系统将首先附加本地域名。如果不成功,系统将使用域后缀列表来创建其他的 FQDN(按照列表中的顺序),并为各个 FQDN 查询 DNS 服务器。

示例:“samples.microsoft.com example.microsoft.com”

DNSEnabledForWINSResolution

布尔

如果为 True,则为通过 Windows Internet 名称服务 (WINS) 解析进行的名称解析启用 DNS。如果无法使用 DNS 对名称进行解析,则将该名称请求转发到 WINS 来进行解析。

DNSHostName

字符串

用于标识本地计算机的主机名,供某些实用工具用来进行身份验证。其他基于 TCP/IP 的实用工具可以使用此值来获取本地计算机的名称。主机名存储在 DNS 服务器上的一个表中,该表将这些名称映射到 IP 地址供 DNS 使用。此名称可以是字母 A–Z、数字 0–9 和连字符 (-) 的任意组合,再加上用作分隔符的句点 (.) 字符。默认情况下,此值是 Microsoft 网络计算机名称,但是,网络管理员可以分配另一个主机名,而不会影响计算机名称。

示例:“corpdns”

DNSServerSearchOrder

字符串数组

用于查询 DNS 服务器的服务器 IP 地址的数组。

DomainDNSRegistrationEnabled

布尔

如果为 True,则此连接的 IP 地址除了在计算机的完整 DNS 名称下进行了注册外,还在 DNS 中此连接的域名下进行了注册。此连接的域名可以使用 SetDNSDomain() 方法来设置,也可以由 DHCP 分配。注册的名称是附加了域名的计算机主机名。此属性是 Windows XP 中的新增属性。

FullDNSRegistrationEnabled

布尔

如果为 True,则此连接的 IP 地址在 DNS 中计算机的完整 DNS 名称下进行了注册。计算机的完整 DNS 名称显示在“控制面板”中的“系统”应用程序的“网络标识”选项卡上。此属性是 Windows XP 中的新增属性。

上表中的所有属性都是只读的。

表 14 介绍了用于通过脚本管理 DNS 客户端配置的 Win32_NetworkAdapterConfiguration 方法。

表 14   Win32_NetworkAdapterConfiguration 的 DNS 方法

方法参数说明

EnableDNS

DNSHostName — 字符串
DNSDomain — 字符串
DNSServerSearchOrder — 字符串数组
DNSDomainSuffixSearchOrder — 字符串

在客户端启用 DNS。

SetDNSDomain

DNSDomain — 字符串

用于设置 DNS 域。这是一个实例相关的方法调用,它是基于每个适配器来应用的。在 Windows 2000 中,此设置应用于目标适配器。在 Windows NT 4.0 中,此设置是全局设置。

SetDNSServerSearchOrder

DNSServerSearchOrder — 字符串数组

使用一个字符串元素数组来设置服务器搜索顺序。要从搜索顺序中删除所有 DNS 服务器,必须使用 Null 而不是空字符串。这是一个实例相关的方法调用,它是基于每个适配器来应用的。在指定使用 DHCP 而不是静态 DNS 服务器来启动静态 DNS 服务器后,您不需要提供“in”参数就可以调用此方法。在 Windows 2000 中,此设置应用于目标适配器。在 Windows NT 4.0 中,此设置是全局设置。

SetDNSSuffixSearchOrder

DNSDomainSuffixSearchOrder — 字符串

静态方法。使用一个字符串元素数组来设置后缀搜索顺序。只有在 Windows NT 中,这才是一个独立于实例且应用于所有适配器的调用。

SetDynamicDNSRegistration

FullDNSRegistrationEnabled — 布尔
DomainDNSRegistrationEnabled — 布尔

指示这个绑定了 IP 的适配器的 IP 地址的动态 DNS 注册模式。

上表中的所有方法都返回一个正整数:

0 表示成功完成。

1 表示成功完成,并需要重新启动。

大于 1 的数字表示出现了某种问题,方法无法完成。WMI SDK 列出了这些方法的返回值的含义。

下面的脚本 Dnssettings.vbs 显示了 Win32_NetworkAdapterConfiguration 公开的与 DNS 相关的设置。DNSEnabledForWINSResolution 属性仅在使用了 NetBIOS 名称解析时才有意义;本文的 WINS 一节的设置脚本中讲到了该属性。在 Windows Server 2003 中,您还可以从 Win32_ComputerSystem 类的 DNSHostName 属性读取主机名;在较早版本的操作系统上,如果 NetBIOS 名称不同于 DNS 名称(取决于客户端和网络配置),这个 Name 属性可能会返回 NetBIOS 名称。

脚本步骤

列表 28 显示了计算机上的各个网络适配器配置的 DNS 客户端设置。

1.

创建一个变量,并将计算机的名称分配给它。对于本地计算机,将“.”指定为计算机的名称即可。若要远程运行这个脚本,请指定网络上一台您拥有管理权限且可访问的远程计算机的名称。名称的形式可以是主机名,也可以是 IP 地址。

2.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

3.

使用 ExecQuery 方法查询 Win32_NetworkAdapterConfiguration 类,并使用“WHERE IPEnabled = True”来筛选 WQL 查询。

这将返回一个集合,它由启用了 IP 的计算机上的所有网络适配器配置组成。

4.

对于集合中的每个网络适配器配置,请执行以下任务。

5.

将 DNSHostName、Index、Description、DNSDomain、DomainDNSRegistrationEnabled 和 FullDNSRegistrationEnabled 这几个 Win32_NetworkAdapterConfiguration 属性分配给变量。

6.

循环访问由 DNSDomainSuffixSearchOrder 和 DNSServerSearchOrder 属性返回的数组,并将它们转换为带格式的字符串。

7.

将这些变量和标签连接成一个字符串。每次循环访问另一个网络适配器时,都将该适配器的字符串连接到原来的这个字符串上。

8.

显示主机名和每个适配器的设置。

列表 28   Dnssettings.vbs

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
On Error Resume Next
 
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  strDNSSuffixSO = ""
  strDNSServerSO = ""
  strDNSHostName = objNicConfig.DNSHostName
  strIndex = objNicConfig.Index
  strDescription = objNicConfig.Description
  strDNSDomain = objNicConfig.DNSDomain
  strDNSSuffixSO = ""
  If Not IsNull(objNicConfig.DNSDomainSuffixSearchOrder) Then
    For Each strDNSSuffix In objNicConfig.DNSDomainSuffixSearchOrder
      strDNSSuffixSO = strDNSSuffixSO & VbCrLf & String(37, " ") & _
 strDNSSuffix
    Next
  End If
  strDNSServerSO = ""
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      strDNSServerSO = strDNSServerSO & VbCrLf & String(37, " ") & _
 strDNSServer
    Next
  End If
  strDomainDNSRegistrationEnabled = _
 objNicConfig.DomainDNSRegistrationEnabled
  strFullDNSRegistrationEnabled = objNicConfig.FullDNSRegistrationEnabled
  strDNSSettings = strDNSSettings & VbCrLf & VbCrLf & _
   "  Network Adapter " & strIndex & VbCrLf & _
   "    " & strDescription & VbCrLf & VbCrLf & _
   "    DNS Domain:                      " & strDNSDomain & VbCrLf & _
   "    DNS Domain Suffix Search Order:" & strDNSSuffixSO & VbCrLf & _
   "    DNS Server Search Order:" & strDNSServerSO & VbCrLf & _
   "    Domain DNS Registration Enabled: " & _
   strDomainDNSRegistrationEnabled & VbCrLf & _
   "    Full DNS Registration Enabled:   " & _
   strFullDNSRegistrationEnabled
Next
 
WScript.Echo VbCrLf & "DNS Settings" & VbCrLf & VbCrLf & _
 "Host Name: " & strDNSHostName & strDNSSettings

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dnssettings.vbs

 

DNS Settings

 

Host Name: client1

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

 

    DNS Domain:

    DNS Domain Suffix Search Order:

    DNS Server Search Order:

                                     192.168.0.1

    Domain DNS Registration Enabled:

    Full DNS Registration Enabled:

启用 DNS

当主机上必须启用 DNS 时,例如,从另一种名称解析系统(例如 WINS)升级网络时,可以使用 Win32_NetworkAdapterConfiguration 提供的 EnableDNS() 方法。

该方法有四个可选参数:DNSHostName、DNSDomain、DNSServerSearchOrder 和 DNSDomainSuffixSearchOrder。前两个和最后一个参数的数据类型是字符串,DNSServerSearchOrder 的数据类型是字符串数组。

Win32_ComputerSystem 类包含一个 Rename() 方法,您也可以使用它来更改计算机名称。要使用 Rename() 方法,您必须是本地管理员组的成员。注意,您不能使用该方法来重命名域中的远程主机。此类还公开了 JoinDomainOrWorkgroup() 和 UnjoinDomainOrWorkgroup() 两个方法。所有这三种方法都是 Windows XP 和 Windows Server 2003 中的新增方法。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

列表 29 为计算机上的所有网络适配器启用 DNS,将主机名配置为 client1,将 DNS 域配置为 fabrikam.com,将 DNS 服务器搜索顺序配置为 192.168.0.1、192.168.0.2,并将 DNS 搜索顺序后缀设置为 fabrikam.com 和 na.fabrikam.com。

要执行此任务,脚本必须执行下列步骤:

1.

创建一些变量以指定计算机名称和要传递给 EnableDNS 方法的参数。

2.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

3.

使用 ExecQuery 方法查询 Win32_NetworkAdapterConfiguration 类,筛选那些启用了 IP 的实例。

这将返回一个由计算机上的所有网络适配器配置组成的集合。

4.

对于集合中的每个网络适配器配置,请执行以下任务。

5.

显示网络适配器的索引号和说明。

6.

调用 EnableDNS 方法,并将那些已使用主机名、域、DNS 服务器搜索顺序和 DNS 域后缀搜索顺序初始化的变量传递给它。

7.

检查该方法返回的值,并相应地显示一条成功或错误信息。

8.

重新查询 Win32_NetworkAdapterConfiguration 并显示该操作完成后的配置。

列表 29   Dns-enable.vbs

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
On Error Resume Next
 
strComputer = "."
strDNSHostName = "client1"
strDNSDomain = "fabrikam.com"
arrDNSServerSearchOrder = Array("192.168.0.1", "192.168.0.2")
arrDNSDomainSuffixSearchOrder = Array("hr.fabrikam.com", "contoso.com")
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNicConf = objWMIService.Get("Win32_NetworkAdapterConfiguration")
 
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName & VbCrLf & _
 "  Attempting to enable DNS"
intEnableDNS = objNicConf.EnableDNS(strDNSHostName, strDNSDomain, _
 arrDNSServerSearchOrder, arrDNSDomainSuffixSearchOrder)
If intEnableDNS = 0 Then
  WScript.Echo "  Successfully enabled DNS."
ElseIf intEnableDNS = 1 Then
  WScript.Echo "  Successfully enabled DNS." & VbCrLf & "    Must reboot."
Else
  WScript.Echo "  Unable to enable DNS."
End If
 
WScript.Echo VbCrLf & String(80,"-")
 
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index & _
 VbCrLf &   "    " & objNicConfig.Description
  WScript.Echo "    DNS Domain: " & objNicConfig.DNSDomain
  WScript.Echo "    DNS Server Search Order:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  WScript.Echo "    DNS Domain Suffix Search Order:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSDomainSuffix In objNicConfig.DNSDomainSuffixSearchOrder
      WScript.Echo "        " & strDNSDomainSuffix   
    Next
  End If
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-enable.vbs

 

DNS Host Name: client1

  Attempting to enable DNS

  Unable to enable DNS.

 

--------------------------------------------------------------------------------

 

 

DNS Host Name: client1

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

    DNS Domain:

    DNS Server Search Order:

        192.168.0.1

    DNS Domain Suffix Search Order:

        hr.fabrikam.com

        contoso.com

更改 DNS 服务器搜索顺序

如果您没有使用 DHCP 来为客户端确定 DNS 服务器,则您可以为各个客户端配置一个包含一台或多台 DNS 服务器的列表(按优先级排列),用以进行 DNS 名称解析。Win32_NetworkAdapterConfiguration 提供了一个 DNSServerSearchOrder 属性,该属性以字符串数组的形式包含该列表;还提供了一个可用来修改该属性的 SetDNSServerSearchOrder 方法。

对于该属性和方法,列表中的第一台服务器是该网络适配器的主 DNS 服务器。使用这个方法,您可以使用新的 DNS 服务器列表来替换原来的列表,还可以删除或替换任意位置的一个或多个成员。完成这些更改所用的脚本技术因您要执行的更改而异。要从搜索顺序中删除所有 DNS 服务器,必须使用 Null 而不是空字符串。

本节提供了用于执行以下任务的脚本步骤和示例脚本:

替换整个 DNS 服务器搜索顺序列表。

使用一台 DNS 服务器替换另一台 DNS 服务器。

将一台 DNS 服务器添加到搜索顺序的末尾或开头。

替换 DNS 服务器搜索顺序列表

如果必须更改 DNS 服务器的搜索顺序,最简单的方法就是将整个列表换成一个新的搜索顺序列表。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

列表 30 将各个网络适配器的当前 DNS 服务器搜索顺序列表替换成了一个新的列表。

1.

创建一个变量以指定计算机名称。

2.

为一个表示新的 DNS 服务器搜索顺序的数组分配 IP 地址。注意,要从搜索顺序中删除所有 DNS 服务器,您必须使用 Null 而不是空字符串。

3.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

4.

使用 ExecQuery 方法查询 Win32_NetworkAdapterConfiguration 类,并使用“WHERE IPEnabled = True”来筛选 WQL 查询。

这将返回一个集合,它由启用了 IP 的计算机上的所有网络适配器配置组成。

5.

对于集合中的每个网络适配器配置,请执行以下任务。

6.

显示网络适配器的索引和当前 DNS 服务器搜索顺序列表。

7.

调用 Win32_NetworkAdapterConfiguration 类的 SetDNSServerSearchOrder 方法,并将表示新的 DNS 服务器搜索顺序的 IP 地址数组作为参数传递给该方法。

8.

检查该方法返回的值,并显示一条成功或错误信息。

9.

重新查询 Win32_NetworkAdapterConfiguration 并显示新的 DNS 服务器搜索顺序。

列表 30   Dns-replaceserverlist.vbs

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
On Error Resume Next
 
strComputer = "."
arrNewDNSServerSearchOrder = Array("192.168.0.1", "192.168.0.2")
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
WScript.Echo VbCrLf & "Computer: " & strComputer
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - Before:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  intSetDNSServers = _
   objNicConfig.SetDNSServerSearchOrder(arrNewDNSServerSearchOrder)
  If intSetDNSServers = 0 Then
    WScript.Echo "    Replaced DNS server search order list."
  Else
    WScript.Echo "    Unable to replace DNS server search order list."
  End If
Next
 
WScript.Echo VbCrLf & String(80, "-")
 
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - After:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-replaceserverlist.vbs

 

Computer: .

 

  Network Adapter 1

    DNS Server Search Order - Before:

        192.168.0.1

    Replaced DNS server search order list.

 

--------------------------------------------------------------------------------

 

 

  Network Adapter 1

    DNS Server Search Order - After:

        192.168.0.1

        192.168.0.2

使用一台 DNS 服务器替换另一台 DNS 服务器

如果只有一台 DNS 服务器发生了更改而其他的服务器仍然有效,则只需要使用新的服务器的 IP 地址替换旧的服务器的 IP 地址,并将该地址保存在搜索顺序中的原位置。当运行在旧硬件上的 DNS 服务器被新的计算机取代时,就可能需要这样做。完成此更改后,必须使用新服务器的 IP 地址重新配置被替换的服务器的客户端。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

列表 31 检查了一台给定服务器的 IP 地址是否在一台计算机上各个网络适配器配置的 DNS 服务器搜索顺序列表(包含在 DNSServerSearchOrder 属性的一个字符串数组中)中。如果找到了该 IP 地址,脚本便删除它,并使用 SetDNSServerSearchOrder 方法将新服务器的 IP 地址添加到它所在的位置。

1.

创建一个变量以指定计算机名称。

2.

向表示要替换的旧 DNS 服务器和新服务器的变量分配 IP 地址。

3.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

4.

使用 ExecQuery 方法查询 Win32_NetworkAdapterConfiguration 类,并使用“WHERE IPEnabled = True”来筛选 WQL 查询。

这将返回一个集合,它由启用了 IP 的计算机上的所有网络适配器配置组成。

5.

对于集合中的每个网络适配器配置,请执行以下任务。

6.

显示网络适配器的索引和当前 DNS 服务器搜索顺序列表。

7.

使用一个 For 循环来循环访问 DNS 服务器 IP 地址列表;如果发现了要替换的 IP 地址,则使用新的 IP 地址替换它并设置一个布尔型标志。

8.

如果将该标志设置为 True,则调用 Win32_NetworkAdapterConfiguration 类的 SetDNSServerSearchOrder 方法,并将更新后的 IP 地址数组(表示新的 DNS 服务器搜索顺序)作为参数传递给该方法。

9.

检查该方法返回的值,并显示一条成功或错误信息。

10.

如果没有发现要替换的 IP 地址,则显示一条消息。

11.

重新查询 Win32_NetworkAdapterConfiguration 并显示新的 DNS 服务器搜索顺序。

列表 31   Dns-replaceserver.vbs

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
On Error Resume Next
 
strComputer = "."
strOldDNSServer = "192.168.0.2"
strNewDNSServer = "192.168.0.5"
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
WScript.Echo VbCrLf & "Computer: " & strComputer
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  arrDNSServerSearchOrder = objNicConfig.DNSServerSearchOrder
  WScript.Echo "    DNS Server Search Order - Before:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  blnFound = 0
  For i = 0 to UBound(arrDNSServerSearchOrder)
    If arrDNSServerSearchOrder(i) = strOldDNSServer Then
      arrDNSServerSearchOrder(i) = strNewDNSServer
      blnFound = 1
    End If
  Next
  If blnFound Then
    retSetDNS = objNicConfig.SetDNSServerSearchOrder(arrDNSServerSearchOrder)
    If retSetDNS = 0 Then
      WScript.Echo "    Replaced " & strOldDNSServer & " with " & _
       strNewDNSServer & " in DNS search order."
    Else
      WScript.Echo "    Unable to change DNS server search order."
    End If
  Else
    WScript.Echo "    DNS server " & strOldDNSServer & " not found."
  End If
Next
 
WScript.Echo VbCrLf & String(80, "-")
 
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - After:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-replaceserver.vbs

 

Computer: .

 

  Network Adapter 1

    DNS Server Search Order - Before:

        192.168.0.3

        192.168.0.1

        192.168.0.2

        192.168.0.4

    Replaced 192.168.0.2 with 192.168.0.5 in DNS search order.

 

--------------------------------------------------------------------------------

 

 

  Network Adapter 1

    DNS Server Search Order - After:

        192.168.0.3

        192.168.0.1

        192.168.0.5

        192.168.0.4

在搜索顺序的末尾添加一台 DNS 服务器

有时,您需要做的不是使用一台新 DNS 服务器的 IP 地址替换 DNS 服务器搜索列表中的一台旧服务器的 IP 地址,而是在列表的末尾添加新的服务器。此脚本说明了如何完成此操作。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

列表 32 将一台新的 DNS 服务器添加到一台计算机上的各个网络适配器配置的 DNS 服务器搜索顺序列表末尾。

1.

创建一个变量以指定计算机名称。

2.

向表示新 DNS 服务器的变量分配一个新 IP 地址。

3.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

4.

使用 ExecQuery 方法查询 Win32_NetworkAdapterConfiguration 类,并使用“WHERE IPEnabled = True”来筛选 WQL 查询。

这将返回一个集合,它由启用了 IP 的计算机上的所有网络适配器配置组成。

5.

对于集合中的每个网络适配器配置,请执行以下任务。

6.

创建变量 intNewArraySize,并在循环的开头将此变量设置为 0,以清除那些来自以前循环的值。

7.

显示网络适配器的索引和当前 DNS 服务器搜索顺序列表。

8.

将 DNSServerSearchOrder 属性返回的数组分配给变量 arrDNSServerSearchOrder。

9.

在第 20 行(使用 VBScript ReDim 语句)重新设置 arrDNSServerSearchOrder 的维数,让数组元素的数目增加 1 以便容纳新的 DNS 服务器 IP 地址。注意,在 VBScript 中,ReDim 语句使用的数目是结果数组的大小减 1。

10.

将新 DNS 服务器的 IP 地址分配给最后一个数组元素。

11.

调用 Win32_NetworkAdapterConfiguration 的 SetDNSServerSearchOrder 方法,并将更改后的 IP 地址数组传递给该方法。

12.

检查该方法返回的值,并显示一条成功或错误信息。

13.

重新查询 Win32_NetworkAdapterConfiguration 并显示新的 DNS 服务器搜索顺序。

列表 32   Dns-addserver-end.vbs

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
On Error Resume Next
 
strComputer = "."
strNewDNSServer = "192.168.0.4"
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
WScript.Echo VbCrLf & "Computer: " & strComputer
 
For Each objNicConfig In colNicConfigs
  intNewArraySize = 0
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  arrDNSServerSearchOrder = objNicConfig.DNSServerSearchOrder
  WScript.Echo "    DNS Server Search Order - Before:"
  If Not IsNull(arrDNSServerSearchOrder) Then
    For Each strDNSServer In arrDNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  WScript.Echo "    Adding " & strNewDNSServer & " to end of " & _
   "DNS search order."
  intNewArraySize = UBound(arrDNSServerSearchOrder) + 1
  ReDim Preserve arrDNSServerSearchOrder(intNewArraySize)
  arrDNSServerSearchOrder(intNewArraySize) = strNewDNSServer
  intSetDNS = _
   objNicConfig.SetDNSServerSearchOrder(arrDNSServerSearchOrder)
  If intSetDNS = 0 Then
    WScript.Echo "    Added " & strNewDNSServer & _
     " to end of DNS search order."
  Else
    WScript.Echo "    Unable to change DNS server search order."
  End If
Next
 
WScript.Echo VbCrLf & String(80, "-")
 
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - After:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-addserver-end.vbs

 

Computer: .

 

  Network Adapter 1

    DNS Server Search Order - Before:

        192.168.0.1

        192.168.0.2

    Adding 192.168.0.4 to end of DNS search order.

    Added 192.168.0.4 to end of DNS search order.

 

--------------------------------------------------------------------------------

 

 

  Network Adapter 1

    DNS Server Search Order - After:

        192.168.0.1

        192.168.0.2

        192.168.0.4

在搜索顺序的开头添加一台 DNS 服务器

最后,您可能需要在搜索顺序列表的开头添加一台新的 DNS 服务器,此脚本说明了具体做法。此处所做的主要更改就是,用下面的四行代码(第 21–24 行)替换 Dns-addserver-end.vbs 中用来在数组末尾添加新 IP 地址的那一行代码(第 21 行);这四行代码将数组中的各个元素向下移动,然后将新的 IP 地址添加到数组的顶部。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

列表 33 将一台新的 DNS 服务器添加到一台计算机上的各个网络适配器配置的 DNS 服务器搜索顺序列表开头。

1.

创建一个变量以指定计算机名称。

2.

向表示新 DNS 服务器的变量分配一个新 IP 地址。

3.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

4.

使用 ExecQuery 方法查询 Win32_NetworkAdapterConfiguration 类,并使用“WHERE IPEnabled = True”来筛选 WQL 查询。

这将返回一个集合,它由启用了 IP 的计算机上的所有网络适配器配置组成。

5.

对于集合中的每个网络适配器配置,请执行以下任务。

6.

创建变量 intNewArraySize,并在循环的开头将此变量设置为 0,以清除那些来自以前循环的值。

7.

显示网络适配器的索引和当前 DNS 服务器搜索顺序列表。

8.

将 DNSServerSearchOrder 属性返回的数组分配给变量 arrDNSServerSearchOrder。

9.

在第 20 行(使用 VBScript ReDim 语句)重新设置 arrDNSServerSearchOrder 的维数,让数组元素的数目增加 1 以便容纳新的 DNS 服务器 IP 地址。注意,在 VBScript 中,ReDim 语句使用的数目是结果数组的大小减 1。

10.

循环访问最后一个元素(该元素仍然为空)以外的所有其他数组元素,并将各个元素分配给数组中紧随其后的元素。这将使整个数组后移一步。

11.

将新 DNS 服务器的 IP 地址分配给第一个数组元素(其索引为 0)。

12.

调用 Win32_NetworkAdapterConfiguration 的 SetDNSServerSearchOrder 方法,并将更改后的 IP 地址数组传递给该方法。

13.

检查该方法返回的值,并显示一条成功或错误信息。

14.

重新查询 Win32_NetworkAdapterConfiguration 并显示新的 DNS 服务器搜索顺序。

列表 33   Dns-addserver-top.vbs

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
30
41
42
43
44
45
46
47
48
49
50
51
52
53
On Error Resume Next
 
strComputer = "."
strNewDNSServer = "192.168.0.3"
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
WScript.Echo VbCrLf & "Computer: " & strComputer
 
For Each objNicConfig In colNicConfigs
  intNewArraySize = 0
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  arrDNSServerSearchOrder = objNicConfig.DNSServerSearchOrder
  WScript.Echo "    DNS Server Search Order - Before:"
  If Not IsNull(arrDNSServerSearchOrder) Then
    For Each strDNSServer In arrDNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  WScript.Echo "    Adding " & strNewDNSServer & " to top of " & _
   "DNS search order."
  intNewArraySize = UBound(arrDNSServerSearchOrder) + 1
  ReDim Preserve arrDNSServerSearchOrder(intNewArraySize)
  For i = (intNewArraySize - 1) To 0 Step -1
    arrDNSServerSearchOrder(i + 1) = arrDNSServerSearchOrder(i)
  Next
  arrDNSServerSearchOrder(0) = strNewDNSServer
  intSetDNS = objNicConfig.SetDNSServerSearchOrder(arrDNSServerSearchOrder)
  If intSetDNS = 0 Then
    WScript.Echo "    Added " & strNewDNSServer & _
     " to top of DNS search order."
  Else
    WScript.Echo "    Unable to change DNS server search order."
  End If
Next
 
WScript.Echo VbCrLf & String(80, "-")
 
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - After:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-addserver-top.vbs

 

Computer: .

 

  Network Adapter 1

    DNS Server Search Order - Before:

        192.168.0.1

        192.168.0.2

        192.168.0.4

    Adding 192.168.0.3 to top of DNS search order.

    Added 192.168.0.3 to top of DNS search order.

 

--------------------------------------------------------------------------------

 

 

  Network Adapter 1

    DNS Server Search Order - After:

        192.168.0.3

        192.168.0.1

        192.168.0.2

        192.168.0.4

更改 DNS 域

有时,您可能需要更改多个客户端上的 DNS 域 — 例如,当您添加一个子域或合并两个域时。如果这涉及到许多客户端或一些非常分散的客户端,则与手动配置相比,使用脚本进行配置是一种既可节省时间、又可减少错误的方法。

在 Windows 2000、Windows XP 和 Windows Server 2003 中,您可以使用 Win32_NetworkAdapterConfiguration 类的 SetDNSDomain() 方法来为某个特定的网络适配器设置 DNS 域。您必须向该方法传递一个参数,即一个表示新 DNS 域名称的字符串。在 Windows NT Server 4.0 中,Win32_NetworkAdapterConfiguration 设置全局应用于所有网络适配器。

在 Windows XP 和 Windows Server 2003 中,Win32_ComputerSystem 方法 JoinDomainOrWorkgroup() 和 UnjoinDomainOrWorkgroup() 分别用于将一台计算机加入某个 Active Directory 域和将一台计算机撤出某个 Active Directory 域。使用这两个方法时,所做的更改会应用到所有的网络适配器。要使用 Windows XP GUI 执行同样的更改,您可以使用网络标识向导。

Win32_ComputerSystem 还包含 Domain 和 DomainRole 两个属性,它们返回 Active Directory 域成员身份和计算机在该域中担当的角色(例如,成员工作站或域控制器)。您可能必须使 DNS 域中的更改与 Active Directory 中的相应更改协调起来。

使用 Win32_NetworkAdapterConfiguration 更改 DNS 域

下面的脚本说明如何使用 Win32_NetworkAdapterConfiguration 类的 SetDNSDomain() 方法来为所有的网络适配器设置 DNS 域。因为该方法是基于每个适配器应用的,所以您也可以使用它来设置特定网络适配器的 DNS 域。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

1.

创建一个变量以指定计算机名称。

2.

创建一个变量以指定新的 DNS 域名称。

3.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

4.

使用 ExecQuery 方法来查询 Win32_NetworkAdapterConfiguration 类。

这将返回一个由计算机上的所有网络适配器配置组成的集合。

5.

对于集合中的每个网络适配器配置,请执行以下任务。

6.

显示网络适配器的索引、说明、DNS 主机名和当前 DNS 域。

7.

调用 Win32_NetworkAdapterConfiguration 的 SetDNSDomain 方法,并将包含新的 DNS 域名称的变量传递给该方法。

8.

检查该方法返回的值,并显示一条成功或错误信息。

9.

重新查询 Win32_NetworkAdapterConfiguration 并显示新的 DNS 域。

列表 34   Dns-setdomain.vbs

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
On Error Resume Next
 
strComputer = "."
strDNSDomain = "fabrikam.com"
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Domain - Before: " & objNicConfig.DNSDomain
  intSetDomain = objNicConfig.SetDNSDomain(strDNSDomain)
  If intSetDomain = 0 Then
    WScript.Echo "    Successfully set DNS domain to " & strDNSDomain
  ElseIf intSetDomain = 1 Then
    WScript.Echo "    Successfully set DNS domain to " & strDNSDomain & _
     VbCrLf & "    Must reboot."
  Else
    WScript.Echo "    Unable to set DNS domain."
  End If
Next
 
WScript.Echo VbCrLf & String(80, "-")
 
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Domain - After: " & objNicConfig.DNSDomain
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-setdomain.vbs

 

DNS Host Name: client1

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

    DNS Domain - Before:

    Successfully set DNS domain to fabrikam.com

 

--------------------------------------------------------------------------------

 

 

DNS Host Name: client1

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

    DNS Domain - After: fabrikam.com

使用 Win32_ComputerSystem 更改域

下面的脚本说明如何使用 Win32_ComputerSystem 类的 JoinDomainOrWorkgroup() 方法,将一台计算机加入 Active Directory 域。所做的更改应用于所有的网络适配器,这与 Win32_NetworkAdapterConfiguration 类的 SetDNSDomain() 方法(它只将更改应用于各个指定的适配器)是不同的。Win32_ComputerSystem 还提供了一个 UnjoinDomainOrWorkgroup() 方法。JoinDomainOrWorkgroup() 和 UnjoinDomainOrWorkgroup() 两个方法都只在 Windows XP 和 Windows Server 2003 上可用。

您可能必须使域更改与 Active Directory 中的相应更改协调起来。

表 15 说明了 JoinDomainOrWorkgroup() 方法接受的五个参数。

表 15   JoinDomainOrWorkgroup() 参数

参数说明

Name

要加入的域或工作组的名称。不能为 Null。

Password

如果传递了可选的 Username 参数,则必须指定该参数。如果没有传递 Username,则可以为 Null。

Username

NetBIOS 名称和用户帐户,格式为域\用户。如果该参数为 Null,则使用脚本运行时使用的凭据。

AccountOU

可选。可以为 Null。Active Directory 组织单元的完全可分辨名称,例如:OU=HR,DC=fabrikam,DC=com。

FJoinOptions

一组位标志,它们指定用于加入域或工作组的选项。如果您没有设置此参数,则使用默认值 1 (Join Domain),同时将在第一个参数中指定的名称视为一个工作组。您可以设置 0 个这样的参数,也可以同时设置多个参数,并用 OR 将这些必需值连接在一起(如下面的脚本所示)。

表 16 描述了供 JoinDomainOrWorkgroup() 方法的 FjoinOptions 参数使用的有效值。

表 16   FJoinOptions 值

值:十进制和十六进制含义

1

&h00001

Join Domain

默认值。将计算机加入到域中。如果没有指定该值,则将计算机加入到工作组中。

2

&h00002

Acct Create

在域上创建一个帐户。

4

&h00004

Acct Delete

从域中删除一个帐户(若存在域)。

16

&h00010

Win9X Upgrade

加入操作是从 Windows 95 或 Windows 98 到 Windows NT 4.0 或 Windows 2000 的升级过程的一部分。

32

&h00020

Domain Join If Joined

允许加入一个新域,即使该计算机已经加入到了某个域。

64

&h00040

Join Unsecure

执行一个不安全的加入操作。

128

&h00080

Machine Password Passed

计算机(不是用户)密码已传递。该选项只对不安全的加入有效。

256

&h00100

Deferred SPN Set

写入计算机对象上的 SPN 和 DnsHostName 属性的操作将推迟,直至紧跟着加入操作的重命名操作完成后再执行。

262144

&h40000

Install Invocation

安装期间调用了 API。

此外,Win32_ComputerSystem 包含一个 UnjoinDomainOrWorkgroup() 方法(也是 Windows XP 中的新增方法),该方法用来从域中删除计算机。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

列表 35 为计算机系统全局更改域。

1.

定义一个常量 JOIN_DOMAIN,并将它设置为等于 1。

note.gif  注意
注意,只有当计算机还不属于任何域时,该值才会将计算机加入到一个域中。要将一台已加入到某个域的计算机加入到一个新域中,请创建常量 DOMAIN_JOIN_IF_JOINED,并将它设置为等于 32。然后,在对 JoinDomainOrWorkgroup 方法的调用中,将 DOMAIN_JOIN_IF_JOINED(而不是 JOIN_DOMAIN)作为最后一个参数传递给该方法。

2.

创建一个变量以指定计算机名称。

3.

创建一个变量以指定新的 DNS 域名称。

4.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

5.

使用 ExecQuery 方法来查询 Win32_ComputerSystem 类。

6.

这将返回一个集合,它由计算机上的所有计算机系统组成。只返回了一个计算机系统。

7.

对于集合中的每个网络适配器配置,请执行以下任务。

8.

显示计算机名称和当前的域。

9.

调用 Win32_ComputerSystem 的 JoinDomainOrWorkgroup 方法,并向它传递两个参数:表示新域名称的变量和表示值 1 的常量(指示 Join Domain 选项)。使用逗号标记出空可选参数的位置。

10.

检查该方法返回的值,并显示一条成功或错误信息。

11.

重新查询 Win32_ComputerSystem 并显示更改后的域。

12.

使用一个 Select Case 语句将 DomainRole 属性返回的整数值转换成一个描述性字符串,并显示该字符串。

列表 35   Dns-setdomain-global.vbs

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
On Error Resume Next
 
Const JOIN_DOMAIN = 1
strComputer = "."
strDomainName = "fabrikam.com"
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colCompSystems = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_ComputerSystem")
 
For Each objCompSystem In colCompSystems
  WScript.Echo VbCrLf & "Computer Name: " & LCase(objCompSystem.Name)
  WScript.Echo "  Domain - Before: " & LCase(objCompSystem.Domain)
  intJoinDomain = objCompSystem.JoinDomainOrWorkgroup(strDomainName,,,, _
   JOIN_DOMAIN)
  If intJoinDomain = 0 Then
    WScript.Echo "    Joined computer to " & strDomainName & " domain."
  ElseIf intJoinDomain = 1 Then
    WScript.Echo "    Joined computer to " & strDomainName & " domain." & _
     VbCrLf & "    Must reboot."
  Else
    WScript.Echo "    Unable to join computer to " & strDomainName & _
     " domain."
WScript.Echo "Return value of JoinDomainOrWorkgroup method: " & intJoinDomain
  End If
Next
 
WScript.Echo VbCrLf & String(80, "-")
 
Set colCompSystems = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_ComputerSystem")
 
For Each objCompSystem In colCompSystems
  WScript.Echo VbCrLf & "Computer Name: " & LCase(objCompSystem.Name)
  WScript.Echo "  Domain - After: " & LCase(objCompSystem.Domain)
  intDomainRole = objCompSystem.DomainRole
  Select Case intDomainRole
    Case 0 strDomainRole = "Standalone Workstation"
    Case 1 strDomainRole = "Member Workstation"
    Case 2 strDomainRole = "Standalone Server"
    Case 3 strDomainRole = "Member Server"
    Case 4 strDomainRole = "Backup Domain Controller"
    Case 5 strDomainRole = "Primary Domain Controller"
    Case Else strDomainRole = "Cannot determine domain role."
  End Select
  WScript.Echo "  Domain Role: " & strDomainRole
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-setdomain-global.vbs

 

Computer Name: client1

  Domain - Before:

    Joined computer to fabrikam.com domain.

 

--------------------------------------------------------------------------------

 

Computer Name: client1

  Domain - After: fabrikam.com

  Domain Role: Member Workstation

更改 DNS 域后缀搜索顺序

除了更改计算机的 DNS 域外,您还可以设置 DNS 域后缀的搜索顺序。当主机必须尝试解析多个域中 DNS 服务器上的非完全限定名称时,就可能需要进行这种设置。当网络中包含多个位于不同域中的辅助 DNS 服务器时,或者一台多主机计算机将各个网络适配器连接到一个不同的域时,就可能会出现这种情况。

下面的脚本可以设置与您在“附加这些 DNS 后缀(按顺序)”(位于“高级 TCP/IP 设置”对话框的“DNS”选项卡上)下的文本框中输入的名称相对应的 DNS 域后缀。

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

SetDNSSuffixSearchOrder 是一个静态方法,这意味着它应用于 Win32_NetworkAdapterConfiguration 类的所有实例(也就是说,应用于所有启用了 IP 的网络适配器)。这意味着,您可以使用 SWbemServices 对象(由前面的对“winmgmts:”标记发出的 GetObject 调用返回)的较简单的 Get() 方法,来获取一个表示整个类的对象;而不必结合使用一个较复杂的 ExecQuery() 方法与一个 WQL 查询,来获取一个表示该类实例的对象集合。Get() 方法位于第 19 行:

Set objNetworkSettings = objWMIService.Get("Win32_NetworkAdapterConfiguration")

您不能像调用 EnableDHCP 时那样,调用 SetDNSSuffixSearchOrder 方法而不带任何参数,而是必须向它传递一个包含后缀名称的字符串数组。

如果您只需要在脚本中调用 SetDNSSuffixSearchOrder 方法,您可以使用更简洁的方法,即绑定到 Win32_NetworkAdapterConfiguration 类。下面是两个示例:

Set objNicConfig = GetObject("winmgmts:\\" & strComputer &_
 "\root\cimv2:Win32_NetworkAdapterConfiguration")
Set objNicConfig = GetObject("winmgmts:").Get _
 ("Win32_NetworkAdapterConfiguration")

在特定的上下文中哪种方法最好?这通常取决于编码风格和组织标准。

脚本步骤

列表 36 使用一个新的 DNS 域后缀搜索顺序列表替换所有网络适配器的旧列表。

1.

创建一个变量以指定计算机名称。

2.

创建一个数组变量以指定 DNS 域后缀列表。

3.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

4.

使用 ExecQuery 方法查询 Win32_NetworkAdapterConfiguration 类,并使用“WHERE IPEnabled = True”来筛选 WQL 查询。

这将返回一个集合,它由启用了 IP 的计算机上的所有网络适配器配置组成。

5.

对于集合中的每个网络适配器配置,请执行以下任务。

6.

检查以确保 DNSDomainSuffixSearchOrder 属性不是 Null。

7.

循环访问由 DNSDomainSuffixSearchOrder 属性返回的字符串数组。

8.

将数组元素连接成一个字符串。

9.

按顺序显示包含 DNS 域后缀列表的字符串。

10.

调用 Win32_NetworkAdapterConfiguration 的 SetDNSSuffixSearchOrder 方法,并向它传递一个参数:包含 DNS 域后缀列表的数组。

11.

检查该方法返回的值,并显示一条成功或错误信息。

12.

重新查询 Win32_NetworkAdapterConfiguration 并显示更改后的 DNS 域后缀列表。

列表 36   Dns-replacesuffixlist.vbs

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
On Error Resume Next
 
strComputer = "."
arrNewDNSSuffixSearchOrder = Array("hr.fabrikam.com", "contoso.com")
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Domain Suffix Search Order - Before:"
  If Not IsNull(objNicConfig.DNSDomainSuffixSearchOrder) Then
    For Each strDNSSuffix In objNicConfig.DNSDomainSuffixSearchOrder
      WScript.Echo "      " & strDNSSuffix
    Next
  End If
Next
 
WScript.Echo VbCrLf & String(80, "-")
 
Set objNetworkSettings = _
 objWMIService.Get("Win32_NetworkAdapterConfiguration")
intSetSuffixes = _
 objNetworkSettings.SetDNSSuffixSearchOrder(arrNewDNSSuffixSearchOrder)
If intSetSuffixes = 0 Then
  WScript.Echo VbCrLf & "Replaced DNS domain suffix search order list."
ElseIf intSetSuffixes = 1 Then
  WScript.Echo VbCrLf & "Replaced DNS domain suffix search order list." & _
   VbCrLf & "    Must reboot."
Else
  WScript.Echo VbCrLf & "Unable to replace DNS domain suffix " & _
   "search order list."
End If
 
WScript.Echo VbCrLf & String(80, "-")
 
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Domain Suffix Search Order - After:"
  If Not IsNull(objNicConfig.DNSDomainSuffixSearchOrder) Then
    For Each strDNSSuffix In objNicConfig.DNSDomainSuffixSearchOrder
      WScript.Echo "      " & strDNSSuffix
    Next
  End If
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-replacesuffixlist.vbs

 

DNS Host Name: client1

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

    DNS Domain Suffix Search Order - Before:

 

--------------------------------------------------------------------------------

 

Replaced DNS domain suffix search order list.

 

--------------------------------------------------------------------------------

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

    DNS Domain Suffix Search Order - After:

      hr.fabrikam.com

      contoso.com

更改动态 DNS 注册设置

DHCP 客户端的 IP 地址更改时,DNS 注册和动态更新会自动完成以下过程:将 DNS 服务器上的主机名和 IP 地址映射更改保持最新。以前该更新过程必须由管理员手动执行;但是现在,客户端和 DHCP 服务器可以通过 DNS 动态更新 (RFC 2136) 使 DNS 服务器上的地址 (A) 和指针记录 (PTR) 资源记录保持最新,而不需要任何手动干预。

与通常情况下一样,Win32_NetworkAdapterConfiguration 类提供了一些只读属性来公开这些 DNS 注册和更新设置,并提供一个方法来更改它们。您必须为 SetDynamicDNSRegistration 方法传递两个参数及其设置的两个布尔属性,它们与“高级 TCP/IP 设置”对话框的“DNS”选项卡底部的两个复选框相对应。Windows 界面中的“在 DNS 中注册此连接的地址”与 FullDNSRegistrationEnabled 属性等效;“在 DNS 注册中使用此连接的 DNS 后缀”与 DomainDNSRegistrationEnabled 属性等效。这两个属性和这个方法都是 Windows XP 和 Windows Server 2003 中新增加的。只有在 FullDNSRegistrationEnabled 为 True 时,才使用 DomainDNSRegistrationEnabled 值(默认为 False);否则,将忽略 DomainDNSRegistrationEnabled。

您可以从 Windows 界面中查找 FullDNSRegistrationEnabled 属性所指的名称。打开“控制面板”,单击“系统”,单击“计算机名称”选项卡,然后查看“完整的计算机名称”字段。该字段中的值由主机名和附加在后面的域名构成。如果 FullDNSRegistrationEnabled 为 True,则使用此名称在 DNS 中注册网络适配器的 IP 地址。

如果 DomainDNSRegistrationEnabled 属性为 True,则还使用特定网络适配器的 DNSDomain 属性在 DNS 中注册 IP 地址。

例如,在一个多主机计算机上,如果它的各个网络适配器分别连接到具有不同域结构的不同网络,则您可能需要在域注册中使用连接特定的 DNS 后缀。在这些情况下,客户端可能需要为各个网络连接注册一个不同的域后缀。如果同时将 FullDNSRegistrationEnabled 和 DomainDNSRegistrationEnabled 设置为 True,则将启用这一功能。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

此脚本使用 Win32_NetworkAdapterConfiguration 类的 SetDynamicDNSRegistration() 方法来修改 DomainDNSRegistrationEnabled 和 FullDNSRegistrationEnabled 属性,进而更改动态 DNS 注册的实现方式设置。

这个方法和这两个属性都是 Windows XP 和 Windows Server 2003 中新增加的。此脚本不检查操作系统版本;不过,如果 SetDynamicDNSRegistration 不返回 0(0 指示成功),则脚本将捕获错误并显示一条消息。

1.

创建一个变量以指定计算机名称。

2.

创建两个布尔变量来指定 DomainDNSRegistrationEnabled 和 FullDNSRegistrationEnabled 属性所需的设置。

3.

使用 GetObject 调用来连接到 WMI 名称空间 root\cimv2,并将模拟级别设置为“impersonate”。

4.

使用 ExecQuery 方法查询 Win32_NetworkAdapterConfiguration 类,并使用“WHERE IPEnabled = True”来筛选 WQL 查询。

这将返回一个集合,它由启用了 IP 的计算机上的所有网络适配器配置组成。

5.

对于集合中的每个网络适配器配置,请执行以下任务。

6.

显示当前的 DNS 动态注册设置。

7.

调用 Win32_NetworkAdapterConfiguration 的 SetDynamicDNSRegistration 方法,并将脚本开头设置的两个布尔参数传递给该方法。

8.

检查该方法返回的值,并显示一条成功或错误信息。

9.

重新查询 Win32_NetworkAdapterConfiguration 并显示更改后的 DNS 动态注册设置。

列表 37   Dns-setdynreg.vbs

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
On Error Resume Next
 
strComputer = "."
blnFullDNSRegistrationEnabled = True
blnDomainDNSRegistrationEnabled = True
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Full Registration Enabled - Before: " & _
   objNicConfig.FullDNSRegistrationEnabled & VbCrLf & _
   "    DNS Domain Registration Enabled - Before: " & _
   objNicConfig.DomainDNSRegistrationEnabled
  intDynReg = objNicConfig.SetDynamicDNSRegistration _
   (blnFullDNSRegistrationEnabled, blnDomainDNSRegistrationEnabled)
  If intDynReg = 0 Then
    WScript.Echo VbCrLf & "    Successfully set dynamic DNS registration."
  ElseIf intDynReg = 1 Then
    WScript.Echo VbCrLf & _
     "    Successfully set dynamic DNS registration." & _
     VbCrLf & "    Must reboot."
  Else
    WScript.Echo VbCrLf & "    Unable to set dynamic DNS registration."
  End If
Next
 
WScript.Echo VbCrLf & String(80, "-")
 
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index & _
 VbCrLf &   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Full Registration Enabled - After: " & _
   objNicConfig.FullDNSRegistrationEnabled & VbCrLf & _
   "    DNS Domain Registration Enabled - After: " & _
   objNicConfig.DomainDNSRegistrationEnabled
Next

当您使用 Cscript.exe 来运行这个脚本时,命令窗口中会显示与以下内容类似的输出:

C:\scripts>dns-setdynreg.vbs

 

DNS Host Name: client1

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

    DNS Full Registration Enabled - Before:

    DNS Domain Registration Enabled - Before:

 

    Successfully set dynamic DNS registration.

 

--------------------------------------------------------------------------------

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

    DNS Full Registration Enabled - After: True

    DNS Domain Registration Enabled - After: True

方案:更改 DNS 服务器和域

在企业发生重大变革时(例如,合并、收购和重组),组织的 DNS 域层次结构可能会发生改变,因而可能必须对主机进行重新配置,才能让它们在新的结构内正常运行。

在此方案中,Fabrikam, Inc. 的 IT 部门将以前位于顶级域 fabrikam.com 中的客户端分配到不同的子域中:hr.fabrikam.com、it.fabrikam.com 和 ac.fabrikam.com。各个新的子域需要为包含的客户端配置一个新的 DNS 服务器搜索顺序。各个子域的主 DNS 服务器还将成为其他两个子域的备用服务器。

此脚本使用 Win32_NetworkAdapterConfiguration 方法 SetDNSDomain() 和 SetDNSServerSearchOrder(),而没有使用 EnableDNS()。EnableDNS() 需要两个其他可选参数(可以保留为空白);前面的两个方法可以准确地设置此示例所需的参数。如有必要,您可以轻松地扩展该脚本,使之使用 SetDynamicDNSRegistration() 方法来配置主机的动态注册设置。

请记住,在这样的操作中,配置客户端只是任务的一部分:您还必须在 DNS 服务器上执行相应的更改。但是,使用脚本管理 DNS 服务器不在本文的讨论范围之内。

脚本步骤

caution.gif  警告
这个脚本可能会更改您的计算机配置。只能在测试计算机上运行此脚本,并在运行前记下涉及的设置。

列表 38 将一个文本文件作为输入。您必须在运行脚本前创建该文件。此文件的路径是在一个变量中指定的;在此例中,这个路径是 C:\Scripts\Hosts.txt。该文本文件的各行分别包含一个主机名和一个新的域名,它们之间用逗号分隔(中间没有空格)。最后一行绝对不能以回车符结束,因为如果以该字符结束,紧随在其后面的一行将被脚本读作空项。

client1,hr
client2,it
server1,ac

对于各个主机,此脚本分配了新的域名和一个新的 DNS 服务器搜索顺序。新顺序取决于您的域名:各个子域都有它自己的主 DNS 服务器,该服务器还同时作为其他两个子域的备用服务器。

此脚本创建了一个逗号分隔值 (.csv) 文本文件,并将这些操作的结果记录在该文件中。此文件的路径是在一个变量中指定的;在此例中,这个路径是 C:\Scripts\Newhosts.csv。

1.

定义 FileSystemObject 的常量。

2.

创建变量以指定输入文件和输出文件的路径。

3.

创建变量以指定顶级域的名称。

4.

创建三个字符串数组,分别包含各个子域的 DNS 服务器搜索顺序。

5.

创建一个 FileSystemObject,使用它打开文件并将文件内容读到一个字符串中。

6.

调用 GetInput 函数,将输入文本文件的名称传递给此函数。此函数读取输入文件的内容,并将文件内容作为一个字符串返回。

7.

使用 VBScript Split 函数并将 VbCrLf 常量作为分隔符,将来自输入文件的字符串拆分为一个数组,让数组的各个元素分别包含该文本文件中的一行(各行应分别包含一个计算机名称和一个子域)。

8.

检查指定的输出文件是否存在。如果存在,则打开此文件以备添加内容。如果不存在,则创建一个输出文件,并打开它以备写入数据。

9.

循环访问通过按行拆分输入文件返回的各个数组元素。

10.

再次使用 Split,从逗号处分开各个数组元素,并将主机名读到一个变量中,而将子域名读到另一个变量中。

11.

将子域名和顶级域名连接起来,从而获得完整的域名。

12.

显示主机名。

13.

调用 PingClient 函数,并将主机名传递给它。

14.

如果 ping 收到了答复,则连接到 WMI 服务并进行错误捕获。

15.

如果在连接到 WMI 时没有出现错误,则查询 WMI 服务以获取所有启用了 IP 的网络适配器的集合。

16.

调用 GetSettings 子例程来显示当前的 DNS 设置,并将设置写入输出文件中。

17.

调用 ChangeDNS 函数,该函数对输入文件中指定的域和 DNS 搜索顺序进行更改,并将结果记录到输出文件中。

18.

再次调用 GetSettings 子例程来显示更改后的 DNS 设置,并将这些设置写入输出文件中。

19.

如果在连接到 WMI 时出现了错误,则显示错误信息。

20.

如果 ping 没有收到答复,则显示一条错误信息。

21.

GetInput 函数将一个包含输入文本文件名称的字符串作为参数。此函数返回一个包含输入文件文本的字符串。如果文件是空的或者无法找到,则此函数显示一条错误信息并终止脚本。

22.

PingClient 函数将一个包含主机名的字符串作为参数。如果 ping 收到答复,则此函数返回 True;否则,此函数返回 False。

23.

GetSettings 子例程显示各个网络适配器的索引号、说明、DNS 域、DNS 服务器搜索顺序、IP 地址和子网掩码。

24.

ChangeDNS 子例程根据输入文件中为主机指定的子域来选择 DNS 服务器搜索顺序。如果子域是 Select Case 语句逻辑中包含的子域之一,此子例程便尝试使用新域的名称来调用 SetDNSDomain 方法。如果这个方法成功了,此子例程便尝试使用选定的 DNS 服务器搜索顺序来调用 SetDNSServerSearchOrder 方法。此子例程将结果和任何错误记录到输出文件中。

列表 38   Dns-move.vbs

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
On Error Resume Next
 
' Constants for FileSystemObject
Const FOR_READING = 1
Const FOR_WRITING = 2
Const FOR_APPENDING = 8
 
' Paths to input and output files. Input file must be text file with name
' of accessible machine, comma, and valid domain name on each line.
strFileInput = "c:\scripts\hosts.txt"
strFileOutput = "c:\scripts\newhosts.csv"
 
' Domain name and DNS servers corresponding to subdomains
strTopDomain = "fabrikam.com"
arrDNSSrv1 = Array("192.168.0.1", "192.168.0.2", "192.168.0.3") 'hr
arrDNSSrv2 = Array("192.168.0.2", "192.168.0.3", "192.168.0.1") 'it
arrDNSSrv3 = Array("192.168.0.3", "192.168.0.1", "192.168.0.2") 'ac
 
' Create a Script Runtime FileSystemObject.
Set objFSO = CreateObject("Scripting.FileSystemObject")
 
' If the input file exists, dump contents of input file into a string.
strInput = GetInput(strFileInput)
 
' Get computer info by breaking input stream into array at line breaks.
arrHosts = Split(strInput, VbCrLf)
 
' Check to see if the output file exists. If so, open it for appending.
' If not, create it and open it for writing.
 
If objFSO.FileExists(strFileOutput) Then
  Set objOutputFile = objFSO.OpenTextFile (strFileOutput, FOR_APPENDING)
Else
  Set objOutputFile = objFSO.CreateTextFile(strFileOutput)
End If
If Err <> 0 Then
  Wscript.Echo "Unable to open " & strFileOutput & " for output."
  WScript.Quit
End If
 
' Write header for file.
objOutputFile.WriteLine "Inventory of computers moved to new domains." & _
 VbCrLf  & "Taken " & Now & VbCrLf & VbCrLf & String(120, "-") & VbCrLf
 
For Each strHost In arrHosts
 
' Get names and domains by breaking each computer info array at commas.
  arrComputers = Split(strHost, ",")
  strComputer = arrComputers(0)
  strSubDomain = arrComputers(1)
  strDomain = strSubDomain & "." & strTopDomain
  WScript.Echo VbCrLf & "Host: " & strComputer & VbCrLf
 
' Ping remote computer. If no response display error message and end script
  blnPingSuccess = PingClient(strComputer)
  If blnPingSuccess = True Then
 
' Connect to the WMI service.
    Set objWMIService = GetObject("winmgmts:" _
     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
 
    If Err = 0 Then
 
' Write header for each computer.
      objOutputFile.WriteLine "Host:,," & strComputer & VbCrLf & VbCrLf & _
       ", Settings before operations:" & VbCrLf
 
' Get current settings and write to output file.
      GetSettings
      objOutputFile.WriteLine VbCrLf & "," & String(60, "-")
 
' Change domain and DNS search order.
      ChangeDNS
 
' Get settings after changes and write to output file.
      objOutputFile.WriteLine VbCrLf & "," & String(60, "-") & VbCrLf & _
       VbCrLf & ",Settings after operations:" & VbCrLf
      GetSettings
      objOutputFile.WriteLine VbCrLf & String(120, "-") & VbCrLf
 
    Else
 
      objOutputFile.WriteLine "Host: " & strComputer & VbCrLf _
       & VbCrLf & "Error connecting to WMI service." & VbCrLf & _
       "Error Number: " & Err.Number & VbCrLf & _
       "Error Source: " & Err.Source & VbCrLf & _
       "Error Description: " & Err.Description & VbCrLf & VbCrLf & _
       String(120, "-") & VbCrLf
      Err.Clear
 
    End If
 
  Else
 
    objOutputFile.WriteLine "Host: " & strComputer & VbCrLf _
     & VbCrLf & ",Unable to connect." & VbCrLf & VbCrLf & _
     String(120, "-") & VbCrLf
 
  End If
 
Next
 
' Write footer for file and close.
objOutputFile.WriteLine String(64, "=") & VbCrLf
objOutputFile.Close
 
WScript.Echo "Inventory complete. Data written to " & strFileOutput & "."
 
'************************************************************************
 
Function GetInput(strFileInput)
 
' Check to see if the input file exists.
' If so, dump contents of input file into a string.
 
If objFSO.FileExists(strFileInput) Then
  Set objInputFile = objFSO.GetFile(strFileInput)
  If objInputFile.Size > 0 Then
    Set objInputFile = objFSO.OpenTextFile(strFileInput, FOR_READING)
    strInputStream = objInputFile.ReadAll
    objInputFile.Close
    GetInput = strInputStream
  Else
    Wscript.Echo strFileInput & " is empty."
    WScript.Quit
  End If
Else
  WScript.Echo strFileInput & " does not exist on this computer."
  WScript.Quit
End If
 
End Function
 
'************************************************************************
 
Function PingClient(strComputer)
 
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ping -n 2 -w 1000 " & strComputer)
strPingResults = LCase(objExec.StdOut.ReadAll)
If InStr(strPingResults, "reply from") Then
  PingClient = True
Else
  PingClient = False
End If
 
End Function
 
'************************************************************************
 
Sub GetSettings
 
Set colCompSystems = objWMIService.ExecQuery _
("SELECT * FROM Win32_ComputerSystem")
 
For Each objCompSystem in colCompSystems
  objOutputFile.WriteLine VbCrLf & ",Domain:,," & objCompSystem.Domain
Next
 
Set colNicConfigs = objWMIService.ExecQuery("SELECT " & _
 "* FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True")
 
For Each objNicConfig In colNicConfigs
  objOutputFile.WriteLine VbCrLf & ",Network Adapter " & _
   objNicConfig.Index & VbCrLf & _
   ",," & objNicConfig.Description & VbCrLf & _
   ",,DNS Domain:,," & objNicConfig.DNSDomain
  strRow = ",,DNS Server Search Order:,,"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      strRow = strRow & strDNSServer & ",,"
    Next
  End If
  objOutputFile.WriteLine strRow
  strRow = ",,IP Addresses:,,"
  If Not IsNull(objNicConfig.IPAddress) Then
    For Each strIPAddress In objNicConfig.IPAddress
      strRow = strRow & strIPAddress & ",,"
    Next
  End If
  objOutputFile.WriteLine strRow
  strRow = ",,Subnet Masks:,,"
  If Not IsNull(objNicConfig.IPSubnet) Then
    For Each strIPSubnet In objNicConfig.IPSubnet
      strRow = strRow & strIPSubnet & ",,"
    Next
  End If
  objOutputFile.WriteLine strRow
Next
 
End Sub
 
'************************************************************************
 
Sub ChangeDNS
 
Set colNicConfigs = objWMIService.ExecQuery("SELECT " & _
 "* FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True")
 
' Test that child domain from input file is valid.
errSubDomain = False
Select Case strSubDomain
  Case "hr" arrDNSServers = arrDNSSrv1
  Case "it" arrDNSServers = arrDNSSrv2
  Case "ac" arrDNSServers = arrDNSSrv3
  Case Else errSubDomain = True
End Select
 
If errSubDomain = False Then
  For Each objNicConfig In colNicConfigs
    objOutputFile.WriteLine VbCrLf & ",Network Adapter " & _
     objNicConfig.Index & VbCrLf & _
     ",," & objNicConfig.Description & VbCrLf & VbCrLf & _
     ",,Attempting to make changes in DNS configuration ..."
    intDomain = objNicConfig.SetDNSDomain(strDomain)
    If intDomain = 0 Then
      objOutputFile.WriteLine ",,Assigned new domain."
      intServers = objNicConfig.SetDNSServerSearchOrder _
       (arrDNSServers)
      If intServers = 0 Then
        objOutputFile.WriteLine ",,Assigned new DNS server " & _
         "search order."
      Else
        objOutputFile.WriteLine ",,Unable to assign new DNS " & _
         "server search order."
      End If
    Else
      objOutputFile.WriteLine ",,Unable to assign new domain or " & _
       "DNS server search order."
    End If
  Next
Else
  objOutputFile.WriteLine "Subdomain" & strSubDomain & _
  "could not be found."
End If
 
End Sub

当您使用 Cscript.exe 来运行这个脚本时,输出会显示在名为 C:\Scripts\Newhosts.csv 的文本文件中(以逗号分隔)。您可以用电子表格形式打开 .csv 文件。当脚本运行时,监视器上会显示类似以下内容的输出。

C:\scripts>dns-move.vbs

 

Host: client1

 

 

Host: client2

 

 

Host: server1

 

Inventory complete.Data written to c:\scripts\newhosts.csv.

通过脚本管理客户端上 DNS 所用的工具

表 17 列出了一些通过脚本管理客户端上 DNS 所用的 Windows 工具。

表 17   通过脚本管理客户端上 DNS 所用的工具

技术工具获取来源

命令行工具

Dnscmd.exe:DNS 服务器疑难解答工具

Windows Server 2003 支持工具

命令行工具

Dnslint.exe

Windows Server 2003 支持工具

命令行工具

DNSRECORD.PL

Windows 2000 Resource Kit

命令行工具

DNSSERVER.PL

Windows 2000 Resource Kit

命令行工具

DNSZONES.PL

Windows 2000 Resource Kit

命令行工具

NETDNSCONFIG.PL

Windows 2000 Resource Kit

命令行工具

Netsh.exe

Windows 操作系统1

命令行工具

Nslookup.exe

Windows 操作系统

WSH

 

WMI

Win32_ComputerSystem

 

WMI

Win32_OperatingSystem

 

WMI

Win32_NetworkAdapterConfiguration

 

WMI

Win32_NTDomain

仅 Windows XP 和 Windows Server 2003

1Windows 2000、Windows XP 和 Windows Server 2003。其他版本的 Windows 上也可能有此工具。

表 18 列出了一些可用于使用脚本来管理客户端上 DNS 的注册表子项。

caution.gif  警告
注册表编辑不当可能会严重破坏您的系统。在更改注册表之前,应该先备份计算机上所有有用的数据。

表 18   与使用脚本来管理客户端上 DNS 有关的注册表子项

注册表子项

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
\{AdapterIdentifier}

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache


返回页首返回页首上一页第 6 页,共 11 页下一页
**
**