How do I find all the Windows Installer packages installed on my machine?

Question

How do I find all the Windows Installer packages installed on my machine?

Answer

Here’s the APIs and the Properties one would need

MsiEnumProducts(DWORD,LPTSTR) function [Windows Installer]
MsiEnumProductsEx (8 Parameters) function [Windows Installer]

[ProductCode Property

](https://msdn.microsoft.com/library/en-us/vsintro7/html/vxgrfproductcodeproperty.asp)MsiGetProductInfoEx (6 Parameters) function [Windows Installer]
MsiGetProductInfo(LPCTSTR,LPCTSTR,LPTSTR,DWORD) function [Windows Installer]

UpgradeCode property [Windows Installer]

If one were interested in finding the installation location, use

MsiSourceListGetInfo (7 Parameters) function [Windows Installer]
MsiSourceListEnumSources (7 Parameters) function [Windows Installer]
MsiSourceListEnumMediaDisks (10 Parameters) function [Windows Installer]

What would be really cool is to migrate the feature states as well with

MsiQueryFeatureState(LPCTSTR,LPCTSTR) function [Windows Installer]
MsiQueryFeatureStateEx (5 Parameters) function [Windows Installer]

To populate the preselected properties

ADDSOURCE property [Windows Installer]
ADVERTISE property [Windows Installer]
ADDLOCAL property [Windows Installer]

 

[Author: Robert Flaming]

This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at https://www.microsoft.com/info/cpyright.htm.

Comments

  • Anonymous
    September 18, 2005
    I wrote the following VMscript to show all things installed via the installer and product codes and upgrade codes...

    'set computer name - replace variable with appropriate value
    Computer = "."

    Set objWMIService = GetObject("winmgmts:" & Computer & "rootCIMV2")
    'obtain collection of Windows Installer packages
    Set MSIapps = GetObject("winmgmts:{impersonationLevel=impersonate}!" & Computer &_
    "rootcimv2").ExecQuery("select * from Win32_Product")

    'obtain number of program in collection
    AppList = AppList & MSIapps.Count & " MSI packages installed:" & VBCRLF & "------" & VBCRLF

    'enumerate the names of the packages in the collection
    For each App in MSIapps

    Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Property" _
    & " WHERE ProductCode = '" _
    & App.IdentifyingNumber _
    & "' AND Property = 'UpgradeCode'" )

    For each objItem in Colitems
    upgcode = objItem.Value
    exit For
    Next

    AppList = AppList & App.Name _
    & App.IdentifyingNumber & upgcode & VBCRLF
    Next

    'display list of packages
    Wscript.Echo AppList
  • Anonymous
    September 18, 2005
    Thanks Paul. Good Stuff. An example of how there's more than one way to skin the cat with Windows Installer ;^)

    [Author: Robert Flaming]
    This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm.