Listing Installed Applications in Windows Using PowerShell

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 NameVersionPublisherArchitectureApp TypeScopeProvisioned
Microsoft Teams1.6.00Microsoftx64AppXUser/AppNo
Google Chrome121.0Google LLC64-bitWin32All UsersNo
Xbox Game Bar5.823Microsoftx64AppXUser/AppYes

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.

Leave a Reply

Your email address will not be published. Required fields are marked *