Before removing software, auditing security risks, or troubleshooting performance issues, it’s critical to know exactly what applications are installed on a system. Windows stores application data in multiple places, which makes manual checks unreliable.
This post provides a complete application inventory solution using PowerShell that captures:
- Apps shown in Apps & Features
- Programs listed in Programs and Features
- Microsoft Store (AppX) applications
- Install metadata not visible in the GUI
Why Application Inventory Matters
A detailed application inventory helps with:
- Security audits and vulnerability management
- License compliance
- Troubleshooting slow systems
- Detecting unwanted or unauthorized software
- Preparing for OS upgrades or migrations
Many tools only show a partial view. This script pulls data from all relevant sources.
What Information This Script Collects
The script gathers the following details wherever available:
- Application name
- Version
- Publisher
- Install date
- Install location
- Uninstall command
- Architecture (32-bit / 64-bit)
- Application type (Win32 or AppX)
- Whether it is provisioned for new users
- User scope (current user or all users)
All results are displayed in a PowerShell table and can be exported if needed.
PowerShell Script to List All Applications (Full Inventory)
Requirements
- Run PowerShell as Administrator for full visibility
- Works on Windows 10 and Windows 11
PowerShell Script
# ==========================================
# Full Windows Application Inventory Script
# ==========================================
$Applications = @()
# ------------------------------
# Registry-based applications
# (Programs and Features)
# ------------------------------
$RegistryPaths = @(
"HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*",
"HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*",
"HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
)
foreach ($Path in $RegistryPaths) {
Get-ItemProperty $Path -ErrorAction SilentlyContinue | ForEach-Object {
if ($_.DisplayName) {
$Applications += [PSCustomObject]@{
ApplicationName = $_.DisplayName
Version = $_.DisplayVersion
Publisher = $_.Publisher
InstallDate = $_.InstallDate
InstallLocation = $_.InstallLocation
UninstallString = $_.UninstallString
Architecture = if ($Path -like "*WOW6432Node*") { "32-bit" } else { "64-bit" }
AppType = "Win32"
Scope = if ($Path -like "HKCU*") { "Current User" } else { "All Users" }
Provisioned = "No"
}
}
}
}
# ------------------------------
# Installed AppX applications
# ------------------------------
Get-AppxPackage -AllUsers | ForEach-Object {
$Applications += [PSCustomObject]@{
ApplicationName = $_.Name
Version = $_.Version
Publisher = $_.Publisher
InstallDate = ""
InstallLocation = $_.InstallLocation
UninstallString = "Remove-AppxPackage"
Architecture = $_.Architecture
AppType = "AppX"
Scope = if ($_.IsFramework) { "System" } else { "User/App" }
Provisioned = "No"
}
}
# ------------------------------
# Provisioned AppX applications
# ------------------------------
Get-AppxProvisionedPackage -Online | ForEach-Object {
$Applications += [PSCustomObject]@{
ApplicationName = $_.DisplayName
Version = $_.Version
Publisher = $_.PublisherId
InstallDate = ""
InstallLocation = ""
UninstallString = "Remove-AppxProvisionedPackage"
Architecture = $_.Architecture
AppType = "AppX (Provisioned)"
Scope = "New Users"
Provisioned = "Yes"
}
}
# ------------------------------
# Display results
# ------------------------------
$Applications |
Sort-Object ApplicationName |
Format-Table `
ApplicationName,
Version,
Publisher,
Architecture,
AppType,
Scope,
Provisioned -AutoSize
Example Output (Table View)
| Application Name | Version | Publisher | Architecture | App Type | Scope | Provisioned |
|---|---|---|---|---|---|---|
| Microsoft Teams | 1.6.00 | Microsoft | x64 | AppX | User/App | No |
| Google Chrome | 121.0 | Google LLC | 64-bit | Win32 | All Users | No |
| Xbox Game Bar | 5.823 | Microsoft | x64 | AppX | User/App | Yes |
This gives you one unified view of everything installed or staged on the system.
Exporting the Data (Optional)
To export results to CSV for auditing or reporting:
$Applications | Export-Csv "C:\Temp\ApplicationInventory.csv" -NoTypeInformation
You can also pipe the output to:
Out-GridView- Excel
- Email reports
- Log management tools
Common Use Cases
This script is ideal for:
- Pre-cleanup audits before bloatware removal
- Security baseline reviews
- IT asset documentation
- Helpdesk troubleshooting
- Intune or SCCM discovery scripts
Final Thoughts
Windows application data is scattered across multiple locations, and relying on a single method will always give you incomplete results. This PowerShell approach consolidates Win32 apps, Store apps, and provisioned apps into one readable table.