1

I am looking for a method or tool I can install (on the machines) to remotely check what versions of different programs are installed. I need to check this for about 60 windows machines.

Does somebody know a (opensource) solution for this.

3 Answers 3

2

You can use WMI queries to get a list of installed software if it used MSI to install itself. Something like this:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colSoftware = objWMIService.ExecQuery _
    ("Select * from Win32_Product")

For Each objSoftware in colSoftware
    Wscript.Echo "Name: " & objSoftware.Name
    Wscript.Echo "Version: " & objSoftware.Version
Next

That's just a basic example. WMI can do a lot of great stuff for system management on the fly.

0

We use PowerShell scripts and WMI queries to collect information from Windows machines and store the info in a database. Later we might query this data to see what Java version is installed on each machine.

I had better results keeping track of installed software by looking through the registry in the path HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. This usually gives me a Display Name, Display Version, Install Date, Publisher, and other version info. A row from the database for Java might look something like this:

MACHINE_NAME, {26A24AE4-039D-4CA4-87B4-2F83216021FF}, Java(TM) 6 Update 21, 6.0.210, 20100721, Oracle, 06.00.0210, 6, 0, 0, 1, 2010-11-01, 07:40:22.830

You can search and find sample code in VBS or PS that uses WMI, the registry, or PSInfo to get installed software from remote computers. Part of the way we use the registry method is like this:

$HKLM = [uint32]"0x80000002"
$softwareListKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
$regObject = [WmiClass]"\\$machineName\ROOT\DEFAULT:StdRegProv"  
$softwareKeys = $regObject.EnumKey($HKLM, $softwareListKeyPath) 
foreach ($softwareKeyName in $softwareKeys.sNames) {
    #// some are GUIDs, some are software names, ones with GUID will have DisplayName
    $softwareKeyPath = $softwareListKeyPath + $softwareKeyName

    $keyNameAndData = $regObject.GetStringValue($HKLM, $softwareKeyPath, "DisplayName")
    $displayName = $keyNameAndData.sValue

    $isWindowsUpdate = $false
    $rx = "(KB|M)\d{6}"
    if(($softwareKeyName -match $rx) -or ($displayName -match $rx)) {
        $isWindowsUpdate = $true
    }

    $keyNameAndData = $regObject.GetStringValue($HKLM, $softwareKeyPath, "DisplayVersion")
    $displayVersion = $keyNameAndData.sValue

    $keyNameAndData = $regObject.GetStringValue($HKLM, $softwareKeyPath, "InstallDate")
    $installDate = $keyNameAndData.sValue

    $keyNameAndData = $regObject.GetStringValue($HKLM, $softwareKeyPath, "Publisher")
    $publisher = $keyNameAndData.sValue

    ...............
0

Use the built-in wmic.exe command

wmic /node:[hostname or ip address] product > product_list.txt

notepad product_list.txt

You must log in to answer this question.