Fleet logo
Menu An icon indicating that interacting with this button will open the navigation menu.
Fleet logo An 'X' icon indicating that this can be interacted with to close the navigation menu.
Multi platform
Device management   (+ MDM) Orchestration   (+ monitoring) Software management   (+ CVEs) Integrations

Docs
Stories
News Ask around Share your story COMPANY
The handbook What people are saying

Pricing Schedule a demo
Multi platform
Device management + MDM Orchestration + monitoring Software management + CVEs, usage, app library Integrations
Docs
Stories
News Ask around Schedule a demo Share your story COMPANY The handbook What people are saying
Pricing Try it yourself
Queries/
Get installed Windows software

Get installed Windows software

Contributor's GitHub profile picture

Zach Wasserman

Get all software installed on a Windows computer, including programs, browser plugins, and installed packages. Note that this does not include other running processes in the processes table.

To learn more about queries, check this guide.

Query PowerShellNEW BashNEW
SELECT name AS name, version AS version, 'Program (Windows)' AS type, 'programs' AS source FROM programs UNION SELECT name AS name, version AS version, 'Package (Python)' AS type, 'python_packages' AS source FROM python_packages UNION SELECT name AS name, version AS version, 'Browser plugin (IE)' AS type, 'ie_extensions' AS source FROM ie_extensions UNION SELECT name AS name, version AS version, 'Browser plugin (Chrome)' AS type, 'chrome_extensions' AS source FROM chrome_extensions UNION SELECT name AS name, version AS version, 'Browser plugin (Firefox)' AS type, 'firefox_addons' AS source FROM firefox_addons UNION SELECT name AS name, version AS version, 'Package (Chocolatey)' AS type, 'chocolatey_packages' AS source FROM chocolatey_packages;
# Get installed Windows programs from registry
$programs = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName } | ForEach-Object {
    [PSCustomObject]@{
        name    = $_.DisplayName
        version = $_.DisplayVersion
        type    = "Program (Windows)"
        source  = "programs"
    }
}

# Get installed Python packages (if pip is available)
$python_pkgs = @()
try {
    $pipOutput = & pip list --format=freeze 2>$null
    if ($pipOutput) {
        foreach ($line in $pipOutput) {
            if ($line -match "^(.*?)==(.*)$") {
                $python_pkgs += [PSCustomObject]@{
                    name    = $matches[1]
                    version = $matches[2]
                    type    = "Package (Python)"
                    source  = "python_packages"
                }
            }
        }
    }
} catch {
    # pip not found or error occurred
}

# Get Internet Explorer extensions from registry
$ie_extensions = @()
$ieRegKey = "HKLM:\SOFTWARE\Microsoft\Internet Explorer\Extensions"
if (Test-Path $ieRegKey) {
    $ieData = Get-ItemProperty -Path $ieRegKey -ErrorAction SilentlyContinue
    if ($ieData) {
        foreach ($prop in $ieData.PSObject.Properties) {
            # Using property name as the identifier; version info is not normally stored
            $ie_extensions += [PSCustomObject]@{
                name    = $prop.Name
                version = ""
                type    = "Browser plugin (IE)"
                source  = "ie_extensions"
            }
        }
    }
}

# Get Chrome extensions by reading installed extension manifests
$chrome_extensions = @()
$chromeExtPath = Join-Path $env:LOCALAPPDATA "Google\Chrome\User Data\Default\Extensions"
if (Test-Path $chromeExtPath) {
    $extDirs = Get-ChildItem -Path $chromeExtPath -Directory -ErrorAction SilentlyContinue
    foreach ($ext in $extDirs) {
        $versionDirs = Get-ChildItem -Path $ext.FullName -Directory -ErrorAction SilentlyContinue
        foreach ($verDir in $versionDirs) {
            $manifestPath = Join-Path $verDir.FullName "manifest.json"
            if (Test-Path $manifestPath) {
                try {
                    $manifest = Get-Content $manifestPath -Raw | ConvertFrom-Json
                    $extName = $manifest.name
                    $extVersion = $manifest.version
                } catch {
                    $extName = $ext.Name
                    $extVersion = $verDir.Name
                }
            } else {
                $extName = $ext.Name
                $extVersion = $verDir.Name
            }
            $chrome_extensions += [PSCustomObject]@{
                name    = $extName
                version = $extVersion
                type    = "Browser plugin (Chrome)"
                source  = "chrome_extensions"
            }
        }
    }
}

# Get Firefox add-ons by locating extensions.json in profile directories and parsing it
$firefox_addons = @()
$firefoxProfilesPath = Join-Path $env:APPDATA "Mozilla\Firefox\Profiles"
if (Test-Path $firefoxProfilesPath) {
    $profiles = Get-ChildItem -Path $firefoxProfilesPath -Directory -ErrorAction SilentlyContinue
    foreach ($profile in $profiles) {
        $extensionsJson = Join-Path $profile.FullName "extensions.json"
        if (Test-Path $extensionsJson) {
            try {
                $json = Get-Content $extensionsJson -Raw | ConvertFrom-Json
                if ($json.addons) {
                    foreach ($addon in $json.addons) {
                        if ($addon.type -eq "extension") {
                            $firefox_addons += [PSCustomObject]@{
                                name    = $addon.name
                                version = $addon.version
                                type    = "Browser plugin (Firefox)"
                                source  = "firefox_addons"
                            }
                        }
                    }
                }
            } catch {
                # Skip profiles with parsing issues
            }
        }
    }
}

# Get installed Chocolatey packages (if choco is available)
$chocolatey_packages = @()
try {
    $chocoOutput = & choco list --local-only --limit-output 2>$null
    if ($chocoOutput) {
        foreach ($line in $chocoOutput) {
            if ($line -match "^(.*?)\|(.*)$") {
                $chocolatey_packages += [PSCustomObject]@{
                    name    = $matches[1]
                    version = $matches[2]
                    type    = "Package (Chocolatey)"
                    source  = "chocolatey_packages"
                }
            }
        }
    }
} catch {
    # choco not found or error occurred
}

# Combine all results
$result = $programs + $python_pkgs + $ie_extensions + $chrome_extensions + $firefox_addons + $chocolatey_packages

# Output the result to stdout in table format
$result | Format-Table -AutoSize
An icon indicating that this section has important information

PowerShell commands are currently work in progress, contributions welcome.

An icon indicating that this section has important information

Bash commands for macOS are currently work in progress, contributions welcome.

Platform

macOSApple

WindowsWindows

LinuxLinux

ChromeOSChromeOS

Suggest an editEdit Talk to an engineerTalk to us
Fleet logo
Multi platform Device management Orchestration Software management Integrations Pricing
Documentation Support Docs API Release notes Get your license
Company About News Jobs Logos/artwork Why open source?
ISO 27001 coming soon a small checkmarkSOC2 Type 2 Creative Commons Licence CC BY-SA 4.0
© 2025 Fleet Inc. Privacy
Slack logo GitHub logo LinkedIn logo X (Twitter) logo Youtube logo Mastadon logo
Tried Fleet yet?

Get started with Fleet

Start
continue
×