Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

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.

share|improve this question
add comment

3 Answers

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.

share|improve this answer
add comment

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

    ...............
share|improve this answer
add comment

Use the built-in wmic.exe command

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

notepad product_list.txt
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.