How do I get a list of installed updates and hotfixes?

A list of every update and hotfix that has been installed on my computer, coming from either Microsoft Windows Update or from the knowledge base. I need the ID of each in the form of KBxxxxxx or some similar representation...

Currently I have:

const string query = "SELECT HotFixID FROM Win32_QuickFixEngineering";
var search = new ManagementObjectSearcher(query);
var collection = search.Get();

foreach (ManagementObject quickFix in collection)
    Console.WriteLine(quickFix["HotFixID"].ToString());

But this does not seem to list everything, it only lists QFE's.

I need it to work on Windows XP, Vista and 7.


Solution 1:

After some further search on what I've found earlier. (Yes, the same as VolkerK suggests first)

  1. Under VS2008 CMD in %SystemRoot%\System32\ run a command to get a managed dll:
    tlbimp.exe wuapi.dll /out=WUApiInterop.dll
  2. Add WUApiInterop.dll as a project reference so we see the functions.

Using the following code I can get a list from which I can extract the KB numbers:

var updateSession = new UpdateSession();
var updateSearcher = updateSession.CreateUpdateSearcher();
var count = updateSearcher.GetTotalHistoryCount();
var history = updateSearcher.QueryHistory(0, count);

for (int i = 0; i < count; ++i)
    Console.WriteLine(history[i].Title);

Solution 2:

You can use IUpdateSession3::QueryHistory Method.
The properties of the returned entries are described at http://msdn.microsoft.com/en-us/library/aa386400(VS.85).aspx

Set updateSearch = CreateObject("Microsoft.Update.Session").CreateUpdateSearcher
Set updateHistory = updateSearch.QueryHistory(1, updateSearch.GetTotalHistoryCount)

For Each updateEntry in updateHistory
  Wscript.Echo "Title: " & updateEntry.Title
  Wscript.Echo "application ID: " & updateEntry.ClientApplicationID
  Wscript.Echo " --"
Next

edit: also take a look at http://msdn.microsoft.com/en-us/library/aa387287%28VS.85%29.aspx

Solution 3:

const string querys = "SELECT HotFixID FROM Win32_QuickFixEngineering";
var search = new ManagementObjectSearcher(querys);
var collection = search.Get();

foreach (ManagementObject quickfix in collection)
{
    hotfix = quickfix["HotFixID"].ToString();
}

listBox1.Items.Add(hotfix);

This will populate the listbox with currently installed Hotfixes or Updates

If you want to list all history of updates and hotfixes to show then, the above example of Tom Wijsman as stated will work