使用脚本程序管理Windows网络 第六部分:远程脚本

日期: 2008-10-05 作者:Mitch Tulloch翻译:曾少宁 来源:TechTarget中国 英文

本文主要学习如何在一个远程Windows XP计算上远程地运行你的脚本,原文发布于WindowsNetworking.com。 在上一篇文章中,我们探讨了“Win32_NetworkAdapterConfiguration类的使用”和“跨过一道学习的坎”这两个个许多Windows管理员在学习脚本编写都会遇到的问题。 现在让我们回顾一下我们的修改网络适配器IP地址的ChangeIPAddress.vbs脚本: Option Explicit  Dim objWMIService Dim objNetAdapter Dim strComputer&……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

本文主要学习如何在一个远程Windows XP计算上远程地运行你的脚本,原文发布于WindowsNetworking.com。

在上一篇文章中,我们探讨了“Win32_NetworkAdapterConfiguration类的使用”和“跨过一道学习的坎”这两个个许多Windows管理员在学习脚本编写都会遇到的问题。

现在让我们回顾一下我们的修改网络适配器IP地址的ChangeIPAddress.vbs脚本:

Option Explicit 
Dim objWMIService
Dim objNetAdapter
Dim strComputer 
Dim strAddress 
Dim arrIPAddress
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic
If WScript.Arguments.count = 0 Then
    Wscript.Echo "Usage: ChangeIPAddress.vbs new_IP_address"
    WScript.Quit
End If
strComputer = "."
strAddress = Wscript.Arguments.Item(0) 
arrIPAddress = Array(strAddress) 
arrSubnetMask = Array("255.255.255.0")
Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2")
Set colNetAdapters = objWMIService.execQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
    errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask) 
Next

注意,我已经删除了注释以及最后显示结果的代码。

现在记住脚本的以下行为:

  • 它连接到本地计算机的rootcimv2命名空间;

  • 它使用一个select语句返回绑定和激活了TCP/IP的网络适配器集合;

  • 它将适配器的IP地址修改成命令行参数所指定的值。

假定我们将这个脚本保存在一个静态IP地址为172.16.11.43的Windows XP机器的目录:C:localtest上。然后我们用管理员权限的用户打开命令提示符,再用这个脚本将机器的IP地址修改成172.16.11.54:

C:locatest>ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
    Connection-specific DNS Suffix . :
    IP Address. . . . . . . . . . . . : 172.16.11.43
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 172.16.11.1
C:locatest>ChangeIPAddress.vbs 172.16.11.54
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
C:locatest>ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
    Connection-specific DNS Suffix . :
    IP Address. . . . . . . . . . . . : 172.16.11.54
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 172.16.11.1
C:locatest>

提示1:记住修改Windows XP机器的IP地址要求本地的管理员权限。所以如果你当前以一个域用户登录到机器上,你需要打开一个命令提示符,然后输入:runas /user:administrator cmd.exe来打开第2个命令提示符,它就是运行在本地管理员权限上下文的,然后在第2个命令行提示符上运行这个脚本。

但如果我们想在一台机器上(如xp2.contoso.com)运行这个脚本去修改另一台机器(xp.contoso.com)的IP地址又应该怎么做呢?换句话说,我们想要运行脚本去完成远程Windows XP计算机的任务。我们要怎么实现?

第一次尝试

首先我们用我们Mary Jones的域管理员帐号登录到我们管理员工作站xp.contoso.com。因为域管理员拥有所有域内机器的本地管理员权限,所以当我们从我们管理员工作站运行我们的脚本作用于远程机器,它应该是能工作的,对吗?

假定我们的脚本ChangeIPAddress.vbs是我们管理员工作站的目录:C:tools,我们打开一个命令提示符然后输入下面的命令:

C:Documents and Settingsmjones>cd tools
C:tools>notepad ChangeIPAddress.vbs
Our script opens in Notepad, and we change this line:
strComputer = "."
to read the following:
strComputer = "xp2 "
We then select File | Save to save changes, and close Notepad. Now let’s run the script:
C:tools>ChangeIPAddress.vbs 172.16.11.65 
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
C:toolsChangeIPAddress.vbs(20, 1) Microsoft VBScript runtime error: The remote server machine does not exist or is unavailable: ’GetObject’
C:tools>

注意这需要运行一段时间后上面的错误消息才最终返回。但操作成功了吗?这样,如果我登录到远程机器xp2,contoso,com上,打开命令提示符然后输入ipconfig,我会得到:

C:locatest>ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
    Connection-specific DNS Suffix . :
    IP Address. . . . . . . . . . . . : 172.16.11.43
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 172.16.11.1
C:locatest>

这样看来这个机器的地址仍然是17216.11.43,脚本并没有产生作用。怎么可能?是哪里出问题了呢?我们从错误信息上看到在脚本的第20行的地方出现了一个运行错误,让我们看看第20行是什么:

Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2")

所以看起来我们的脚本不能连接到远程机器的WMI服务。那又是什么导致这个错误呢?

第二次尝试

也许这跟远程机器的Windows防火墙设置有关系。

记住,Windows XP SP2带有一个防火墙,它会阻挡除配置的例外程序之外的所有到达的网络流量。测试是否由于防火墙引起的最简单的办法是先暂时禁用目标机器的Windows防火墙。可以这样做,我们先以管理员身份登录xp2.contoso.com,从“控制面板”打开“Widnows防火墙”工具,在“常规”标签中选择“关闭”选项。

现在让我们在管理员工作站上再一次运行脚本:

C:tools>ChangeIPAddress.vbs 172.16.11.65Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
C:toolsChangeIPAddress.vbs(23, 6) SWbemObjectEx: The remote procedure call failed.
C:tools>

没错,又一个错误,同样它需要运行一段时间后才出现这个错误的。但至少这是一个不同的错误了,它显示在第23行出了问题:

errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)

然而,当我在远程机器上的命令提示符输入ipconfig时,我得以这样的结果:

C:locatest>ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
    Connection-specific DNS Suffix . :
    IP Address. . . . . . . . . . . . : 172.16.11.65
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 172.16.11.1
C:locatest>

所以看起来我们的脚本已经生效了!我们已经达到目的了!但这里仍有两个疑问:

  • 我们不想通过禁用远程机器的Windows防火墙来允许脚本对它操作。所以在这些机器上是否应该有一个防火墙例外设置使得在防火墙打开时允许远程脚本来操作它?

  • 上面的RPC错误是怎么回事?脚本已经生效了但为什么还有错误?

远程脚本异常

首先我们在远程机器上重新启用Windows防火墙。这样它将再次阻挡我们的脚本对它进行远程操作。然后在远程机器的管理员级的命令提示符上,输入gpedit.msc打开“本地计算机策略”,找到下面的策略设置(如图1):

图1:激活远程管理的Windows防火墙策略设置

图1:激活远程管理的Windows防火墙策略设置

双击这个策略设置并在本地子网(如图)中激活它。我们这样做是因为我们知道我们的管理工作站与目标计算机是在同一个子网的。

图2:激活远程管理例外

图2:激活远程管理例外

提示2:当然,你也许想要用不同的方法实现这个设置,如在一个域的Group Policy Object (GPO)而不是在本地配置这个策略的设置。依据这种方式,你就不需要通过远程机器来激活这个防火墙例外设置。

现在让我们在管理工作站再次运行脚本,试着把远程机器的IP地址从172.16.11.65修改成172.16.11.66:

C:tools>ChangeIPAddress.vbs 172.16.11.66
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
C:toolsChangeIPAddress.vbs(23, 6) SWbemObjectEx: The remote procedure call failed.
C:tools>

和之前一样的错误,但当我在远程机器上的命令提示符输入ipconfig 后我得到这样的结果:

C:locatest>ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
    Connection-specific DNS Suffix . :
    IP Address. . . . . . . . . . . . : 172.16.11.66
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 172.16.11.1
C:locatest>

成功了!所以保持激活远程机器上的Windows防火墙,但使用Group Policy在防火墙上对远程管理打开一个例开设置,我们就可以在一个管理工作站运行脚本来远程地修改机器的IP地址了。

这样我们就解决了第一个疑问了,但第二个呢?

我喜欢神秘些,所以让我们留到下一篇文章再解决。

作者

Mitch Tulloch
Mitch Tulloch

Mitch Tulloch是一个作家、培训师和Windows服务器操作系统、IIS管理、网络故障修复和安全方面的专业顾问。他已经写了15本书,其中包括:Microsoft Encyclopedia of Networking (Microsoft Press),Microsoft Encyclopedia of Security (Microsoft Press),Windows Server Hacks (O'Reilly),Windows Server 2003 in a Nutshell (O'Reilly),Windows 2000 Administration in a Nutshell (O'Reilly),and IIS 6 Administration (Osborne/McGraw-Hill)。Mitch居住在加拿大的Winnipeg,你可以他的网站www.mtit.com查到更多关于他的书的信息。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。