Identify Software Install Count Using PowerShell

Use a PowerShell script to identify software packages installed on every device in an organization referenced by the computer name.

By altering the script you can add additional fields - but make sure the Set-Content line reflects all of the fields you add to the Select-Object part of the last line of the script. You’ll also want the Set-Content line to have the fields in the same order as the Select-Object.

Available fields
List All Software Packages for All Devices

There are three areas in the code that you’ll need to update to get the script to function:

  1. $orgID = 'YOUR_ORG_ID'
    You will need your Org ID, which can be found by looking at the URL. Select the value after the "?o="

    Note: The user must be a Global or Zone administrator to manage API keys for a zone. See Managing Keys for more information.

  2. $apiKey = 'YOUR_API_KEY'
    In your console, go to Settings > Keys and select the API key. Note that the API key is per user, so that another user will have different API keys.
  3. $filePath 
    You can also modify $filepath if you want to change the file name or save it in a different location. Keep in mind the script will overwrite a previously generated file if it exists.

Identify Software Install Count Script

Use this script to identify installed packages on every device in your organization.

See also How to Exclude items using -notlike switch

# Set these -----------------

$apiKey = 'YOUR_API_KEY'
$orgID = 'YOUR_ORG_ID'
$filepath = 'C:\Temp\SoftwareInventory.csv'

# ---------------------------

$page = 0
$limit = 500
$servers = @()

Set-Content $filepath -Value "Computer,display_name,version"

$apiInstance = ''
$apiTable = 'servers'

while($true) {

    $orgAndKey = "?o=$orgID&api_key=$apiKey&l=$limit&p=$page"

    # Put components together
    $uri = $apiInstance + $apiTable + $orgAndKey
    $resp = (Invoke-WebRequest -Method GET -Uri $uri -UseBasicParsing).Content | ConvertFrom-Json | Select-Object results

    $servers += $resp.results
    $page += 1

    if($resp.results.count -lt $limit) {

$servers = $servers | Sort-Object name

# Check each server for software
foreach ($server in $servers) {

    $serverID = $
    $serverName = $
    Write-Output $serverName
    $orgAndKey = "/$serverID/packages?o=$orgID"

    # Put components together
    $getURI = $apiInstance + $apiTable + $orgAndKey

    $headers = @{ "Authorization" = "Bearer $apiKey" }
    $response = (Invoke-WebRequest -Method Get -Uri $getURI -Headers $headers).Content | ConvertFrom-Json

    $response | Where-Object {$_.installed -EQ $true} `
              | Select-Object @{label=”Computer”; Expression= {"$serverName"}},Display_Name,Version `
              | Sort-Object Display_Name | Export-Csv -Path $filepath -NoTypeInformation -Append -Force


How to Exclude items using -notlike switch

You can also modify it to do things like not show Windows updates & hotfixes by altering the Where-Object part of the last line of the script. For example:

Where-Object {$.installed -EQ $true -and $.repo -notlike “Windows*”}

Related Topics: