Windows : List Installed Updates

Windows : List Installed Updates

The following vbScript will list all installed updates on a host, the script can also be run against another system  by changing the “.” to “computername“. I used this to help with a recent audit of our systems and found itsaved a lot of time!

Const OpenAsASCII      =  0
Const OverwriteIfExist = -1

Set oShell = CreateObject(“WScript.Shell”)
Set oFSO = CreateObject(“Scripting.FileSystemObject”)

strComputer = “.”

sFile = “C:\” & strComputer & “_updates.txt”
Set fFile = oFSO.CreateTextFile(sFile, OverwriteIfExist, OpenAsASCII)

fFile.WriteLine
fFile.WriteLine “Hotfix report date: ” & Now & vbCrLf

Const HKLM = &H80000002

‘On Error Resume Next
Set objWMIService = GetObject(“winmgmts:” _
     & “{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)

Set colSettings = objWMIService.ExecQuery _
      (“Select * from Win32_OperatingSystem”)

‘ get general info about the OS

‘ Caption value for different OS:
‘ Microsoft Windows 2000 …
‘ Microsoft Windows XP …
‘ Microsoft(R) Windows(R) Server 2003, ….. Edition
For Each objOperatingSystem in colSettings
   strOSCaption = objOperatingSystem.Caption
   Select Case True
     Case InStr(1, strOSCaption, “windows 2000”, vbTextCompare) > 0
       strOS = “Windows 2000”
     Case InStr(1, strOSCaption, “windows xp”, vbTextCompare) > 0
       strOS = “Windows XP”
     Case InStr(1, strOSCaption, “windows(r) server 2003”, vbTextCompare) > 0
       strOS = “Windows Server 2003”
   End Select

   intOSLang = objOperatingSystem.OSLanguage
   strOSLangHex = Right(“000” & Hex(intOSLang), 4)
   strOSServicePack = objOperatingSystem.CSDVersion
Next

Set objReg = GetObject(“WinMgmts:{impersonationLevel=impersonate}!//” _
         & strComputer & “/root/default:StdRegProv”)

strOSLanguage = “Unknown”  ‘ Init value
strKeyPath = “SOFTWARE\Classes\MIME\Database\Rfc1766”
strValueName = strOSLangHex
objReg.GetStringValue HKLM, strKeyPath, strValueName, strOSLanguage

‘ remove unnecessary stuff
arrOSLanguage = Split(strOSLanguage, “;”)
strOSLanguage = arrOSLanguage(UBound(arrOSLanguage))
If Instr(strOSLanguage, “(“) > 0 Then
   arrOSLanguage = Split(strOSLanguage, “(“)
   strOSLanguage = Trim(arrOSLanguage(0))
End If

fFile.WriteLine “OS version: ” & strOSCaption
fFile.WriteLine “SP version: ” & strOSServicePack
fFile.WriteLine “OS language: ” & strOSLanguage

‘ start enumeration of hotfixes

fFile.WriteLine vbCrLf & “Hotfixes Identified:” & vbCrLf

strRegBaseUpdOS = “SOFTWARE\Microsoft\Updates\” & strOS
strRegBaseUpdIE = “SOFTWARE\Microsoft\Updates\Internet Explorer 6\SP1\”

Set colItems = objWMIService.ExecQuery _
     (“Select * from Win32_QuickFixEngineering”,,48)

For Each objItem in colItems
   If objItem.HotFixID “File 1” Then
     fFile.WriteLine “HotFixID: ” & objItem.HotFixID
     fFile.WriteLine “Description: ” & objItem.Description
     fFile.WriteLine “InstalledBy: ” & objItem.InstalledBy
     strInstallDate = Null  ‘ init value

     If InStr(1, objItem.HotFixID, “-IE6SP1-“, vbTextCompare) > 0 Then
       strRegKey = strRegBaseUpdIE & objItem.HotFixID
       objReg.GetStringValue HKLM, strRegKey, _
              “InstalledDate”, strInstallDate
     ElseIf objItem.ServicePackInEffect “” Then
       strRegKey = strRegBaseUpdOS & “\” & objItem.ServicePackInEffect _
             & “\” & objItem.HotFixID
       objReg.GetStringValue HKLM, strRegKey, _
              “InstalledDate”, strInstallDate
     End If

     If IsNull(strInstallDate) Then
       strInstallDate = “(none found)”
     End If
     fFile.WriteLine “InstallDate: ” & strInstallDate
     fFile.WriteLine   ‘ blank line
   End If
Next

fFile.Close
oShell.Run sFile