This uses Microsoft.Win32.RegistryKey to check the SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall registry key on remote computers.

https://github.com/gangstanthony/PowerShell/blob/master/Get-InstalledApps.ps1

*edit: pasting code for reference

function Get-InstalledApps {
    param (
        [Parameter(ValueFromPipeline=$true)]
        [string[]]$ComputerName = $env:COMPUTERNAME,
        [string]$NameRegex = ''
    )
    
    foreach ($comp in $ComputerName) {
        $keys = '','\Wow6432Node'
        foreach (keys) {
            try {
                $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $comp)
                $apps = $reg.OpenSubKey("SOFTWARE$key\Microsoft\Windows\CurrentVersion\Uninstall").GetSubKeyNames()
            } catch {
                continue
            }

            foreach (apps) {
                $program = $reg.OpenSubKey("SOFTWARE$key\Microsoft\Windows\CurrentVersion\Uninstall\$app")
                $name = $program.GetValue('DisplayName')
                if ($name -and $name -match $NameRegex) {
                    [pscustomobject]@{
                        ComputerName = $comp
                        DisplayName = $name
                        DisplayVersion = $program.GetValue('DisplayVersion')
                        Publisher = $program.GetValue('Publisher')
                        InstallDate = $program.GetValue('InstallDate')
                        UninstallString = $program.GetValue('UninstallString')
                        Bits = key -eq '\Wow6432Node') {'64'} else {'32'})
                        Path = $program.name
                    }
                }
            }
        }
    }
}
Answer from Anthony Stringer on Stack Overflow
🌐
Action1
action1.com › home › blog › how to use wmic to install software remotely
How to Use WMIC Remotely to Install Software on Windows
September 19, 2025 - You can use wbemtest.exe as a GUI utility for working with WMI. To work with WMI from the console created wmic.exe. We will use WMIC remotely with domain administrator credentials to scan the list of nodes (PCs / laptops) and install software ...
🌐
Spiceworks
community.spiceworks.com › software & applications
Using WMIC to Retrieve a List of All Installed Programs - Software & Applications - Spiceworks Community
March 6, 2015 - “The Windows Management Instrumentation Command-line (WMIC) is a command-line and scripting interface that simplifies the use of Windows Management Instrumentation (WMI) and systems managed through WMI.” This explains how to use WMIC to pull a list of all installed programs on a computer, ...
Discussions

Software List - Inventory -WMIC Product
Hi, I am trying to generate a list of the installed software using WMIC Product, but it seems like I am getting one a few items listed with command. See below screenshot for the installed product (available in Control Panel) and the WMIC Product… More on learn.microsoft.com
🌐 learn.microsoft.com
3
0
February 1, 2021
Search WMIC for installed software - AutoIt General Help and Support - AutoIt Forums
Hi, I am trying to query WMIC on a remote computer to see if a particular program is installed (Microsoft .Net 4.6.1). There are plenty of ways to go about this but I think WMI would be the most reliable way. I'm having issues with the syntax. This works from a command prompt: wmic /node:COMPUTER... More on autoitscript.com
🌐 autoitscript.com
December 4, 2017
How to get a list of software installed on remote computers
Hi, I am trying to get a list of software installed on remote computers in the office. I have been recommended to use the following code:Get-CimInstance Win32_Product -ComputerName $Computer but this just gives me back the software on my own computer.… More on learn.microsoft.com
🌐 learn.microsoft.com
1
0
windows - WMI: Get the list of Installed Softwares - Stack Overflow
I need to get the list of installed softwares on remote Windows hosts using wmi calls. I have tried using Win32_Product and Win32Reg_AddRemovePrograms Classes. Advantage of using Win32_Product is ... More on stackoverflow.com
🌐 stackoverflow.com
Top answer
1 of 3
3

This uses Microsoft.Win32.RegistryKey to check the SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall registry key on remote computers.

https://github.com/gangstanthony/PowerShell/blob/master/Get-InstalledApps.ps1

*edit: pasting code for reference

function Get-InstalledApps {
    param (
        [Parameter(ValueFromPipeline=$true)]
        [string[]]$ComputerName = $env:COMPUTERNAME,
        [string]$NameRegex = ''
    )
    
    foreach ($comp in $ComputerName) {
        $keys = '','\Wow6432Node'
        foreach (keys) {
            try {
                $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $comp)
                $apps = $reg.OpenSubKey("SOFTWARE$key\Microsoft\Windows\CurrentVersion\Uninstall").GetSubKeyNames()
            } catch {
                continue
            }

            foreach (apps) {
                $program = $reg.OpenSubKey("SOFTWARE$key\Microsoft\Windows\CurrentVersion\Uninstall\$app")
                $name = $program.GetValue('DisplayName')
                if ($name -and $name -match $NameRegex) {
                    [pscustomobject]@{
                        ComputerName = $comp
                        DisplayName = $name
                        DisplayVersion = $program.GetValue('DisplayVersion')
                        Publisher = $program.GetValue('Publisher')
                        InstallDate = $program.GetValue('InstallDate')
                        UninstallString = $program.GetValue('UninstallString')
                        Bits = key -eq '\Wow6432Node') {'64'} else {'32'})
                        Path = $program.name
                    }
                }
            }
        }
    }
}
2 of 3
1

There are multiple ways how to get the list of installed software on a remote computer:

  1. Running WMI query on ROOT\CIMV2 namespace:

    • Start WMI Explorer or any other tool which can run WMI queries.
    • Run WMI query "SELECT * FROM Win32_Product"
  2. Using wmic command-line interface:

    • Press WIN+R
    • Type "wmic", press Enter
    • In wmic command prompt type "/node:RemoteComputerName product"
  3. Using Powershell script:

    • Thru WMI object: Get-WmiObject -Class Win32_Product -Computer RemoteComputerName
    • thru Registry: Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize
    • thru Get-RemoteProgram cmdlet: Get-RemoteProgram -ComputerName RemoteComputerName

Source: https://www.action1.com/kb/list_of_installed_software_on_remote_computer.html

🌐
Software-inventory
software-inventory.net › installed-software-audit
How to Audit Installed Software from the Command Line - Tips & Tricks
wmic product get name,version /format:csv > software-inventory.csv · The commands above extracted installed applications list from the PC where they were executed. Is it possible to perform installed applications audit remotely?
Top answer
1 of 3
1

My output is empty / blank, see belwo.

The example is missing the trailing slash after Uninstall. I get different software lists when I look at the 32/64 bit entries.

Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | sort-object -property DisplayName | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | sort-object -property DisplayName | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize

For a combined view, run this.

function Analyze( f) {
    Get-ItemProperty $p |foreach {
       if (($_.DisplayName) -or ($_.version)) {
            [PSCustomObject]@{ 
                    From = $f;
                    Name = $_.DisplayName;
                    Version = $_.DisplayVersion;
                    Install = $_.InstallDate 
             }
       } 
    }
}

s += Analyze 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' 64
$s += Analyze 'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' 32
$s | Sort-Object -Property Name 

Instead of WMIC, try Get-CimInstance

Get-CimInstance Win32_Product | Sort-Object -property Name | Format-Table -Property Version, InstallDate, Name

One behavior I have noticed is that referencing Win32_Product generates an event for each product in the application event log. Check your log. You might be getting an error that is stopping the analysis.

Log Name: Application
Source: MsiInstaller
Date: 2/2/2021 10:06:39 AM
Event ID: 1035
Task Category: None
Level: Information
Keywords: Classic
User: SYSTEM
Computer: slick
Description:
Windows Installer reconfigured the product. Product Name: Microsoft SQL Server 2014 Management Objects. Product Version: 12.0.2000.8. Product Language: 1033. Manufacturer: Microsoft Corporation. Reconfiguration success or error status: 0.

2 of 3
0

Hi,

My output is empty / blank, see belwo.

Top answer
1 of 1
11

os get vendor - there is no such thing as an OS vendor, that's where the invalid query is coming from. See the available properties - there's a Version, but no Vendor:

C:\>wmic os get /?

Property get operations.
USAGE:

GET [<property list>] [<get switches>]
NOTE: <property list> ::= <property name> | <property name>,  <property list>

The following properties are available:
Property                                Type                    Operation
========                                ====                    =========
BootDevice                              N/A                     N/A
BuildNumber                             N/A                     N/A
BuildType                               N/A                     N/A
CSDVersion                              N/A                     N/A
CSName                                  N/A                     N/A
CodeSet                                 N/A                     N/A
CountryCode                             N/A                     N/A
CurrentTimeZone                         N/A                     N/A
Debug                                   N/A                     N/A
Description                             N/A                     N/A
Distributed                             N/A                     N/A
EncryptionLevel                         N/A                     N/A
ForegroundApplicationBoost              N/A                     N/A
FreePhysicalMemory                      N/A                     N/A
FreeSpaceInPagingFiles                  N/A                     N/A
FreeVirtualMemory                       N/A                     N/A
InstallDate                             N/A                     N/A
LastBootUpTime                          N/A                     N/A
LocalDateTime                           N/A                     N/A
Locale                                  N/A                     N/A
Manufacturer                            N/A                     N/A
MaxNumberOfProcesses                    N/A                     N/A
MaxProcessMemorySize                    N/A                     N/A
Name                                    N/A                     N/A
NumberOfLicensedUsers                   N/A                     N/A
NumberOfProcesses                       N/A                     N/A
NumberOfUsers                           N/A                     N/A
OSLanguage                              N/A                     N/A
OSProductSuite                          N/A                     N/A
OSType                                  N/A                     N/A
Organization                            N/A                     N/A
OtherTypeDescription                    N/A                     N/A
PlusProductID                           N/A                     N/A
PlusVersionNumber                       N/A                     N/A
Primary                                 N/A                     N/A
QuantumLength                           N/A                     N/A
QuantumType                             N/A                     N/A
RegisteredUser                          N/A                     N/A
SerialNumber                            N/A                     N/A
ServicePackMajorVersion                 N/A                     N/A
ServicePackMinorVersion                 N/A                     N/A
SizeStoredInPagingFiles                 N/A                     N/A
Status                                  N/A                     N/A
SystemDevice                            N/A                     N/A
SystemDirectory                         N/A                     N/A
SystemDrive                             N/A                     N/A
TotalSwapSpaceSize                      N/A                     N/A
TotalVirtualMemorySize                  N/A                     N/A
TotalVisibleMemorySize                  N/A                     N/A
Version                                 N/A                     N/A
WindowsDirectory                        N/A                     N/A

And there is no /DOMAIN option in wmic either.

C:\>wmic /?

[global switches] <command>

The following global switches are available:
/NAMESPACE           Path for the namespace the alias operate against.
/ROLE                Path for the role containing the alias definitions.
/NODE                Servers the alias will operate against.
/IMPLEVEL            Client impersonation level.
/AUTHLEVEL           Client authentication level.
/LOCALE              Language id the client should use.
/PRIVILEGES          Enable or disable all privileges.
/TRACE               Outputs debugging information to stderr.
/RECORD              Logs all input commands and output.
/INTERACTIVE         Sets or resets the interactive mode.
/FAILFAST            Sets or resets the FailFast mode.
/USER                User to be used during the session.
/PASSWORD            Password to be used for session login.
/OUTPUT              Specifies the mode for output redirection.
/APPEND              Specifies the mode for output redirection.
/AGGREGATE           Sets or resets aggregate mode.
/AUTHORITY           Specifies the <authority type> for the connection.
/?[:<BRIEF|FULL>]    Usage information.

You could try:

wmic /NODE:"servername" /USER:"yourdomain\administrator" OS GET Name

It will prompt for your password.

Find elsewhere
🌐
AutoIt
autoitscript.com › autoit v3 › autoit help and support › autoit general help and support
Search WMIC for installed software - AutoIt General Help and Support - AutoIt Forums
December 4, 2017 - Hi, I am trying to query WMIC on ... reliable way. I'm having issues with the syntax. This works from a command prompt: wmic /node:COMPUTER......
🌐
Microsoft Learn
learn.microsoft.com › en-us › answers › questions › 1164852 › how-to-get-a-list-of-software-installed-on-remote
How to get a list of software installed on remote computers - Microsoft Q&A
That code should get the information from the machine name in the $Computer variable, not your local machine. ... Using that WMI class is very slow because it verifies that the software is properly installed. Plus, it doesn't find software that was installed using some other installer than Microsoft's stuff. You'd probably do well to use Invoke-Command to run the code on the remote computers rather than running WMI on them.
Top answer
1 of 3
17

You can use wmic.

Example:

wmic product get name,version /format:csv

wmic /node:localhost /output:d:\programlist.htm product
get name,version /format:htable.xsl

wmic product get name,version

wmic softwareelement get name,version

wmic softwarefeature get name,version

wmic wmic:root\cli>/output:c:\ProgramList.txt product get name,version

Or you can do it like the "Add/Remove Programs", reading all uninstall registry keys:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

On 64 bit Windows, remember to also check:

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\

To returns a list of all software installed on a computer, whether or not by Windows-Installer:

Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE 
strComputer = "." 
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" 
strEntry1a = "DisplayName" 
strEntry1b = "QuietDisplayName" 
strEntry2 = "InstallDate" 
strEntry3 = "VersionMajor" 
strEntry4 = "VersionMinor" 
strEntry5 = "EstimatedSize" 

Set objReg = GetObject("winmgmts://" & strComputer & _ 
 "/root/default:StdRegProv") 
objReg.EnumKey HKLM, strKey, arrSubkeys 
WScript.Echo "Installed Applications" & VbCrLf 
For Each strSubkey In arrSubkeys 
  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, _ 
   strEntry1a, strValue1) 
  If intRet1 <> 0 Then 
    objReg.GetStringValue HKLM, strKey & strSubkey, _ 
     strEntry1b, strValue1 
  End If 
  If strValue1 <> "" Then 
    WScript.Echo VbCrLf & "Display Name: " & strValue1 
  End If 
  objReg.GetStringValue HKLM, strKey & strSubkey, _ 
   strEntry2, strValue2 
  If strValue2 <> "" Then 
    WScript.Echo "Install Date: " & strValue2 
  End If 
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _ 
   strEntry3, intValue3 
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _ 
   strEntry4, intValue4 
  If intValue3 <> "" Then 
     WScript.Echo "Version: " & intValue3 & "." & intValue4 
  End If 
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _ 
   strEntry5, intValue5 
  If intValue5 <> "" Then 
    WScript.Echo "Estimated Size: " & Round(intValue5/1024, 3) & " megabytes" 
  End If 
Next 
2 of 3
1

The encoded version in c# that is based on the readings in the system registry windows.

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;


namespace SoftwareInventory
{
    class Program
    {
        static void Main(string[] args)
        {
            //!!!!! Must be launched with a domain administrator user!!!!!
            Console.ForegroundColor = ConsoleColor.Green;
            StringBuilder sbOutFile = new StringBuilder();
            Console.WriteLine("DisplayName;IdentifyingNumber");
            sbOutFile.AppendLine("Machine;DisplayName;Version");

            //Retrieve machine name from the file :File_In/collectionMachines.txt
            //string[] lines = new string[] { "NameMachine" };
            string[] lines = File.ReadAllLines(@"File_In/collectionMachines.txt");
            foreach (var machine in lines)
            {
                //Retrieve the list of installed programs for each extrapolated machine name
                var registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
                using (Microsoft.Win32.RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, machine).OpenSubKey(registry_key))
                {
                    foreach (string subkey_name in key.GetSubKeyNames())
                    {
                        using (RegistryKey subkey = key.OpenSubKey(subkey_name))
                        {
                            //Console.WriteLine(subkey.GetValue("DisplayName"));
                            //Console.WriteLine(subkey.GetValue("IdentifyingNumber"));
                            if (subkey.GetValue("DisplayName") != null)
                            {
                                Console.WriteLine(string.Format("{0};{1};{2}", machine, subkey.GetValue("DisplayName"), subkey.GetValue("Version")));
                                sbOutFile.AppendLine(string.Format("{0};{1};{2}", machine, subkey.GetValue("DisplayName"), subkey.GetValue("Version")));
                            }
                        }
                    }
                }
            }
            //CSV file creation
            var fileOutName = string.Format(@"File_Out\{0}_{1}.csv", "Software_Inventory", DateTime.Now.ToString("yyyy_MM_dd_HH_mmssfff"));
            using (var file = new System.IO.StreamWriter(fileOutName))
            {

                file.WriteLine(sbOutFile.ToString());
            }
            //Press enter to continue 
            Console.WriteLine("Press enter to continue !");
            Console.ReadLine();
        }


    }
}
🌐
TheITBros
theitbros.com › windows › miscellaneous › windows 10 › how to get list of installed programs in windows 10/11? – theitbros
5 Ways to Get a List of All Installed Programs in Windows (Full Guide)
January 10, 2026 - To do so, use the /node:computer switch, where the computer is the remote hostname. ... To an HTML document: wmic /output:c:\temp\InstalledApps.htm product get Name,Version,Vendor /format:htable
🌐
Action1
action1.com › home › blog › how to script to list installed software on multiple computers
Script to List Installed Software on Multiple Computers
December 5, 2024 - ... – Launch WMI Explorer or any other tool which can run WMI queries. – Run WMI query: SELECT * FROM Win32_Product ... – Press WIN+R – Type “wmic”, press Enter – In wmic command line tool type: /node:RemoteComputerName product ...
🌐
Blogger
austecjenni.blogspot.com › 2015 › 10 › find-product-guid-w-wmic-or-powershell.html
Adventures in IT: Find Product GUID w/ WMIC or Powershell, & Other Useful Commands
October 7, 2015 - Output to Text file named InstalledPrograms on C: wmic product get name > C:\InstalledPrograms.txt Run wmic command for a remote computer: wmic /node:COMPUTERNAME {rest of command here} Replace COMPUTERNAME with the hostname of the machine you want the results from.
🌐
Overpoweredshell
overpoweredshell.com › SysAdmin-Basics-Getting-Installed-Software
SysAdmin Basics - Getting Installed Software
May 5, 2017 - Since it’s just interacting with WMI, you can use WMIC.exe to get installed software. ... This same query could even be run against remote machines using the node switch.
🌐
GitHub
gist.github.com › psatler › 010b26cd57e758278823d7027c40e2a6
List the installed programs on Windows · GitHub
Save psatler/010b26cd57e758278823d7027c40e2a6 to your computer and use it in GitHub Desktop. ... On the wmic prompt type the output command followed by the path of the txt file and the command to list the programs.
🌐
Microsoft Learn
learn.microsoft.com › en-us › windows › win32 › wmisdk › wmi-tasks--computer-software
WMI Tasks: Computer Software - Win32 apps | Microsoft Learn
WMI tasks for computer software obtain information such as which software is installed by the Microsoft Windows Installer (MSI) and software versions. For other examples, see the TechNet ScriptCenter at https://www.microsoft.com/technet. The script examples shown in this topic obtain data only from the local computer. For more information about how to use the script to obtain data from remote computers, see Connecting to WMI on a Remote Computer.
🌐
Spiceworks
community.spiceworks.com › it & tech careers
Install software remotely using wmic - IT & Tech Careers - Spiceworks Community
December 28, 2018 - WMIC (Windows Management Instrumentation Command-Line) is a potent tool that often doesn’t see much use due to the lack of (easily accessible) documentation available. More information can be found on WMIC here: WMIC - T…
🌐
TechDirectArchive
techdirectarchive.com › home › windows server › how to query a list of installed programs in windows
How to query a list of installed programs in Windows - TechDirectArchive
October 24, 2024 - At the “wmic:root\cli>” prompt, type the following command: /node:EnterComputerNameHere product get name, version, vendor · Lastly, you could pull a list of installed programs, and have it saved to a text file of your choice.
🌐
Spiceworks
community.spiceworks.com › software & applications
Show all programs using wmic command - Software & Applications - Spiceworks Community
November 18, 2014 - What is the command to show all programs installed on computer? This is what I use wmic:root\cli> “/node:computername product get name, version” But unfortunately it doesn’t show all the programs installed on the pc, it…
Top answer
1 of 7
19

You can use one of the Sysinternals tools PSinfo:

http://technet.microsoft.com/en-us/sysinternals/bb897550

PsInfo v1.77 - Local and remote system information viewer Copyright (C) 2001-2009 Mark Russinovich Sysinternals - www.sysinternals.com

PsInfo returns information about a local or remote Windows NT/2000/XP system.

Usage: psinfo [-h] [-s] [-d] [-c [-t delimiter]] [filter] [\computer[,computer[,..]]|@file [-u Username [-p Password]]]

 -u        Specifies optional user name for login to
           remote computer.
 -p        Specifies password for user name.
 -h        Show installed hotfixes.
 -s        Show installed software.
 -d        Show disk volume information.
 -c        Print in CSV format
 -t        The default delimiter for the -c option is a comma,
           but can be overriden with the specified character. Use
           "\t" to specify tab.
 filter    Psinfo will only show data for the field matching the

filter. e.g. "psinfo service" lists only the service pack field. computer Direct PsInfo to perform the command on the remote computer or computers specified. If you omit the computer name PsInfo runs the command on the local system, and if you specify a wildcard (\*), PsInfo runs the command on all computers in the current domain. @file PsInfo will run against the computers listed in the file specified.

Issuing

PSinfo -s \\computername

will tell you what is installed on a remote computer.

2 of 7
11

On an rpm-based Linux distribution, you could run the following:

ssh <user-who-can-run-rpm>@<remote.host> 'rpm -qa | sort'

For a deb-based distribution, pass this to the ssh command:

'dpkg-query -l | sort'

For Gentoo (per a supplied comment from Monksy):

'qpkg -I | sort'

For Solaris:

'pkginfo -i | sort'

And on AIX:

'lslpp -a all | sort'