ScriptIntermediateRead-only

Installed Application Inventory for Windows Endpoints

A read-only PowerShell inventory starter for collecting installed applications from local or remote Windows endpoints.

Good For

  • software audits

  • migration prep

  • support handoff

  • baseline documentation

How to Use It

  1. Run from an elevated PowerShell session only if your environment requires registry access elevation.

  2. Collect both 64-bit and 32-bit uninstall registry views.

  3. Filter out blank DisplayName values before exporting results.

  4. Use the local mode first to confirm output shape on one machine.

  5. Use remote single-host mode for support triage, then host-list mode for audits.

  6. Export to CSV when comparing systems or attaching evidence to a ticket.

Execution Modes

  • local
  • remote-single-host
  • remote-host-list

Inputs and Outputs

Inputs

  • local computer
  • single hostname
  • CSV host list
  • TXT host list
  • future Active Directory query

Outputs

  • verbose-console
  • csv

Command Starter

Writes local output artifacts: review the output path before running

# ---------------------------------------------------------------------
# Operator inputs
# ---------------------------------------------------------------------
$ComputerNames = @('localhost')
$OutputPath = '.\windows-software-inventory.csv'
# ---------------------------------------------------------------------
# Read machine-level uninstall registry views from each endpoint
# ---------------------------------------------------------------------
$Results = foreach ($ComputerName in $ComputerNames) {
Invoke-Command -ComputerName $ComputerName -ScriptBlock {
$UninstallRoots = @(
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
)
foreach ($Root in $UninstallRoots) {
Get-ItemProperty -Path $Root -ErrorAction SilentlyContinue |
Where-Object { $_.DisplayName } |
ForEach-Object {
[pscustomobject]@{
ComputerName  = $env:COMPUTERNAME
DisplayName   = $_.DisplayName
DisplayVersion = $_.DisplayVersion
Publisher      = $_.Publisher
InstallDate    = $_.InstallDate
RegistrySource = $Root
}
}
}
}
}
$Results | Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8
$Results | Sort-Object ComputerName, DisplayName | Format-Table -AutoSize

Validation

  • The CSV contains app names, versions, publishers, and install dates where available.

  • Known installed applications appear in the export.

  • Blank registry entries are filtered out before review.

Reporting

  • Use the CSV as the starter inventory artifact for support, migration, or baseline documentation.

  • Machine-level uninstall keys are the deliberate starter scope; per-user installs, Store apps, and package-manager sources belong in an expanded report pack.

Safety Notes

  • Keep the default inventory mode read-only.

  • Avoid Win32_Product inventory because it can trigger MSI repair behavior.

Keep Moving

Take the workflow further

Use the related Learn guide, practice the workflow in a Lab, or choose another Tool.