如何在遠端主機電腦上,使用 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 無法在已停用 DCOM 的目的電腦上,暫時解決在 Microsoft 安全性公告 MS03-039 或 MS03-026 中所處理的弱點。
  • 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.vbsIpfile.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 (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Web Edition
  • Microsoft Windows XP Professional
  • 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