๐ฑ Recipe ยท Intune & Device Management
Inventory Installed Software (Detected Apps) on a User's Intune-Managed Devices
Enumerate a user's Intune-managed devices and retrieve the detected applications inventory via the Microsoft Endpoint Manager admin center, Graph API, or PowerShell
Complexity
Intermediate
Impact
device-management + software-inventory + audit + help-desk + intune
Context
Why This Matters
Why this recipe exists
When supporting an end user โ during a help desk ticket, license reconciliation, software audit, or security incident โ administrators frequently need to know exactly what software is installed on that person's managed devices. Intune collects this data automatically from enrolled Windows, macOS, iOS, and Android devices and exposes it as the detectedApps collection on each managedDevice.
When to run it
- A user reports a problem with a specific application and you need to confirm the version installed.
- You are investigating whether a vulnerable or unauthorized piece of software is present on a user's endpoints.
- You are preparing for a hardware refresh, role change, or offboarding and want a full software footprint.
- You are validating that required line-of-business apps were successfully installed by Intune.
Important prerequisite
Reading Intune managed device data requires an account with an Intune-aware admin role (Intune Administrator, Global Reader, Helpdesk Operator, or equivalent). Simply granting the Graph scope DeviceManagementManagedDevices.Read.All is not sufficient โ the signed-in principal must also hold a role that grants read access in the Intune RBAC model. If both the scope and the role are not present, the /deviceManagement/managedDevices endpoints return 401/403 Forbidden.
Expected Outcomes
What you will have when you finish
- A confirmed list of the user's Intune-managed devices, including device ID, name, OS, model, last check-in, and compliance state.
- For each device, the full detected apps inventory โ display name, version, publisher, size, and device count.
- A consolidated, deduplicated software list suitable for pasting into a ticket, CSV export, or audit report.
- A reusable PowerShell script that can be re-run on any user by changing a single parameter.
Risks & Considerations
Things to watch out for
- Registered โ Managed.
/users/{id}/registeredDevicesreturns Entra ID device objects, which include BYOD and Workplace-Joined devices that may not be Intune-enrolled. Only devices that appear under/deviceManagement/managedDeviceswill have adetectedAppsinventory. - Detected apps is not real-time. Intune refreshes the inventory approximately every 7 days on Windows and at each check-in on mobile platforms. Recent installs or uninstalls may not appear immediately.
- Win32 vs. MSI scope. On Windows, detected apps reports Win32 apps registered under Add/Remove Programs. Per-user MSIX/AppX packages and portable executables are not included.
- Permission escalation.
DeviceManagementApps.Read.AllandDeviceManagementManagedDevices.Read.Allexpose tenant-wide software and hardware data. Grant only to principals that already have a matching Intune role; do not grant broadly to service principals without justification. - Privacy. In some jurisdictions, personal device software inventory may be regulated. Confirm your organization's BYOD and privacy policies before sharing the output with non-IT stakeholders.
Required Permissions
| Permission | Why It's Needed |
|---|---|
| User.Read.All | Resolve the user's object ID from their UPN or display name. |
| Directory.Read.All | Enumerate registered and owned devices via /users/{id}/registeredDevices. |
| DeviceManagementManagedDevices.Read.All | List Intune-managed devices and read per-device metadata. |
| DeviceManagementApps.Read.All | Read the detectedApps collection on each managed device. |
| Intune role: Global Reader, Intune Administrator, or Helpdesk Operator | Required in addition to Graph scopes โ Intune enforces its own RBAC layer on top of delegated/application permissions. |
The fastest way to get this done: just ask Dex. Copy the prompt below and paste it into your Dex conversation.
For IT Admins
Paste into Dex Pro
For End Users
How an employee would ask Dex for help
Using the Microsoft Intune admin center
Sign in to the Microsoft Intune admin center with an account that holds the Intune Administrator, Global Reader, or Helpdesk Operator role.
In the left navigation, go to:
Users โ All users โ search for the target user (e.g. {user_upn}) โ select the user
On the user's blade, select Devices. You will see every Intune-enrolled device associated with that user, including device name, OS, compliance, last check-in, and primary user.
Click a device to open its details blade.
In the device's left-hand menu, select:
Monitor โ Discovered apps
This shows every application Intune has detected on that device, with columns for App name, Version, and Publisher.
Use the Export button (top of the grid) to download the inventory as CSV for archival or ticket attachment.
Repeat steps 4โ6 for each of the user's devices if they have more than one.
Tenant-wide alternative
For a cross-device pivot (e.g., "which devices have Acrobat Reader installed?"), use:
Apps โ Monitor โ Discovered apps
Then filter by app name and inspect the Devices column.
Using Microsoft Graph
The end-to-end flow requires four calls. All examples use the v1.0 endpoint where available, falling back to beta for detectedApps.
Step 1 โ Resolve the user's object ID
GET https://graph.microsoft.com/v1.0/users/{user_upn}?$select=id,displayNameResponse:
{
"id": "771aac0a-bfda-4c0f-ae7c-d649ca972bf7",
"displayName": "Alexander Jamieson"
}Step 2 โ List the user's Intune-managed devices
Use the userId filter on the managed devices collection:
GET https://graph.microsoft.com/v1.0/deviceManagement/managedDevices?$filter=userId eq '{user_id}'&$select=id,deviceName,operatingSystem,osVersion,model,lastSyncDateTime,complianceStateIf this returns an empty result but the user clearly has devices, fall back to the Entra ID registered-devices endpoint and cross-reference by device name:
GET https://graph.microsoft.com/v1.0/users/{user_id}/registeredDevices?$select=id,displayName,operatingSystemStep 3 โ For each managed device, fetch detected apps
GET https://graph.microsoft.com/beta/deviceManagement/managedDevices('{managed_device_id}')/detectedApps?$select=displayName,version,publisher,sizeInByte,deviceCountSample response:
{
"value": [
{
"displayName": "Microsoft Edge",
"version": "121.0.2277.128",
"publisher": "Microsoft Corporation",
"sizeInByte": 0
},
{
"displayName": "7-Zip 23.01 (x64)",
"version": "23.01",
"publisher": "Igor Pavlov"
}
]
}Step 4 โ Handle paging
If the response contains @odata.nextLink, issue a follow-up GET to that URL until the link is absent. Large fleets can return hundreds of apps per device.
Troubleshooting 401/403
If /deviceManagement/managedDevices returns Forbidden even with the correct Graph scopes consented, the signed-in principal is missing an Intune RBAC role. Assign one of: Intune Administrator, Global Reader, Helpdesk Operator, or a custom Intune role that includes Managed devices: Read and Organization: Read.
Using PowerShell and the Microsoft.Graph module
The script below automates the full flow: resolve user, list their managed devices, pull detected apps per device, and emit both a per-device breakdown and a consolidated deduplicated list.
Prerequisites
- PowerShell 7+ recommended.
- Install the Graph module once:
Install-Module Microsoft.Graph -Scope CurrentUser - The signed-in account must hold an Intune-aware admin role.
Quick interactive run
Connect-MgGraph -Scopes "User.Read.All","DeviceManagementManagedDevices.Read.All","DeviceManagementApps.Read.All"
# Resolve user
$user = Get-MgUser -UserId "{user_upn}"
# List managed devices for that user
$devices = Get-MgDeviceManagementManagedDevice -Filter "userId eq '$($user.Id)'"
# Pull detected apps per device
foreach ($d in $devices) {
Write-Host "`n== $($d.DeviceName) ($($d.OperatingSystem)) =="
Get-MgDeviceManagementManagedDeviceDetectedApp -ManagedDeviceId $d.Id |
Select-Object DisplayName, Version, Publisher |
Sort-Object DisplayName |
Format-Table -AutoSize
}For a production-ready version with parameters, error handling, CSV export, and consolidated output, download the script below.
Next steps