Dit artikel bevat een voorbeeldscript met de naam Patchinstall.vbs dat is geschreven in Microsoft Visual Basic Scripting Edition. Dit voorbeeldscript laat zien hoe netwerkbeheerders gebruik kunnen maken van Windows Management Instrumentation-scripts (WMI) voor de installatie van beveiligingspatch 824146 (MS03-039) of 823980 (MS03-026) op externe hostcomputers, wanneer de patch niet is geïnstalleerd in een Microsoft Windows NT-, Windows 2000- of Windows Server 2003-domein. Het script Patchinstall.vbs gebruikt een bestand (
IP-bestand.txt) met IP-adressen als invoer en installeert beveiligingspatch 824146 (MS03-039) of 823980 (MS03-026) vanaf een bekende locatie op de externe hostcomputer (C:\Patchinst.exe).
Klik voor meer informatie over beveiligingspatch 824146 (MS03-039) op het volgende artikelnummer in de Microsoft Knowledge Base:
824146
(http://support.microsoft.com/kb/824146/
)
MS03-039: Bufferoverschrijding in RPCSS kan leiden tot uitvoering van code
Klik voor meer informatie over beveiligingspatch 823980 op het volgende artikelnummer in de Microsoft Knowledge Base:
823980
(http://support.microsoft.com/kb/823980/
)
MS03-026: Bufferoverschrijding in RPC kan leiden tot uitvoering van code
Klik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie over een hulpprogramma waarmee netwerkbeheerders in hun netwerk kunnen zoeken naar computers waarop deze beveiligingspatches niet zijn geïnstalleerd:
827363
(http://support.microsoft.com/kb/827363/
)
Het hulpprogramma voor scannen uit KB824146 gebruiken om hostcomputers te identificeren waarop niet de beveiligingspatches 823980 (MS03-026) of 824146 (MS03-039) zijn geïnstalleerd
Opmerkingen
- U moet beheerdersrechten op de externe doelcomputers hebben om beveiligingspatch 824146 of 823980 te kunnen installeren.
- Externe Microsoft Windows XP-computers moeten deel uitmaken van een Windows NT-, Windows 2000- of Windows Server 2003-domein om gebruik te kunnen maken van het script Patchinstall.vbs.
- Patchinstall.vbs maakt gebruik van Windows Management Instrumentation (WMI). WMI is afhankelijk van het Distributed Component Object Model (DCOM). Daarom werkt Patchinstall.vbs niet op doelcomputers waarop DCOM is uitgeschakeld om het beveiligingslek te omzeilen dat wordt beschreven in de Microsoft-beveiligingsbulletins MS03-039 en MS03-026.
- Beveiligingspatch 824146 of 823980 moet zich in een lokale map bevinden van de computer waarop u het script Patchinstall.vbs uitvoert en de naam van de pakketten moet worden gewijzigd in Patch_XP.exe (voor Windows XP), Patch_W2K.exe (voor Windows 2000) en Patch_W2K3.exe (voor Windows Server 2003).
- U kunt het script Patchinstall.vbs wijzigen om andere patches te installeren.
Patchinstall.vbs voert de volgende taken uit:
- Het script leest een lijst IP-adressen voor de externe hostcomputers waarop u beveiligingspatch 824146 of 823980 wilt installeren. Het script haalt deze gegevens op uit een ASCII-tekstbestand (IPbestand.txt) dat deze lijst met IP-adressen bevat (één IP-adres per regel). U kunt bijvoorbeeld het logbestand Vulnerable.txt van het hulpprogramma voor scannen KB824146 gebruiken als IP-bestand.txt.
- Het script haalt het eerste IP-adres op uit de lijst.
- Het script bepaalt de Windows-versie van de doelcomputer.
- Het script wijst station Z op de scriptcomputer toe aan C$ op de doelcomputer.
- Het script kopieert de juiste versie van de patch (voor Windows XP, Windows 2000 of Windows Server 2003) naar C:\Patchinst.exe op de doelcomputer (via de station Z-toewijzing).
- Via het script wordt de patch geïnstalleerd, waarna de doelcomputers automatisch opnieuw worden gestart door het gebruik van de schakelopties -q -f (installatie zonder toezicht).
- Het script wacht totdat de installatie is voltooid.
- Het script verwijdert het bestand C:\Patchinst.exe van de doelcomputer.
- Het script verwijdert de station Z-toewijzing.
- Het script gaat verder met het volgende IP-adres uit de lijst.
Belangrijk Microsoft raadt u aan eerst het voorbeeldscript voor uw netwerkomgeving te wijzigen en het script te testen in een testomgeving voordat u het gebruikt in een productieomgeving.
Als u Patchinstall.vbs wilt gebruiken, plakt u het volgende script in een tekstbestand met de naam Patchinstall.vbs. Vervolgens start u Patchinstall.vbs met de volgende opdrachtregel:
cscript patchinstall.vbs IP-bestand.txt LokaalPadNaarPatches
In deze opdracht is
IP-bestand.txt een tekstbestand met een lijst IP-adressen voor de externe hostcomputers waarop u beveiligingspatch 824146 of 823980 wilt installeren.
LokaalPadNaarPatches is het volledige pad van een map die beveiligingspatch 824146 of 823980 bevat (met de naam Patch_XP.exe voor Windows XP, Patch_W2k.exe voor Windows 2000 en Patch_W2k3.exe voor Windows Server 2003).
Het script Patchinstall.vbs
Microsoft verstrekt deze code zonder enige expliciete of impliciete garantie, daaronder mede begrepen, maar niet beperkt tot impliciete garanties met betrekking tot de verkoopbaarheid en/of geschiktheid voor een bepaald doel. In dit artikel wordt ervan uitgegaan dat u bekend bent met de programmeertaal VBScript, alsmede met de hulpprogramma's waarmee procedures worden gemaakt en waarmee fouten in procedures worden opgespoord. U kunt desgewenst contact opnemen met Microsoft Product Support Services voor uitleg over de functie van een bepaalde procedure. Microsoft Product Support Services is echter niet bereid de voorbeelden aan te passen om extra functies toe te voegen of om procedures te maken die aan uw specifieke eisen voldoen.
' Patchinstall.vbs
'Patch-installatiescript voor MS03-026 en 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: Voer dit script uit met behulp van cscript, bijvoorbeeld 'cscript " & wscript.scriptnaam & "'."
wscript.quit 0
end if
'GEBRUIK
if wscript.arguments.count <> 2 then
wscript.echo "Usage: cscript " & wscript.scriptname & " <IpFile.txt> <LocalPathToPatches>" & vbCrLf & vbCrLf & _
" <LocalPathToPatches> moet het volledige pad zijn naar een map die al deze bestanden bevat:" & 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")
' Controleren of ipfile toegankelijk is.
set oipFile = ofs.opentextfile(ipFile, 1, false)
if (Err.Number <> 0) then
wscript.echo "Cannot open " & ipFile
wscript.quit
end if
' Controleren of het laatste teken een backslash (\) is.
if right(localPathToPatches, 1) <> "\" then
localPathToPatches = localPathToPatches & "\"
end if
'Houd er rekening mee dat in cim_datafile geen UNC-paden worden ondersteund.
'Alles moet dus via toegewezen stations verlopen.
if left(localPathToPatches, 2) = "\\" then
wscript.echo "<pathToExecutable> kan geen UNC-pad zijn, wijs een station lokaal toe"
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
' Controleren of de patches toegankelijk zijn.
if ((len(exeWinXP) = 0) OR (len(exeW2k) = 0) OR (len(exeW2k3) = 0)) then
wscript.echo "Kan geen patchbestanden vinden."
wscript.echo "Controleer of de map <LocalPathToPatches> al deze bestanden bevat:" & vbCrLf & _
" " & XP_Patch & vbCrLf & _
" " & W2k_Patch & vbCrLf & _
" " & W2k3_Patch
wscript.quit
end if
set osvcLocal = getobject("winmgmts:root\cimv2")
'De foutafhandelingscode staat onder de functie die er een kan veroorzaken - voer deze uit.
on error resume next
while not oipFile.atEndOfStream
ip = oipFile.ReadLine()
wscript.echo vbCrLf & "Verbinding maken met " & ip & "..."
Err.Clear
set osvcRemote = GetObject("winmgmts:\\" & ip & "\root\cimv2")
if (Err.Number <> 0) then
wscript.echo "Kan geen verbinding maken met " & ip & "."
else
exeCorrectPatch = detectOSPatch(osvcRemote)
if (exeCorrectPatch <> "") then
' De onderdelen overbrengen naar de externe 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
' Er is een fout ontdekt en de fout was niet 'bestand bestaat al'.
wscript.echo "Kan niet kopiëren naar " & ip & " - fout: " & ret
else
set oprocess = osvcRemote.Get("win32_process")
' De installatie starten zonder tussenkomst van de gebruiker en de computer opnieuw opstarten na voltooiing.
ret = oprocess.create("c:\\Patchinst.exe -q -f")
if (ret <> 0) then
wscript.echo "Kan proces niet starten voor " & ip & ": " & ret
else
' Een referentie naar het gekopieerde bestand verkrijgen.
set odestFile = osvcLocal.get("cim_datafile=""z:\\Patchinst.exe""")
' Wachten tot de installatie is voltooid.
for waitTime = 0 to 120 ' Wacht maximaal twee minuten tot de installatie is voltooid.
wscript.Sleep 1000 ' Eén seconde slaapstand.
' Tijdelijk bestand zo snel mogelijk verwijderen nadat het niet meer nodig is.
if (odestFile.Delete() = 0) then
exit for
end if
next 'Anders een nieuwe lus starten en blijven wachten...
wscript.echo "Installatie geslaagd."
end if 'Aanmaakproces is voltooid.
end if 'Kopiëren is voltooid.
onet.removenetworkdrive "z:", true
end if ' Het script weet welke patch moet worden geïnstalleerd.
end if ' Verdergaan met het volgende IP-adres, en dan het volgende IP-adres...
wend
oipFile.close()
'Opschonen, stationstoewijzing verwijderen (nu controleren, omdat het station mogelijk niet is toegewezen).
if ofs.folderexists("z:\") then
onet.removenetworkdrive "z:", true
end if
wscript.echo vbCrLf & "Patching voltooid. Wordt afgesloten."
function detectOSPatch(osvcRemote)
set oOSInfo = osvcRemote.InstancesOf("Win32_OperatingSystem")
'Er wordt maar één exemplaar geretourneerd (het actieve besturingssysteem), ook als het volgende een foreach-constructie is.
for each objOperatingSystem in oOSInfo
if (objOperatingSystem.OSType <> 18) then
' Controleren of dit een computer met Windows NT is.
wscript.echo ip & " is geen computer met Windows XP, Windows 2000 of Windows 2003 Server."
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
'Dit is een computer met Windows NT, maar zonder geldig Service Pack.
wscript.echo "Kan geen patch uitvoeren voor " & ip & " - niet-verwerkte versie besturingssysteem: " & objOperatingSystem.Caption & " SP" & _
objOperatingSystem.ServicePackMajorVersion & "("& objOperatingSystem.Version & ")"
end if
end if
next
detectOSPatch = systemType
end function