Re: windows updates list

From: Torgeir Bakken \(MVP\) (Torgeir.Bakken-spam_at_hydro.com)
Date: 12/16/04


Date: Thu, 16 Dec 2004 21:35:02 +0100

badgolferman wrote:

> What is the best way to get a list of Windows installed updates of a
> computer. I suppose the Add/Remove programs applet lists service packs
> and hotfixes, but is that the complete list? Where can I find a list
> that I can cut and paste into a spread*** format for inventory
> purposes.
Hi

The VBScript below will list updates installed regardless if Windows
Update history exist or not, and if data exists, also the description,
the user that installed it and installation date.

It is easy to change the output format so it saves the data to a CSV
file you can import directly into a spread*** program.

The updates listing is obtained through the WMI class
Win32_QuickFixEngineering.

Put it in a text file and save it as e.g. ListHotfixes.vbs, to run it,
double click on it or start it like this:

wscript.exe "C:\Scripts\ListHotfixes.vbs"

(assuming you have put the script in the folder C:\Scripts\)

The VBScript will give this type of output:

------------------------------------------

Hotfix report date: 2004-10-19 18:01:19

OS version: Microsoft Windows XP Professional
SP version: Service Pack 2
OS language: English

Hotfixes Identified:

HotFixID: Q282784
Description: Windows XP Hotfix (SP1) [See Q282784 for more information]
InstalledBy:
InstallDate: (none found)

HotFixID: Q282784
Description: Windows XP Hotfix (SP1) [See Q282784 for more information]
InstalledBy: a117296
InstallDate: 10/18/2004

...

------------------------------------------

Script start:

'--------------------8<----------------------
'
' Description: Script that outputs some computer information
' and lists all installed hotfixes including installation date
'
' For Windows 2000 SP3/SP4, Windows XP (all versions) and
' Windows 2003 Server (all versions)
'
' Author: Torgeir Bakken
' Date: 2004-10-19
'
' Revisions
' 2004-12-09: Added support for the new IE update structure in registry
'

Const OpenAsASCII = 0
Const OverwriteIfExist = -1

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

sFile = oFSO.GetSpecialFolder(2).ShortPath & "\updates.txt"
Set fFile = oFSO.CreateTextFile(sFile, OverwriteIfExist, OpenAsASCII)

fFile.WriteLine
fFile.WriteLine "Hotfix report date: " & Now & vbCrLf

strComputer = "." ' use "." for local computer

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

'--------------------8<----------------------

-- 
torgeir, Microsoft MVP Scripting and WMI, Porsgrunn Norway
Administration scripting examples and an ONLINE version of
the 1328 page Scripting Guide:
http://www.microsoft.com/technet/scriptcenter/default.mspx