Windows: How to List All of the Windows and Software Updates Applied to a Computer
This is a really quick answer that hope many people will expand upon with all sorts of methods in the future.
There are several sources of information about installed software updates. All of them store slightly different data.
Windows Management Instrumentation (WMI)
The following options rely on Win32_QuickFixEngineering Class from [[Windows Management Instrumentation (WMI)]]. This means that they can be reliably used only to retrieve updates for Windows OS itself and its components (such as [[Windows Internet Explorer (IE)]] or Windows Server roles and features). This will not list updates for any non-inbox software (such as Microsoft Office or Exchange Server).
WMIC
- Open a command prompt. To do so, click Start, type cmd, and press ENTER.
- Type cd %userprofile% and press ENTER.
- Type wmic qfe list full /format:htable > hotfixes.htm
- Type start iexplore %userprofile%\hotfixes.htm
PowerShell
- Open a PowerShell prompt. To do so, click Start, type PowerShell, and press ENTER.
- Type Get-WmiObject -Class "win32_quickfixengineering" and press ENTER.
The following example provides the same kind of information in a slightly more friendly format. This includes local time conversion and displaying only specific fields.
001
002 003 |
Get-WmiObject -Class "win32_quickfixengineering" |
Select-Object -Property "Description", "HotfixID", @{Name="InstalledOn"; Expression={([DateTime]($_.InstalledOn)).ToLocalTime()}} |
Microsoft Update Client Install History
This option will list all kind of updates (both Windows and app) but only those installed using Windows Update, Microsoft Update or Automatic Updates feature. This includes updates installed using enterprise management systems like [[WSUS]] or [[ConfigMgr]] but excludes any updates installed manually or using custom management scripts.
001
002 003 004 005 006 007 |
$Session = New-Object -ComObject "Microsoft.Update.Session"
$Searcher = $Session.CreateUpdateSearcher() $historyCount = $Searcher.GetTotalHistoryCount() $Searcher.QueryHistory(0, $historyCount) | Select-Object Title, Description, Date, @{name="Operation"; expression={switch($_.operation){ 1 {"Installation"}; 2 {"Uninstallation"}; 3 {"Other"} }}} |
Windows Installer Database
If the software installation methods follow deployment best practices and utilize [[Windows Installer (MSI)]] subsystem, then installed updates for such software can be retrieved by querying Windows Installer database. This can be done by calling Windows Installer COM interfaces directly or using Get-MSIPatchInfo cmdlet from the unofficial Windows Installer PowerShell module. This will not include updates for Windows OS components.