Recently I needed to take a survey of one of my clients sites to determine which service pack versions were running on the machines. As opposed to going to each pc or running some bulky software, I came across a script which will read hostnames off a text file and output the XP Service Pack versions of the machines on the network. This is a quick way to find your service pack versions of your network XP machines
To use this script you will need a list of hostnames you want to query. For this I run a simple net view and copy the hostnames from the command prompt window WITHOUT the \\. Paste the hostnames into notepad and lable it hosts.txt. Next, copy the following into notepad ----------COPY EVERYTHING BELOW THIS LINE---------- 'List the operating system and service pack of all computers in a text file. On Error Resume Next
'Initialize constants and variables. Const FOR_READING = 1 Const FOR_APPENDING = 8 strInputFile = "hosts.txt" strOutputFile = "xpsp.txt" g_strSP2 = "" g_strSP1 = "" g_strSP0 = "" g_intSP2 = 0 g_intSP1 = 0 g_intSP0 = 0 g_intNotXP = 0 g_intErr = 0
'Get list of computers from text file. arrComputers = ReadTextFile(strInputFile) For Each strComputer In arrComputers intGetSP = GetSP(strComputer) If 1 = intGetSP Then g_intErr = g_intErr + 1 End If Next
WriteTextFile(strOutputFile)
WScript.Echo "Data written to " & strOutputFile
'******************************************************************************
'Read text file line by line and return array of lines. Function ReadTextFile(strFileName)
On Error Resume Next
Dim arrLines()
Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strFilename) Then Set objTextStream = objFSO.OpenTextFile(strFilename, FOR_READING) Else WScript.Echo "Input text file " & strFilename & " not found." WScript.Quit End If Do Until objTextStream.AtEndOfStream intLineNo = objTextStream.Line ReDim Preserve arrLines(intLineNo - 1) arrLines(intLineNo - 1) = objTextStream.ReadLine Loop objTextStream.Close ReadTextFile = arrLines
End Function
'******************************************************************************
'Get list and count of computers by OS and SP. Function GetSP(strComp)
On Error Resume Next
'Connect to WMI on remote computer. Set objWMIService = GetObject("winmgmts:\\" & strComp) If Err <> 0 Then WScript.Echo " Unable to connect to WMI." WScript.Echo " Error Number:" & Err.Number WScript.Echo " Source:" & Err.Source WScript.Echo " Description:" & Err.Description GetSP = 1 Exit Function End If Set colOSes = objWMIService.ExecQuery _ ("SELECT * FROM Win32_OperatingSystem") For Each objOS in colOSes If objOS.Version = "5.1.2600" Then If objOS.ServicePackMajorVersion = "2" Then g_strSP2 = g_strSP2 & strComp & vbCrLf g_intSP2 = g_intSP2 + 1 ElseIf objOS.ServicePackMajorVersion = "1" Then g_strSP1 = g_strSP1 & strComp & vbCrLf g_intSP1 = g_intSP1 + 1 Else g_strSP0 = g_strSP0 & strComp & vbCrLf g_intSP0 = g_intSP0 + 1 End If GetSP = 0 Else g_intNotXP = g_intNotXP + 1 End If Next GetSP = 0
End Function
'******************************************************************************
'Write or append data to text file. Sub WriteTextFile(strFileName)
On Error Resume Next
'Open text file for output. Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strFileName) Then Set objTextStream = objFSO.OpenTextFile(strFileName, FOR_APPENDING) Else Set objTextStream = objFSO.CreateTextFile(strFileName) End If
'Write data to file. objTextStream.WriteLine "Inventory of Windows XP Service Packs" objTextStream.WriteLine "Taken " & Now objTextStream.WriteLine vbCrLf & "Computers Running Windows XP" objTextStream.WriteLine "============================" objTextStream.WriteLine "Total number: " & (g_intSP2 + g_intSP1 + g_intSP0)
objTextStream.WriteLine vbCrLf & "Service Pack 2" objTextStream.WriteLine "--------------" objTextStream.WriteLine g_strSP2 objTextStream.WriteLine "Total number: " & g_intSP2
objTextStream.WriteLine vbCrLf & "Service Pack 1" objTextStream.WriteLine "--------------" objTextStream.WriteLine g_strSP1 objTextStream.WriteLine "Total number: " & g_intSP1
objTextStream.WriteLine vbCrLf & "No Service Pack" objTextStream.WriteLine "---------------" objTextStream.WriteLine g_strSP0 objTextStream.WriteLine "Total number: " & g_intSP0
objTextStream.WriteLine vbCrLf & "Computers Not Running Windows XP" objTextStream.WriteLine "================================" objTextStream.WriteLine "Total number: " & g_intNotXP
objTextStream.WriteLine vbCrLf & "Could Not Connect To Computer" objTextStream.WriteLine "=============================" objTextStream.WriteLine "Total number: " & g_intErr objTextStream.WriteLine
objTextStream.Close
End Sub
----------COPY EVERYTHING ABOVE THIS LINE---------- Save your file as XP_Versions.vbs Ensure that both hosts.txt and XP_Versions.vbs are in the same directory and simply run the XP_Versions.vbs. Your output will be in the same folder as the other 2 files and will be called xpsp.txt. The output will read similar to this: ------------------------------------------------- Inventory of Windows XP Service Packs Taken 2/4/2006 12:17:09 AM
Computers Running Windows XP ============================ Total number: 2
Service Pack 2 -------------- WKS64 WKS37
Total number: 2
Service Pack 1 --------------
Total number: 0
No Service Pack ---------------
Total number: 0
Computers Not Running Windows XP ================================ Total number: 1
Could Not Connect To Computer ============================= Total number: 0 ------------------------------------------------- As you can see this script does not identify what the other machines are running and what machines are running other operating systems, it just identifies which XP computers need a service pack upgrage. This information is provided "AS IS" with no warranties expressed or implied.
|