您现在的位置:主页 > 电脑网络 > 无线网络 >

使用脚本管理Windows网络 七:修复神秘的错误

时间:2019-05-08 00:24 点击:

  核心提示:本章关于使用脚本管理Windows网络,阐述了当使用我们之前开发的ChangeIPAddress.vbs脚本去修改远程计算机IP地址时,如何修复其产生的“远程程序调用失败”的错误...

  本章关于使用脚本管理Windows网络,阐述了当使用我们之前开发的ChangeIPAddress.vbs脚本去修改远程计算机IP地址时,如何修复其产生的“远程程序调用失败”的错误。原文发表于WindowsNetworking.com。

  在前面的文章“远程脚本初探”,我们使用之前开发的ChangeIPAddress.vbs脚本,将它修改了后用以修改远程计算机的IP地址。下面就就是我们修改的脚本:

  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 = "xp2"

  strAddress = Wscript.Arguments.Item(0)

  arrIPAddress = Array(strAddress)

  arrSubnetMask = Array("255.255.255.0")

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

  Set colNetAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

  For Each objNetAdapter in colNetAdapters

  errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)

  Next

  这一行:

  strComputer = "xp2"

  告诉我们,脚本的目标计算机名是XP2。远程计算机XP2原先的IP地址是172.16.11.43。

  现在,当我们从管理工作站XP上输入ChangeIPAddress.vbs 172.16.11.65运行脚本时,出现了下列情况:

  1. 脚本起作用了,如XP2的地址将从172.16.11.43 改为172.16.11.65;

  2. 脚本需要花费很长的时间才执行完;

  3. 脚本返回以下错误:

  C:\tools\ChangeIPAddress.vbs(23, 6) SWbemObjectEx: The remote procedure call failed.

  我们怎样处理这些结果呢?

  简单的解决方法

  其实我们可以对自己说,“好了,既然它已经起作用了,那么就让我们忽略这个错误吧。”对于这种说法是可以理解的。毕竟,任何现实的管理员都知道IT不是一个精确的科学工作,当我们无法设计妥善的解决方法时,我们往往最终采用“应急方案”来解决问题。

  因此,我们该如何忽略这个错误呢?只需在标头节添加以下这一行:

  On Error Resume Next

  换句话说,我们脚本的头部将是这样的:

  Option Explicit

  On Error Resume Next

  Dim objWMIService

  etc.

  现在,我们就不会看到错误,而且我们的脚本也可以正常工作了。但是,它仍然需要一段较长的时间来执行,事实上,足足超过一分钟。这又该怎么办呢?

  解决错误讯息

  错误消息有时是很隐秘的,这是其中的一个。这里是又一个错误消息:

  SWbemObjectEx: The remote procedure call failed.

  这是产生错误的那一行代码:

  errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)

  现在这行代码工作了(如,目标计算机IP地址修改了)但它抛出了一个错误,为什么呢?

  让我们先设法理解SWebObjectEx的作用。从MSDN上快速搜索到这个网页,上面有这样的说明:

  Extends the functionality of SWbemObject. This object adds the Refresh method for SWbemRefresher objects.

  很好。这样看来SWbemObjectEx只是给SWbemObject增加了更多的功能。那么,SWbemObject又是什么呢?

  Contains and manipulates a single WMI object class or instance.

  那么,这是又意味着什么呢?网页上告诉了我们很多,但是却又相当怪异。但是,简而言之,SWbemObject(以及SWbemObjectEx )是你用于在WMI中管理或查询的。在我们的脚本上,我们正在查询Win32_NetworkAdapterConfiguration类和返回代表计算机网络适配器的colNetAdapters对象集合。因此,这个错误消息所指的SWbemObjectEx(或SWbemObject)仅仅是该对象代表网络适配器本身,即objNetAdapter 。

  那么,是SWbemObject导致了错误。为什么呢?

  于是,我必须得跟我一些脚本“高手”朋友交谈一下来尝试和解决这个问题。但是,直到现在我所得到的答复都不能完全令人满意。但是,不管怎么说,什么时候曾有过用 “满意”来描述IT管理员工作的吗?

  总之,这里的似乎是存在问题的。根据其中的一位高手所言,似乎Windows XP上的更新补丁的“某个东西”可能已经改变了当导致错误的语句执行时返回调用的创建和提交方式。通常情况下,如果Win32_NetworkAdapterConfiguration类的实例对象的EnableStatic方法调用成功完成,它将返回0,这意味着没有错误,而如果调用返回1,那么这意味着需要重新启动(见本页下的“Return Value”的更多信息)。当然,在Windows XP上,当你更改需网络适配器的IP地址时是不需要重新启动的。如果由于某种原因,更新补丁可能已经改变了一些WMI提供者或其他一些内部元素,因此,Windows认为在目标机器采用新的地址之前系统需要重新启动,而这正是导致错误的原因,因为网络适配器配置的机器一直保持不定型的状态,直到机器被重新启动。但是,当目标计算机的网络适配器配置进入这个不确定状态时,由于脚本仍在管理工作站运行,两台主机的RPC连接在脚本完成运行之前便开始了工作。因此,这就产生了错误。

  至少目前来说,这是我能够给出的最佳答案,我将继续进行调研。但是,同时让我们看看我们是否能够设法将这个问题隔离开来,即这个错误只有在Win32_NetworkAdapterConfiguration上的 EnableStatic方法才出现,而不是普遍存在的。如果我们尝试写一个脚本对目标机器的网络适配器进行不一样的操作,而不是改变其IP地址呢?例如,改变目标机器的默认网关而不是IP地址?如果这一方法可行,那么至少我们知道,我们可以成功地从管理员工作站上连接远程计算机,并调用WMI方法来改变网络设置。

  改变默认网关

作者:采集侠  来源:网络整理
  • 电脑维修知识网(xxxxxx.com) © 2014 版权所有 All Rights Reserved.
  • Email:pcweixiu@tom.com 站长QQ:20567788
  • 技术支持与报障: 电脑维修知识网