Microsoft Intune
Export software inventory from Microsoft Intune (Microsoft Endpoint Manager), through the Intune Admin Center (UI) or the Microsoft Graph API (PowerShell), and upload it with the SIM template. The Microsoft Graph integration brings in Intune app inventory without an export.
Using either the Intune Admin Center or the Microsoft Graph API, you can produce a clean, SIM-ready CSV of discovered applications with device context:
- Intune Discovered Apps (per device): Application inventory detected on managed devices.
- Microsoft Graph API:
deviceManagement/managedDevices(device metadata, includingdeviceName)deviceManagement/managedDevices/{id}/detectedApps(apps per device)deviceManagement/detectedAppswith relatedmanagedDevices(for join-style retrieval)
Notes:
- Discovered apps coverage varies by platform and management channel.
- Windows 10/11, Windows Server (where supported), and macOS provide the richest app metadata. Publisher may be blank for some entries.
Prerequisites
Section titled “Prerequisites”For console (UI) method
Section titled “For console (UI) method”- Intune Admin Center access with permission to view Devices/Reports.
- Devices must be enrolled and recently reported inventory.
- Ability to export reports (standard tenant permission).
For Graph API (PowerShell) method
Section titled “For Graph API (PowerShell) method”- Azure AD app registration or delegated admin with:
DeviceManagementManagedDevices.Read.AllDeviceManagementApps.Read.All
- PowerShell 7+ recommended.
- Microsoft Graph PowerShell SDK or ability to obtain OAuth token for REST calls.
- Network access to
graph.microsoft.com.
Two supported approaches are documented below.
Export methods
Section titled “Export methods”Option 1: Intune admin center (UI) export
Section titled “Option 1: Intune admin center (UI) export”This is the simplest and fastest way to get a one-off export.
- Sign in to Intune Admin Center:
https://intune.microsoft.com. - Go to Reports → Devices → Discovered apps.
- Alternatively: Apps → Monitor → Discovered apps.
- Filter by Platform and/or Device groups as needed.
- Click Export and choose CSV.
- Save as
Intune_SIM_Export.csv.
Ensure your CSV includes or can be mapped to:
- Device name (may appear as Device or Device Name)
- App / Application name
- Version
- Publisher / Vendor
If device name appears in a separate export, use the Graph API approach below to guarantee a single, properly structured file.
Option 2: Microsoft Graph API (PowerShell), recommended for automation
Section titled “Option 2: Microsoft Graph API (PowerShell), recommended for automation”This script retrieves managed devices and their detected apps, then flattens the results to the exact SIM column layout.
Step 1: Connect to Microsoft Graph
Section titled “Step 1: Connect to Microsoft Graph”# Requires Microsoft.Graph module# Install-Module Microsoft.Graph -Scope CurrentUser
Import-Module Microsoft.Graph
# Connect with required permissions:# DeviceManagementManagedDevices.Read.All, DeviceManagementApps.Read.AllConnect-MgGraph -Scopes "DeviceManagementManagedDevices.Read.All","DeviceManagementApps.Read.All"Select-MgProfile -Name "beta" # or "v1.0" if your tenant supports all used endpointsStep 2: Retrieve devices and detected apps, then export
Section titled “Step 2: Retrieve devices and detected apps, then export”# Export path$ExportPath = "C:\Exports\Intune_SIM_Export.csv"
# 1) Get all managed devices (pull Device Name and Id)$allDevices = @()$resp = Invoke-MgGraphRequest -Method GET -Uri "/beta/deviceManagement/managedDevices?`$top=999"$allDevices += $resp.valuewhile ($resp.'@odata.nextLink') { $resp = Invoke-MgGraphRequest -Method GET -Uri $resp.'@odata.nextLink' $allDevices += $resp.value}
# Helper lookup: DeviceId -> DeviceName$deviceNameById = @{}$allDevices | ForEach-Object { if ($_.id -and $_.deviceName) { $deviceNameById[$_.id] = $_.deviceName }}
# 2) For each device, get detected apps and build SIM rows$exportRows = New-Object System.Collections.Generic.List[object]
$deviceCount = $allDevices.Count$idx = 0foreach ($dev in $allDevices) { $idx++ # Optional progress Write-Progress -Activity "Fetching detected apps" -Status "$($dev.deviceName) ($idx of $deviceCount)" -PercentComplete (($idx/$deviceCount)*100)
$appsResp = Invoke-MgGraphRequest -Method GET -Uri "/beta/deviceManagement/managedDevices/$($dev.id)/detectedApps?`$top=999" $apps = @() $apps += $appsResp.value while ($appsResp.'@odata.nextLink') { $appsResp = Invoke-MgGraphRequest -Method GET -Uri $appsResp.'@odata.nextLink' $apps += $appsResp.value }
foreach ($app in $apps) { # Graph properties commonly available: displayName, version, publisher $exportRows.Add([PSCustomObject]@{ "Device Name" = $dev.deviceName "Software Name" = $app.displayName "Software Version" = $app.version "Software Publisher" = $app.publisher }) }}
# 3) Export to CSV (UTF-8, no type info)$exportRows | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8Write-Host "Export complete: $ExportPath"Notes:
- If your tenant restricts the beta profile, use
v1.0where supported. - Large tenants should expect pagination; the script handles
@odata.nextLink. - Some entries may lack Publisher or Version depending on the app source.
Preparing for SIM import
Section titled “Preparing for SIM import”The CSV header row must be exactly Device Name,Software Name,Software Version,Software Publisher.
- Open the Licenseware SIM Template.
- Paste or import the CSV data.
Remove blanks/duplicates before saving.
Then upload it on the SIM - Template data source. See SIM template.
Troubleshooting
Section titled “Troubleshooting”| Issue | Cause | Resolution |
|---|---|---|
| Missing devices or apps | Devices not enrolled or recently reported | Confirm enrollment and run a sync; wait for inventory to update. |
| Publisher/Version blank | Source metadata incomplete (store/UWP/macOS pkg) | Accept blanks, supplement from another source if required. |
| Graph 403/401 | Insufficient permissions or consent not granted | Assign DeviceManagementManagedDevices.Read.All and DeviceManagementApps.Read.All; re-consent. |
| Partial results | Pagination not handled | Ensure the script processes @odata.nextLink for devices and apps. |
| Encoding errors on import | CSV not UTF-8 | Re-export with -Encoding UTF8. |
Example output
Section titled “Example output”Device Name,Software Name,Software Version,Software PublisherLAPTOP-001,Google Chrome,129.0.6668.90,Google LLCLAPTOP-002,Microsoft 365 Apps for Enterprise,2409,Microsoft CorporationMBP-003,Slack,4.39.95,Slack TechnologiesSRV-01,Adobe Acrobat DC,24.002.20933,Adobe Inc.