Como utilizar um script do Visual Basic para instalar o patch de segurança 824146 (MS03-039) ou 823980 (MS03-026) em computadores anfitriões remotos

Traduções de Artigos Traduções de Artigos
Artigo: 827227 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo inclui um script de exemplo do Microsoft Visual Basic Scripting Edition com o nome Patchinstall.vbs. Este script é um exemplo de como um administrador de rede pode utilizar scripts de Windows Management Instrumentation (WMI) para instalar o patch de segurança 824146 (MS03-039) ou 823980 (MS03-026) em computadores anfitriões remotos sem os patches instalados, num ambiente de domínio do Microsoft Windows NT, Windows 2000 ou Windows Server 2003. O script Patchinstall.vbs utiliza um ficheiro (Ipfile.txt), que contém endereços IP, como entrada e instala o patch de segurança 824146 (MS03-039) ou 823980 (MS03-026), a partir de uma localização conhecida, no computador anfitrião remoto (C:\Patchinst.exe). Para obter informações adicionais sobre o patch de segurança 824146 (MS03-039), clique no número de artigo que se segue para visualizar o artigo na base de dados de conhecimento da Microsoft (KB, Microsoft Knowledge Base):
824146 MS03-039: Uma sobrecarga da memória intermédia no RPCSS pode permitir que um atacante execute programas maliciosos
Para obter informações adicionais sobre o patch de segurança 823980, clique no número de artigo que se segue para visualizar o artigo na base de dados de conhecimento da Microsoft (KB, Microsoft Knowledge Base):
823980 MS03-026: Uma sobrecarga da memória intermédia na RPC pode permitir a execução de código
Para obter informações adicionais sobre uma ferramenta que os administradores de rede podem utilizar para verificar se existem computadores nas mesmas que não tenham estes patches de segurança instalados, clique no número de artigo que se segue para visualizar o artigo na base de dados de conhecimento da Microsoft (KB, Microsoft Knowledge Base):
827363 Como utilizar a ferramenta de verificação KB 824146 para identificar computadores anfitriões que não tenham os patches de segurança 823980 (MS03-026) e 824146 (MS03-039) instalados

Notas

  • Tem de ter permissões de administrador nos computadores de destino remotos para poder instalar o patch de segurança 824146 ou 823980 com êxito.
  • Os computadores de destino baseados no Microsoft Windows XP devem estar associados a um domínio do Windows NT, Windows 2000 ou Windows Server 2003, para a utilização do script Patchinstall.vbs com êxito.
  • O script Patchinstall.vbs utiliza o Windows Management Instrumentation (WMI). O WMI depende do DCOM (Distributed Component Object Model). Consequentemente, o Patchinstall.vbs não funciona em computadores de destino onde o DCOM tenha sido desactivado para contornar a vulnerabilidade abordada nos boletins de segurança MS03-039 ou MS03-026 da Microsoft.
  • Os pacotes dos patches de segurança 824146 ou 823980 devem estar localizados numa pasta local do computador onde o administrador vai executar o script Patchinstall.vbs, e os nomes dos pacotes devem ser alterados para Patch_XP.exe (para o Windows XP), Patch_W2K.exe (para o Windows 2000) e Patch_W2K3.exe (para o Windows Server 2003).
  • Pode modificar o script Patchinstall.vbs para instalar outros patches.

Mais Informação

O script Patchinstall.vbs efectua as seguintes tarefas:
  • O script lê uma lista de endereços IP dos computadores anfitriões remotos onde o administrador pretende instalar o patch de segurança 824146 ou 823980. O script obtêm esta lista a partir de um ficheiro de texto ASCII (Ipfile.txt) que contém uma lista de endereços IP (um endereço IP por linha). Por exemplo, pode utilizar o ficheiro de registo Vulnerable.txt da ferramenta de verificação KB824146 para o ficheiro Ipfile.txt .
  • O script obtém o primeiro endereço IP da lista.
  • O script determina a versão do Windows instalada no computador de destino.
  • O script mapeia a unidade Z no computador do script para C$ no computador de destino.
  • O script copia a versão correcta do patch (para o Windows XP, Windows 2000 ou Windows Server 2003) para C:\Patchinst.exe, no computador de destino (utilizando a unidade Z mapeada).
  • O script instala o patch e, em seguida, reinicia automaticamente os computadores de destino sem a intervenção do utilizador nem apresentação de caixas de diálogo, através da utilização dos parâmetros -q -f (modo de instalação automática).
  • O script espera que a instalação seja concluída.
  • O script tenta eliminar o ficheiro C:\Patchinst.exe do computador de destino.
  • O script remove o mapeamento da unidade Z.
  • O script processa o endereço IP seguinte da lista.
Importante: a Microsoft recomenda que modifique este script de exemplo para o ambiente da sua rede e que teste esse script num ambiente de teste antes de utilizá-lo num ambiente de produção.

Para utilizar o script Patchinstall.vbs, cole o seguinte script num ficheiro de texto com o nome Patchinstall.vbs. Em seguida, execute o script Patchinstall.vbs utilizando a seguinte linha de comando:
cscript patchinstall.vbs Ipfile.txt LocalPathToPatches
Neste comando, Ipfile.txt é o ficheiro de texto que contém uma lista de endereços IP dos computadores anfitriões remotos onde pretende instalar o patch de segurança 824146 ou 823980. LocalPathToPatches é o caminho completo de uma pasta que contém os pacotes dos patches de segurança 824146 ou 823980 (com o nome alterado para Patch_XP.exe para o Windows XP, Patch_W2k.exe para o Windows 2000 e Patch_W2k3.exe para o Windows Server 2003).

O script Patchinstall.vbs

A Microsoft fornece exemplos de programação apenas a título informativo, sem garantia expressa ou implícita, incluindo, sem limitação, as garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que o utilizador conhece a linguagem de programação apresentada e as ferramentas utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador.
' 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

Propriedades

Artigo: 827227 - Última revisão: 8 de agosto de 2005 - Revisão: 5.4
A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbinfo KB827227

Submeter comentários

 

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