你目前正处于脱机状态,正在等待 Internet 重新连接

如何使用 Visual Basic 脚本在远程主机上安装 824146 (MS03-039) 或 823980 (MS03-026) 安全修补程序

针对 Windows XP 的支持已终止

Microsoft 已于 2014 年 4 月 8 日终止了针对 Windows XP 的支持。该更改已影响到您的软件更新和安全选项。 了解这一措施对于您的含义以及如何继续保持受保护状态。

针对 Windows Server 2003 的支持已于 2015 年 7 月 14 日终止。

Microsoft 已于 2015 年 7 月 14 日终止了对于 Windows Server 2003 的支持。该更改已影响到您的软件更新和安全选项。 了解这一措施对于您的含义以及如何继续保持受保护状态。

概要
本文包括一个名为 Patchinstall.vbs 的 Microsoft Visual Basic Scripting Edition 脚本示例。该脚本示例演示了在 Microsoft Windows NT、Windows 2000 或 Windows Server 2003 域环境中,网络管理员如何使用 Windows Management Instrumentation (WMI) 脚本,在没有安装 824146 (MS03-039) 或 823980 (MS03-026) 安全修补程序的远程主机上安装此修补程序。Patchinstall.vbs 脚本利用一个包含 IP 地址的文件 (Ipfile.txt) 作为输入,并从远程主机上的已知位置 (C:\Patchinst.exe) 安装 824146 (MS03-039) 或 823980 (MS03-026) 安全修补程序。 有关 824146 (MS03-039) 安全修补程序的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
824146MS03-039:RPCSS 中的缓冲区溢出使攻击者可以运行恶意程序
有关 823980 安全修补程序的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
823980MS03-026:RPC 中的缓冲区溢出可能允许执行代码
有关网络管理员可以用来扫描网络以找出没有安装这些安全修补程序的计算机的工具的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中的相应文章:
827363如何使用 KB 824146 扫描工具来确定未安装 823980 (MS03-026) 和 824146 (MS03-039) 安全修补程序的主机

注意

  • 您必须在远程目标计算机上拥有管理权限才能成功安装 824146 或 823980 安全修补程序。
  • 基于 Microsoft Windows XP 的目标计算机必须加入 Windows NT、Windows 2000 或 Windows Server 2003 域才能成功使用 Patchinstall.vbs 脚本。
  • Patchinstall.vbs 脚本使用 Windows Management Instrumentation (WMI)。WMI 依赖于分布式组件对象模型 (DCOM)。因此,Patchinstall.vbs 无法在为了解决 Microsoft 安全公告 MS03-039 或 MS03-026 针对的漏洞而禁用 DCOM 的目标计算机上运行。
  • 824146 或 823980 安全修补程序包必须位于运行 Patchinstall.vbs 脚本的计算机的本地文件夹中,并且这些程序包必须重命名为 Patch_XP.exe(用于 Windows XP)、Patch_W2K.exe(用于 Windows 2000)和 Patch_W2K3.exe(用于 Windows Server 2003)。
  • 您可以修改 Patchinstall.vbs 脚本来安装其他修补程序。
更多信息
Patchinstall.vbs 脚本执行以下任务:
  • 脚本读取要安装 824146 或 823980 安全修补程序的远程主机的 IP 地址列表。脚本从一个包含 IP 地址列表(每行一个 IP 地址)的 ASCII 文本文件 (Ipfile.txt) 中获取此列表。例如,可以将 KB824146 扫描工具生成的 Vulnerable.txt 日志文件用作 Ipfile.txt 文件。
  • 脚本从列表中获取第一个 IP 地址。
  • 脚本确定目标计算机上的 Windows 版本。
  • 脚本将脚本计算机上的驱动器 Z 映射到目标计算机上的 C$。
  • 脚本将修补程序(适用于 Windows XP、Windows 2000 或 Windows Server 2003)的正确版本复制到目标计算机上的 C:\Patchinst.exe 中(通过使用驱动器 Z 映射)。
  • 使用 -q -f 开关(“无人参与”安装模式),目标计算机在脚本安装完修补程序后即可自动重新启动,无需任何用户输入,也不显示任何对话框。
  • 脚本等待安装过程完成。
  • 脚本尝试删除目标计算机上的 C:\Patchinst.exe 文件。
  • 脚本删除驱动器 Z 映射。
  • 脚本处理列表中的下一个 IP 地址。
重要说明:Microsoft 建议根据具体的网络环境对此示例脚本进行修改,然后先在测试环境中对其进行测试,再在生产环境中使用它。

要使用 Patchinstall.vbs 脚本,请将下面的脚本粘贴到名为 Patchinstall.vbs 的文本文件中。然后,使用下面的命令行运行 Patchinstall.vbs 脚本:
cscript patchinstall.vbs Ipfile.txt LocalPathToPatches
在此命令中,Ipfile.txt 是一个包含要安装 824146 或 823980 安全修补程序的远程主机的 IP 地址列表的文本文件。LocalPathToPatches 是包含 824146 或 823980 安全修补程序包(对于 Windows XP,重命名为 Patch_XP.exe;对于 Windows 2000,重命名为 Patch_W2k.exe;对于 Windows Server 2003,重命名为 Patch_W2k3.exe)的文件夹的完整路径。

Patchinstall.vbs 脚本

Microsoft 提供的编程示例只用于说明目的,不附带任何明示或默示的保证。这包括但不限于对适销性或特定用途适用性的默示保证。本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能,但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特殊需求。
' Patchinstall.vbs' Patch installation script for MS03-026 and MS03-039' (c) Microsoft 2003' v1.03 clon error resume nextconst XP_Patch = "Patch_XP.exe"const W2k_Patch = "Patch_W2k.exe"const W2k3_Patch = "Patch_W2k3.exe"If right(ucase(wscript.FullName),11)="WSCRIPT.EXE" then     wscript.echo "ERROR: You must run this script using cscript, for example 'cscript " & wscript.scriptname & "'."     wscript.quit 0end if' USAGEif wscript.arguments.count <> 2 then     wscript.echo "Usage: cscript " & wscript.scriptname & " <IpFile.txt> <LocalPathToPatches>" & vbCrLf & vbCrLf & _     "  <LocalPathToPatches> must be a full path of a folder that contains all of these files:" & vbCrLf & _     "      " & XP_Patch & vbCrLf & _      "      " & W2k_Patch & vbCrLf & _      "      " & W2k3_Patch     wscript.quitend ifipFile = wscript.arguments(0)localPathToPatches = wscript.arguments(1)set onet = createobject("wscript.network")set ofs = createobject("scripting.filesystemobject")' Verify that ipfile is accessible.set oipFile = ofs.opentextfile(ipFile, 1, false)if (Err.Number <> 0) then     wscript.echo "Cannot open " & ipFile     wscript.quitend if' Make sure to end with a \ character.if right(localPathToPatches, 1) <> "\" then     localPathToPatches = localPathToPatches & "\"end if'Note that cim_datafile does not support UNC paths'so everything must be handled through mapped drives.if left(localPathToPatches, 2) = "\\" then     wscript.echo "<pathToExecutable> cannot be a UNC path, please map a drive locally"     wscript.quitend ifexeWinXP = ofs.getfile(localPathToPatches + XP_Patch).nameexeW2k = ofs.getfile(localPathToPatches + W2k_Patch).nameexeW2k3 = ofs.getfile(localPathToPatches + W2k3_Patch).name' Verify that the patches are accessible.if ((len(exeWinXP) = 0) OR (len(exeW2k) = 0) OR (len(exeW2k3) = 0)) then     wscript.echo "Cannot find patch files."     wscript.echo "Please verify that the <LocalPathToPatches> folder contains all of these files:" & vbCrLf & _     "      " & XP_Patch & vbCrLf & _      "      " & W2k_Patch & vbCrLf & _      "      " & W2k3_Patch     wscript.quitend ifset osvcLocal = getobject("winmgmts:root\cimv2")'The error-handling code is below the function that may throw one - execute it.on error resume nextwhile not oipFile.atEndOfStream     ip = oipFile.ReadLine()     wscript.echo vbCrLf & "Connecting to " & ip & "..."     Err.Clear     set osvcRemote = GetObject("winmgmts:\\" & ip & "\root\cimv2")     if (Err.Number <> 0) then          wscript.echo "Failed to connect to " & ip & "."     else          exeCorrectPatch = detectOSPatch(osvcRemote)          if (exeCorrectPatch <> "") then               ' Lay the bits on the remote computer.               wscript.echo "Installing patch " & exeCorrectPatch & "..."               onet.mapnetworkdrive "z:", "\\" & ip & "\C$"               set osourceFile = osvcLocal.get("cim_datafile=""" & replace(localPathToPatches, "\", "\\") & exeCorrectPatch & """")               ret = osourceFile.Copy("z:\\Patchinst.exe")               if (ret <> 0 and ret <> 10) then                    ' Failure detected and failure was not "file already exists."                    wscript.echo "Failed copy to " & ip & " - error: " & ret               else                    set oprocess = osvcRemote.Get("win32_process")                         ' Start the installation without user interaction, and force a restart after completion.                    ret = oprocess.create("c:\\Patchinst.exe -q -f")                    if (ret <> 0) then                         wscript.echo "Failed to start process on " & ip & ": " & ret                    else                         ' Get a reference to the file that was copied.                         set odestFile = osvcLocal.get("cim_datafile=""z:\\Patchinst.exe""")                         ' Wait for the installation to complete.                         for waitTime = 0 to 120     ' Lay and wait--up to two minutes for the installation to complete.                              wscript.Sleep 1000     ' Sleep one second.                              ' Delete temporary file as soon as possible after it is freed.                              if (odestFile.Delete() = 0) then                                   exit for                              end if                         next ' Otherwise, loop again and keep waiting...                         wscript.echo "Installation successful."                    end if     'Create process succeeded.               end if     'Copy succeeded.               onet.removenetworkdrive "z:", true          end if      ' The script knows which patch to install.     end if ' Do the next IP address, then the next IP address... wendoipFile.close()'Clean up, remove drive mapping (check this time, because it may not have been mapped).if ofs.folderexists("z:\") then     onet.removenetworkdrive "z:", trueend ifwscript.echo vbCrLf & "Patching complete. Exiting."function detectOSPatch(osvcRemote)     set oOSInfo = osvcRemote.InstancesOf("Win32_OperatingSystem")     'Only one instance is ever returned (the currently active OS), even though the following is a foreach.     for each objOperatingSystem in oOSInfo          if (objOperatingSystem.OSType <> 18) then               ' Make sure that this computer is Windows NT-based.               wscript.echo ip & " is not a Windows XP, Windows 2000, or Windows 2003 Server computer."          else               if (objOperatingSystem.Version = "5.0.2195") then                    ' Windows 2000 SP2, SP3, SP4.                    if (objOperatingSystem.ServicePackMajorVersion = 2) or (objOperatingSystem.ServicePackMajorVersion = 3) or _			(objOperatingSystem.ServicePackMajorVersion = 4) then                         systemType = exeW2k                    end if               elseif (objOperatingSystem.Version = "5.1.2600") then                    ' Windows XP RTM, SP1.                    if (objOperatingSystem.ServicePackMajorVersion = 0) or (objOperatingSystem.ServicePackMajorVersion = 1) then                         systemType = exeWinXP                    end if               elseif (objOperatingSystem.Version = "5.2.3790") then                    ' Windows Server 2003 RTM                    if (objOperatingSystem.ServicePackMajorVersion = 0) then                         systemType = exeW2k3                    end if               end if               if (systemType = "") then                     'This was a Windows NT-based computer, but not with a valid service pack.                    wscript.echo "Could not patch " & ip & " - unhandled OS version: " & objOperatingSystem.Caption & " SP" & _				objOperatingSystem.ServicePackMajorVersion & "("& objOperatingSystem.Version & ")"               end if          end if     next     detectOSPatch = systemTypeend function
属性

文章 ID:827227 - 上次审阅时间:08/08/2005 10:44:48 - 修订版本: 5.4

Microsoft Windows Server 2003 Datacenter Edition, Microsoft Windows Server 2003 Enterprise Edition, Microsoft Windows Server 2003 Standard Edition, Microsoft Windows Server 2003 Web Edition, Microsoft Windows XP Professional Edition, Microsoft Windows XP Tablet PC Edition, Microsoft Windows 2000 Advanced Server, Microsoft Windows 2000 Professional Edition, Microsoft Windows 2000 Server

  • kbinfo KB827227
反馈
tml>