Monday, 5 March 2007

Listing installed applications on Vista 64-bit with WMI

There's a few sample scripts around to list the installed applications using WMI. The trap on 64-bit platforms is that the 32-bit and 64-bit installation information is stored in different places in the registry, and you need to be clever about telling WMI that you want the 32-bit data instead of the 64-bit.

Here's some VBScript that will list first the 32-bit and then 64-bit installed applications:

strComputer = "."
Const HKLM = &h80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
objCtx.Add "__RequiredArchitecture", TRUE
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")

WScript.Echo "32-bit Applications"
WScript.echo "-------------------"

Call GetApplications

objCtx.Add "__ProviderArchitecture", 64
objCtx.Add "__RequiredArchitecture", TRUE
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")

WScript.Echo "64-bit Applications"
WScript.echo "-------------------"

Call GetApplications

Sub GetApplications

' Use ExecMethod to call the GetStringValue method
Set Inparams = objStdRegProv.Methods_("EnumKey").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Windows\CurrentVersion\Uninstall\"

set Outparams = objStdRegProv.ExecMethod_("EnumKey", Inparams,,objCtx)

For Each strSubKey In Outparams.snames

Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Windows\CurrentVersion\Uninstall\" & strSubKey
Inparams.Svaluename = "DisplayName"
set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)

if ("" & Outparams.sValue) = "" then
'wscript.echo strSubKey
Else
wscript.echo Outparams.SValue
End iF

'Inparams.Svaluename = "QuietDisplayName"
'set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)
'wscript.echo Outparams.SValue

Next

End Sub

3 comments:

Anonymous said...

So what would happen if I ran this on a 32 bits OS? I've tried but it list the 32 bits hive twice...shouldn't it list the 32 bits apps then leave the 64 bits section blank?

Anonymous said...

Finally a script that actually works! Thank you!
How about refining the output sorting them by name?

Gabriel Cunningham said...

Please check out this enhancement.
Allows for:
Local or Remote
Workstation or Server

Windows Only

http://page2pagepro.com/tutorials/vbs/InstalledPrograms.vbs.html