Instalace opravy zabezpečení 824146 (MS03-039) nebo 823980 (MS03-026) do vzdálených hostitelských počítačů pomocí skriptu v jazyce Visual Basic

Překlady článku Překlady článku
ID článku: 827227 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Součástí tohoto článku je ukázkový skript v jazyce Microsoft Visual Basic Scripting Edition nazvaný Patchinstall.vbs. Tento skript představuje příklad, jak mohou správci sítě použít skriptování WMI (Windows Management Instrumentation) k instalaci opravy zabezpečení 824146 (MS03-039) nebo 823980 (MS03-026) do vzdálených hostitelských počítačů v prostředí domény Microsoft Windows NT, Windows 2000 nebo Windows Server 2003, v nichž tato oprava dosud není nainstalována. Skript Patchinstall.vbs použije vstupní soubor (Ipfile.txt) obsahující adresy IP a nainstaluje opravu zabezpečení 824146 (MS03-039) nebo 823980 (MS03-026) ze známého umístění do vzdáleného hostitelského počítače (C:\Patchinst.exe). Další informace o opravě zabezpečení 824146 (MS03-026) získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
824146 MS03-039: Přetečení vyrovnávací paměti ve službě RPCSS umožňuje útočníkovi spustit nebezpečné programy
Další informace o opravě zabezpečení 823980 získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
823980 MS03-026: Přetečení vyrovnávací paměti v rozhraní protokolu RPC umožňuje spuštění kódu
Další informace o nástroji, jehož pomocí mohou správci sítě rozpoznat v síti počítače, ve kterých nejsou nainstalovány tyto opravy zabezpečení, získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
827363 Použití skenovacího nástroje KB 824146 k určení hostitelských počítačů, ve kterých nejsou nainstalovány opravy zabezpečení 823980 (MS03-026) a 824146 (MS03-039)

Poznámky

  • K úspěšné instalaci opravy zabezpečení 824146 nebo 823980 potřebujete oprávnění správce vzdálených cílových počítačů.
  • Cílové počítače se systémem Microsoft Windows XP musí být připojeny do domény Windows NT, Windows 2000 nebo Windows Server 2003, aby mohl být skript Patchinstall.vbs úspěšně použit.
  • Skript Patchinstall.vbs používá službu WMI (Windows Management Instrumentation). Služba WMI závisí na modelu DCOM (Distributed Component Object Model). Z toho důvodu nelze skript Patchinstall.vbs použít v cílových počítačích, v nichž byl model DCOM zakázán z důvodu ochrany proti chybě popsané v bulletinech Microsoft Security Bulletin MS03-039 a MS03-026.
  • Balíček opravy zabezpečení 824146 nebo 823980 je třeba umístit do místní složky v počítači, v němž bude spuštěn skript Patchinstall.vbs, a přejmenovat na Patch_XP.exe (v systému Windows XP), Patch_W2K.exe (v systému Windows 2000) nebo Patch_W2K3.exe (v systému Windows Server 2003).
  • Skript Patchinstall.vbs lze upravit tak, aby instaloval také další opravy.

Další informace

Skript Patchinstall.vbs provede následující úkoly:
  • Přečte seznam adres IP vzdálených hostitelských počítačů, do nichž má být nainstalována oprava zabezpečení 824146 nebo 823980. Skript tento seznam získá z textového souboru ve formátu ASCII (Ipfile.txt), který obsahuje seznam adres IP (jedna adresa IP na každém řádku). Jako soubor Ipfile.txt můžete například použít soubor protokolu Vulnerable.txt skenovacího nástroje KB824146.
  • Skript získá první adresu IP ze seznamu.
  • Skript určí verzi systému Windows v cílovém počítači.
  • Skript provede mapování jednotky Z v počítači se skriptem na jednotku C$ v cílovém počítači.
  • Skript zkopíruje správnou verzi opravy (pro systém Windows XP, Windows 2000 nebo Windows Server 2003) do souboru C:\Patchinst.exe v cílovém počítači (pomocí mapování jednotky Z).
  • Skript spustí instalaci opravy a potom automaticky restartuje cílový počítač bez jakéhokoli uživatelského vstupu nebo zobrazení dialogových oken pomocí přepínačů -q -f (bezobslužný režim instalace).
  • Skript vyčká na dokončení instalace.
  • Skript se pokusí odstranit soubor C:\Patchinst.exe z cílového počítače.
  • Skript odstraní mapování jednotky Z.
  • Skript zpracuje další adresu IP v seznamu.
Důležité: Společnost Microsoft doporučuje upravit tento ukázkový skript pro prostředí vaší sítě a potom jej před použitím ve výrobním prostředí otestovat v testovacím prostředí.

Chcete-li skript Patchinstall.vbs použít, zkopírujte následující skript do textového souboru nazvaného Patchinstall.vbs. Potom spusťte skript Patchinstall.vbs zadáním následujícího příkazu na příkazovém řádku:
cscript patchinstall.vbs Ipfile.txt Místní_cesta_k_opravám
V tomto příkazu představuje parametr Ipfile.txt textový soubor obsahující seznam adres IP vzdálených hostitelských počítačů, do nichž chcete instalovat opravu zabezpečení 824146 nebo 823980. Místní_cesta_k_opravám je úplná cesta ke složce obsahující balíčky opravy zabezpečení 824146 nebo 823980 (přejmenované v systému Windows XP na Patch_XP.exe, v systému Windows 2000 na Patch_W2k.exe a v systému Windows Server 2003 na Patch_W2k3.exe).

Skript Patchinstall.vbs

Společnost Microsoft poskytuje ukázky programování pouze pro ilustraci bez žádné záruky výslovně uvedené nebo mlčky předpokládané, včetně, bez omezení, mlčky předpokládaných záruk vztahujících se k obchodovatelnosti nebo vhodnosti pro určitý účel. Tento článek předpokládá, že uživatel je obeznámen s programovacím jazykem, který je předmětem ukázky, a s nástroji použitými pro vytvoření a ladění skriptu. Pracovníci odborné pomoci společnosti Microsoft mohou vysvětlit funkce určitého postupu, nemohou však následující příklady rozšířit o další funkce nebo konstrukce podle konkrétních požadavků uživatele.
' 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

Vlastnosti

ID článku: 827227 - Poslední aktualizace: 9. srpna 2005 - Revize: 5.4
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbinfo KB827227

Dejte nám zpětnou vazbu

 

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