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

文章翻译 文章翻译
文章编号: 827227 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文包括一个名为 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 知识库中相应的文章:
824146 MS03-039:RPCSS 中的缓冲区溢出使攻击者可以运行恶意程序
有关 823980 安全修补程序的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
823980 MS03-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 cl

on error resume next

const 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 0
end if

' USAGE
if 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.quit
end if

ipFile = 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.quit
end 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.quit
end if

exeWinXP = ofs.getfile(localPathToPatches + XP_Patch).name
exeW2k = ofs.getfile(localPathToPatches + W2k_Patch).name
exeW2k3 = 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.quit
end if


set osvcLocal = getobject("winmgmts:root\cimv2")

'The error-handling code is below the function that may throw one - execute it.
on error resume next

while 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... 
wend

oipFile.close()

'Clean up, remove drive mapping (check this time, because it may not have been mapped).
if ofs.folderexists("z:\") then
     onet.removenetworkdrive "z:", true
end if

wscript.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 = systemType

end function

属性

文章编号: 827227 - 最后修改: 2005年8月8日 - 修订: 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
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com