Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

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

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

share|improve this answer

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

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

Your Answer


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