您好,脚本专家!

您好,脚本专家!

欢迎来到 TechNet 专栏,在这里,Microsoft 脚本专家将为您解答与系统管理脚本编写有关的各种常见问题。如果遇到系统管理脚本编写方面的问题,请将电子邮件发送到 scripter@microsoft.com。我们不能保证回答收到的所有问题,但是我们将尽最大的努力。

同时,不要忘了查看您好,脚本专家!存档

今日问题:如何更改分配给计算机的 IP 地址?


如何更改分配给计算机的 IP 地址?

问:

您好,脚本专家!如何更改分配给计算机的 IP 地址?

-- RW

答:

您好,RW。老实说,脚本专家很难回答这个问题。并非这个脚本难以编写;稍后您会发现,脚本实际上很简单。因为涉及到变更,所以对脚本专家来说很难回答。如果您是脚本专家,那么,您为何曾经要改变一切?正如您猜想的那样,我们都开着进口跑车,住着豪华公寓而且都抽着 100 美元的雪茄。我们的生活完美吗?我们当然是:甚至我们的 IP 地址也是完美的。我们为何要改变这其中的 IP 地址呢?

注意:是的,我们承认:我们在这里可能有点夸张。有点难为情但不得不承认,我们有时只抽 10 美元的雪茄。脚本专家对于之前的陈述可能带给您的不便深感抱歉。

当然,与大多数的 Microsoft 人员不同,脚本专家并非完全与世隔绝:我们意识到总是有少数人的银行帐户上没有几百万美金。(注意,我们并没有遇见过这样的人,而是在电视上看到过这样的一些人。或者至少我们认为我们曾经看到过;我们曾迅速将频道切换至著名富豪脚本专家的生活方式。)这意味着,对于有些人来说,变化是件好事。更改他们的 IP 地址显然是一件更好的事情:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colNetAdapters = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=True")

strIPAddress = Array("192.168.1.0")
strSubnetMask = Array("255.255.255.0")

For Each objNetAdapter in colNetAdapters
    errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
Next

在解释此脚本的工作原理之前,有一件事情需要提请您注意。我们假设(仅基于您已说明的事实)您只需要更改 IP 地址;换句话说,我们认为您不需要更改 IP 网关、DNS 服务器、WINS 服务器等等。所有这些(甚至更多)都可使用脚本来修改,但我们可能要使用几百页稿纸来详细说明所有的可能情况。我们也很愿意这样做,只可惜大名鼎鼎的 Peter Costantini 已为我们做了这件事;有关详细信息,请查看 Peter 的经典之作自动配置客户端上的 TCP/IP 网络

不,尽管他本可以,但 Peter 未雇佣任何顾问:他完全是靠自己编写这个标题的。

真的。

现在,回到当前的问题。如我们所说,这是个非常简短的小脚本。我们先是连接到本地计算机上的 WMI 服务,当然,我们也可以使用该脚本为远程机器分配新的 IP 地址。(怎么办?只需将远程计算机的名称赋给变量 strComputer。)然后,使用下面的代码行返回该计算机上所有启用了 IP 的网络适配器的集合:

Set colNetAdapters = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=True")

下面是另一个需要注意的地方。此脚本假设在该计算机上只有一个启用了 IP 的网络适配器。可是,在如今这个时代,您很有可能在一台计算机上安装多个网络适配器。如果是这样,则您应修改此查询以仅返回要获取新 IP 地址的网络适配器。怎么做呢?一种简单的方法就是在查询中指定适配器 Description

Set colNetAdapters = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where Description = " & _
        "'Broadcom NetLink (TM) Gigabit Ethernet'")

那么,我们不可以在查询中使用 Description 属性来开始吗?当然可以,只是我们忘了我们网络适配器的说明。(好问题:我们刚才在想什么呢?)正因为如此,使用 IPEnabled=True 对于我们来说更为简单。但是,就像我们说过的,如果您安装了多个启用了 IP 的网络适配器,该脚本将不起作用。您必须确定哪种方法最适合您的具体情况。

脚本专家提示。如果您试图弄清楚,我们建议您编写查询,然后让脚本做一些无害的事情来进行测试,例如回显集合中的每一项的“说明”。在确定脚本会影响哪些适配器,不会影响哪些适配器之前,不要真正开始更改 IP 地址。

现在,我们进行到哪了?哦,对了:这两行代码:

strIPAddress = Array("192.168.1.0")
strSubnetMask = Array("255.255.255.0")

我们在此处要做的只是将新的 IP 地址 (192.168.1.0) 赋给变量 strIPAddress,并将相应的子网掩码 (255.255.255.0) 赋给变量 strSubnetMask。棘手的是我们必须以数组形式来赋值;因此使用了 Array 函数。是的,我们知道我们只有一个 IP 地址和一个子网掩码。但这并不重要;我们仍要将它们配置为数组,否则,脚本将失败。

设置了变量之后,我们只剩一件事情要做:实际分配新的 IP 地址和子网掩码。为此,我们设置一个 For Each 循环以遍历网络适配器集合(知道为什么我们的集合中只有一个这样的适配器是很重要的?),然后调用 EnableStatic 方法以分配新的 IP 地址:

For Each objNetAdapter in colNetAdapters
    errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
Next

是的,很简单:我们只将 EnableStatic 传递给我们的两个变量(strIPAddress 和 strSubnetMask)即大功告成了。

如前文所述,还有许多其他能够用脚本更改的网络适配器设置。但是,我们不得不请您参考 Peter 的白皮书以了解相关的信息。我们马上需要呼叫客房服务,再要一盘雪茄和一扎 100 美元的钞票。


更多信息

欢迎访问您好,脚本专家!- 存档

返回页首返回页首