List installed apps by reading the Uninstall registry keys — fast and safe.
All installed software (64-bit + 32-bit keys)
$keys = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
Get-ItemProperty $keys -ErrorAction SilentlyContinue |
Where-Object DisplayName |
Select-Object DisplayName, DisplayVersion, Publisher |
Sort-Object DisplayName
Find one program
Get-ItemProperty 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' |
Where-Object DisplayName -like '*Chrome*' |
Select-Object DisplayName, DisplayVersion, UninstallString
Export the list to CSV
Get-ItemProperty $keys -ErrorAction SilentlyContinue |
Where-Object DisplayName |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Sort-Object DisplayName |
Export-Csv -Path .\installed-software.csv -NoTypeInformation -Encoding UTF8
Apps installed via winget (if present)
winget list
Why not Win32_Product: Get-CimInstance Win32_Product is slow and famously triggers an
MSI “reconfiguration” (self-repair) on every product as it enumerates — avoid it. The registry keys
above are instant and read-only. Check both the normal and WOW6432Node keys to catch 32-bit
apps on 64-bit Windows; per-user installs also live under HKCU:\Software\...\Uninstall\*.