您好,脚本专家!我们当然适应能力很强

Microsoft 脚本专家

此专栏基于 Windows Vista 的预发布版本。文中的某些信息可能会有所变动。

下载这篇文章的代码: ScriptingGuys2006_11.exe (151KB)

您可能 听说过提升职业水平的最佳途径就是关系网络。也就是与业内的其他人建立联系,从而可以向他们学习、与他们共享信息甚至可能从他们那里找到一份新的工作。脚本专家从来就不了解那些职业关系网络的事情(很显然应该这样),但是我们确实知道一些有关计算机网络的事情。这是因为您可以利用脚本实现的网络功能来做许多事情。

Windows® Management Instrumentation (WMI) 提供了许多类,您可以使用这些类来监控您的网络环境。其中有两个类:Win32_NetworkAdapter 和 Win32_NetworkAdapaterConfiguration,您可以利用它们来使用您的计算机上的网络适配器(不然还能是什么)。

我们经常听到的一个问题是:“如何通过脚本来启用和禁用我的网络适配器?”是的,我们不会让问题悬而不决的。我们现在就告诉您,这是不可能实现的。退一步讲,除非您现在使用的是 Windows Vista™ 操作系统,否则不可能。在 Windows Vista 中,Win32_NetworkAdapter 类中加入了两个新方法。Enable 和 Disable。我们待会儿就介绍这两个方法。但是在您还没有彻底灰心之前,我们先告诉您能够对 Windows Vista 之前的操作系统做些什么。对于新手而言,您会发现计算机上的哪些网络适配器是真的可以使用的(参见图 1)。这是件好事,不是吗?

Figure 1 查找网络适配器

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo
Next

图 1 中,我们首先连接到本地计算机上的 WMI 服务。是的,通过 GUI 可以十分轻松地找到本地计算机上的网络适配器,但请试着使用 GUI 来获得远程计算机上网络适配器的相关信息。这就是该脚本(即通常所说的 WMI 脚本)的魅力之一:您只需将 strComputer 的值更改为远程服务器的名称即可对远程计算机运行同一段脚本。

在连接到 WMI 服务之后,我们便可以查询 Win32_NetworkAdapter 类了。此查询将返回计算机上的所有网络适配器的集合。此时,我们只需编写一个 For Each 循环来遍历适配器集合并回显每个适配器的 Name(名称)和 Description(描述)即可。您的输出将类似于:

Name: Broadcom NetXtreme 57xx Gigabit Controller
Description: Broadcom NetXtreme 57xx Gigabit Controller

Name: RAS Async Adapter
Description: RAS Async Adapter

Name: WAN Miniport (L2TP)
Description: WAN Miniport (L2TP)

Name: WAN Miniport (PPTP)
Description: WAN Miniport (PPTP)

只需通过回显 Win32_NetworkAdapter 的各个属性(DeviceID、Manufacturer 和 TimeOfLastReset)即可检索网络适配器的许多信息。有关详细信息,请参见大作“在客户端实现自动 TCP/IP 联网”,当然是位于“脚本中心”啦!

适应变化

使用 Win32_NetworkAdapter 类,您只需检索有关网络适配器的信息即可。如果您要实际更改适配器的一些设置,则需要使用 Win32_NetworkAdapterConfiguration 类。此类不仅提供了有关您的适配器的其他信息(Win32_NetworkAdapter 所不具备的属性),而且它提供了多种方法,使用这些方法可以按照自己的意愿配置网络适配器。

例如,您可能无法启用和禁用适配器,但是您可以启用和禁用每个启用了 TCP/IP 的适配器上的动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)。图 2 显示了一段脚本,该脚本查找所有启用了 TCP/IP 的适配器,检查每个适配器上是否启用了 DHCP,如果没有启用 DHCP,则启用它。

Figure 2 启用 DHCP

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = False Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableDHCP
        Select Case intReturn
            Case 0
                Wscript.Echo "DHCP enabled"
            Case 1
                Wscript.Echo "You must reboot before DHCP will be enabled"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

正如图 1 中的脚本那样,图 2 中的脚本连接到本地计算机上的 WMI 服务。然后查询 Win32_NetworkAdapterConfiguration 类。请注意,由于我们仅连接了那些启用了 TCP/IP 的适配器,因而查询中包含一条 Where 子句:

Where IPEnabled = 'True'

此子句指明了我们仅希望获得 IPEnabled 属性为 True 的 Win32_NetworkAdapterConfiguration 类的实例,该值表示与该实例关联的适配器已启用 TCP/IP。

接着,我们使用了一个 For Each 循环来遍历通过我们的查询返回的适配器的集合。在循环中,我们首先检查每个适配器的 DHCPEnabled 属性。如果该属性被设置为 False,表示 DHCP 未启用,所以我们要启用它。我们通过调用适配器对象上的 EnableDHCP 方法来实现这一操作。真的,就是这么简单。

为了更容易看出脚本的执行情况,我们回显了 Caption 属性,以便了解我们当前处理的是哪个适配器。脚本中还包括一个 Select Case 语句,并为最终用户创建了每个可能结果的描述符。EnableDHCP 在完成时返回一个整型值。如果该值为 0,表示方法成功执行,并且已启用 DHCP。如果该值为 1,表示方法成功执行,但是需要重新启动计算机才能使更改生效。除此之外的其他值则表示出现了问题,并且未启用 DHCP。我们使用 Select Case 语句来检查这些整型值并返回一个适当的消息。

您也可以禁用 DHCP;此操作可以通过在适配器上设置静态 IP 地址和子网掩码来实现(参见图 3)。

Figure 3 设置 IP 地址

arrIPAddress = Array("192.168.0.12")
arrSubnetMask = Array("255.255.255.0")

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = True Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableStatic(arrIPAddress, arrSubnetMask)
        Select Case intReturn
            Case 0
                Wscript.Echo "Static address assigned"
            Case 1
                Wscript.Echo "You must reboot before the static address will take effect"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

图 3 中的脚本几乎与图 2 中的脚本一样,只有主要的几点不同。在脚本的开头部分,我们声明了两个数组,arrIPAddress 和 arrSubnetMask,并为它们分别指定了值。之后,在 For Each 循环中,我们并非检查 DHCPEnabled 是否为 False,而是检查它是否为 True,True 表示 DHCP 已启用(反之,我们要禁用它)。然后,我们调用了适配器对象上的 EnableStatic 方法。您会注意到,与 EnableDHCP 方法不同的是,EnableStatic 带有参数。这些参数是我们此前声明的包含新的静态 IP 地址和子网掩码的数组。

Windows Vista 的新增功能

现在兑现承诺(因为脚本专家从不——至少是很少——违背诺言),我们将为您展示在 Windows Vista 中能做些什么。如前文所述,在 Windows Vista 中,WMI 的 Win32_NetworkAdapter 类有两个方法:Enable 和 Disable,使用这两个方法可以启用和禁用您的网络适配器。此类还有一个新的属性 NetEnabled,如果适配器已经启用,该值返回 True,如果未启用则返回 False。图 4 显示了一段脚本,这段脚本将查找计算机上的所有已禁用的网络适配器,然后启用它们。

Figure 4 启用网络适配器

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapter Where NetEnabled = 'False'")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    objItem.Enable
    Wscript.Echo
Next

这与图 1 所示的脚本几乎一样。(为了引起您的重视,我们强烈建议重用脚本。)我们连接到本地计算机上的 WMI 服务,并查询 Win32_NetworkAdapter 的所有实例。由于我们仅对被禁用的适配器感兴趣,因而加入了一条 Where 子句:

Where NetEnabled = 'False'

此子句使用新的 NetEnabled 属性指出查询操作应仅返回其 NetEnabled 设置为 False 的适配器(即,被禁用的网络适配器)。然后,我们同样编写了一个 For Each 循环来遍历通过查询返回的网络适配器对象的集合。回显了适配器的 Name 和 Description 之后,我们调用 Enable 方法来启用适配器。

所有操作都十分简单,不是吗?现在,我们要是了解其他的所谓网络,那该多好啊!

Microsoft 脚本专家脚本专家为 Microsoft 工作,也就是说受雇于 Microsoft。在不玩、不教或不看棒球(以及其他活动)的时候,他们维护 TechNet 脚本中心。查找所需的信息,网址为:www.scriptingguys.com

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.