Method 1 — WMIC (Windows 10 and Earlier)

WMIC (Windows Management Instrumentation Command-line) has been the classic one-liner for listing installed software for over a decade. Open Command Prompt (no elevation required for most queries) and run:

wmic product get name,version,vendor,installlocation

This queries the Win32_Product WMI class and returns every MSI-based application. The output is tab-separated and can take 30–90 seconds on machines with many installs — the class triggers a consistency check on each package during the query, which is why it is slow.

To export directly to a CSV from Command Prompt:

wmic product get name,version,vendor /format:csv > "%USERPROFILE%\Desktop\installed-apps.csv"
⚠️WMIC is deprecated in Windows 11. It still works in Windows 11 22H2 and 23H2 but Microsoft has signalled removal in a future release. For Windows 11 deployments, use the PowerShell alternatives below. WMIC also only enumerates MSI-installed packages — applications installed via MSIX, Appx, Winget, or portable installers are not included.

Method 2 — PowerShell Get-WmiObject (Legacy, Broad Coverage)

Get-WmiObject queries the same Win32_Product WMI class as WMIC but gives you PowerShell's filtering and formatting pipeline. This is useful for filtering and exporting in one step:

# List all MSI-installed apps sorted by name
Get-WmiObject -Class Win32_Product |
    Select-Object Name, Version, Vendor, InstallDate |
    Sort-Object Name |
    Format-Table -AutoSize
# Export to CSV
Get-WmiObject -Class Win32_Product |
    Select-Object Name, Version, Vendor, InstallDate |
    Sort-Object Name |
    Export-Csv -Path "$env:USERPROFILE\Desktop\installed-apps.csv" -NoTypeInformation

To filter for a specific vendor (e.g., all Microsoft products):

Get-WmiObject -Class Win32_Product |
    Where-Object { $_.Vendor -like "*Microsoft*" } |
    Select-Object Name, Version, InstallDate |
    Sort-Object Name

Method 3 — PowerShell Get-Package (Recommended for Windows 11)

Get-Package uses the PackageManagement (OneGet) framework and is the preferred modern approach. It does not trigger a WMI consistency check, runs significantly faster, and returns results from multiple package providers including MSI, Appx, and Chocolatey if installed:

# List all installed packages (all providers)
Get-Package | Select-Object Name, Version, ProviderName | Sort-Object Name | Format-Table -AutoSize
# List only MSI/Programs provider (equivalent to Add/Remove Programs)
Get-Package -ProviderName Programs | Select-Object Name, Version | Sort-Object Name
# Export to CSV
Get-Package | Select-Object Name, Version, ProviderName |
    Sort-Object Name |
    Export-Csv -Path "$env:USERPROFILE\Desktop\packages.csv" -NoTypeInformation
ℹ️Get-Package with -ProviderName Programs reads from the Uninstall registry keys directly rather than querying WMI, so it is much faster and picks up applications that Win32_Product misses — including many 32-bit apps installed in WOW6432Node.

Method 4 — Direct Registry Query

The Windows registry stores installed application data in two locations:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall — 64-bit applications
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall — 32-bit applications on a 64-bit OS

You can query these directly from Command Prompt using reg query:

rem List all 64-bit installed apps
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /v DisplayName

rem List all 32-bit apps on a 64-bit system
reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s /v DisplayName

For a cleaner, combined output including version numbers, use PowerShell to query both registry paths at once:

$paths = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
)

Get-ItemProperty -Path $paths |
    Where-Object { $_.DisplayName -ne $null } |
    Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
    Sort-Object DisplayName |
    Format-Table -AutoSize

Note the addition of HKCU (current user) — per-user installs (common with applications installed without admin rights) only appear in the HKCU hive, not HKLM. WMIC and Win32_Product both miss per-user installs entirely.

Filtering and Finding Specific Applications

To check whether a specific application is installed — useful in scripts or audits:

$paths = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
)

$appName = "7-Zip"

$result = Get-ItemProperty -Path $paths |
    Where-Object { $_.DisplayName -like "*$appName*" } |
    Select-Object DisplayName, DisplayVersion, Publisher

if ($result) {
    $result | Format-Table -AutoSize
} else {
    Write-Host "$appName is NOT installed on this machine." -ForegroundColor Yellow
}

Exporting to CSV for Asset Inventory

The registry-based method produces the most complete results for an inventory export, covering MSI, EXE-based installers, per-user apps, and many portable tool wrappers:

$paths = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
)

Get-ItemProperty -Path $paths |
    Where-Object { $_.DisplayName -ne $null } |
    Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
    Sort-Object DisplayName |
    Export-Csv -Path "$env:USERPROFILE\Desktop\software-inventory-$(hostname).csv" -NoTypeInformation

Write-Host "Inventory saved to Desktop." -ForegroundColor Green

The hostname is appended to the filename — useful when running this script across multiple machines via a remote management tool and consolidating results.

Comparison Summary

MethodSpeedMSI AppsEXE AppsPer-User AppsWindows 11
wmic product getSlowYesNoNoDeprecated
Get-WmiObject Win32_ProductSlowYesNoNoWorks
Get-PackageFastYesPartialPartialRecommended
Registry query (HKLM + HKCU)Very fastYesYesYesRecommended

Need Help?

Melbits manages IT for Melbourne businesses and can deploy centralised software inventory and patch compliance reporting across your entire fleet via Microsoft Intune or a dedicated RMM platform. Contact us to learn how we can give you real-time visibility into every device in your organisation.