Es gibt viele Möglichkeiten, Informationen aus Intune zu exportieren. Du kannst zum Beispiel Log Analytics, das Data Warehouse oder die Graph API verwenden. Wenn du jedoch mehrere tausend Geräte oder Apps über Graph exportieren möchtest, kann es passieren, dass Graph ein Paging durchführt. Paging bedeutet, dass du mit einem Aufruf nur eine bestimmte Anzahl an Einträgen erhältst und dann einen weiteren Aufruf für den nächsten Bereich machen musst. Das bedeutet für dich, dass du ein Skript schreiben musst, das durch die Seiten iteriert.
Ein weiteres Problem: Wenn du z. B. alle Discovered Apps exportieren möchtest, musst du durch alle Geräte iterieren, da dieses Attribut in List-Aufrufen nicht mitgeliefert wird. Wenn du aber mehrere 10k oder 100k Geräte hast, dauert das sehr lange.
Es gibt jedoch eine Graph Report API, die darauf ausgelegt ist, grosse Datenmengen zu exportieren und sie dir auf wirklich einfache Weise als CSV bereitzustellen. Wie du sie verwenden kannst, erkläre ich dir in diesem Blog.

Inhaltsverzeichnis
Wie funktioniert es
- Öffne den Graph Explorer
- Klicke oben rechts, um dich anzumelden

- Ändere die Methode auf POST
- Kopiere die folgende URL in die Adressleiste
https://graph.microsoft.com/beta/deviceManagement/reports/exportJobs

- Jetzt müssen wir den Body erstellen. Das hängt davon ab, was du exportieren möchtest.
| ReportName (Export-Parameter) |
|---|
| DeviceCompliance |
| DeviceNonCompliance |
| Devices |
| DetectedAppsAggregate |
| FeatureUpdatePolicyFailuresAggregate |
| DeviceFailuresByFeatureUpdatePolicy |
| DetectedAppsRawData |
| FeatureUpdateDeviceState |
| UnhealthyDefenderAgents |
| DefenderAgents |
| ActiveMalware |
| Malware |
| AllAppsList |
| AppInstallStatusAggregate |
| DeviceInstallStatusByApp |
| UserInstallStatusAggregateByApp |
| ComanagedDeviceWorkloads |
| ComanagementEligibilityTenantAttachedDevices |
| DeviceRunStatesByProactiveRemediation |
| DevicesWithInventory |
| FirewallStatus |
| GPAnalyticsSettingMigrationReadiness |
| QualityUpdateDeviceErrorsByPolicy |
| QualityUpdateDeviceStatusByPolicy |
| MAMAppProtectionStatus |
| MAMAppConfigurationStatus |
- In diesem Beispiel exportieren wir alle Discovered Apps
{
"reportName": "DetectedAppsRawData",
"localizationType": "LocalizedValuesAsAdditionalColumn"
}
- In diesem Beispiel exportieren wir alle Geräte mit einem Filter für OwnerType und wählen nur den DeviceName aus
{
"reportName": "Devices",
"filter":"(OwnerType eq '1')",
"localizationType": "LocalizedValuesAsAdditionalColumn",
"select": [
"DeviceName"
]
}
- Du musst diesen Body in das Request-Body-Feld im Graph Explorer kopieren
- Klicke auf Run query, um den Report anzufordern

- Nun musst du den Wert in id an die URL anhängen. Das muss so aussehen:
https://graph.microsoft.com/beta/deviceManagement/reports/exportJobs('DetectedAppsRawData_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx')

- Ändere die Methode auf GET
- Leere das Request-Body-Feld
- Klicke auf Run query, um die Erstellung des Reports auszulösen

- Jetzt hast du die Erstellung des Reports ausgelöst. Der Report wird im Backend generiert. Du musst dieselbe Abfrage nach einigen Sekunden oder Minuten erneut ausführen (abhängig von der Grösse)
- Klicke auf Run Query, um die Download-URL zu erhalten

- Kopiere den Wert im url-Tag (Download-URL) in die Adressleiste des Browsers, um den CSV-Report herunterzuladen.
- Der Download der CSV-Datei startet (die Datei ist gezippt)

Mit diesen Schritten hast du einen vollständigen Intune-Massenexport direkt im Graph Explorer durchgeführt. Wenn du tiefer in das Thema einsteigen möchtest, findest du in der offiziellen Microsoft-Learn-Dokumentation zu den Intune-Reporting-Export-APIs die vollständige Liste aller verfügbaren Reports samt der jeweils unterstützten Filter- und Select-Parameter.
Wie du die Export-API per PowerShell verwendest
Um den Prozess zu automatisieren und einfacher zu gestalten, habe ich ein PowerShell-Skript geschrieben, das den Export initialisiert und startet und wartet, bis der Export abgeschlossen ist. Danach lädt es die ZIP-Datei herunter und entpackt sie, um die CSV bereitzustellen. Um dieses Skript zu verwenden, folge diesen Schritten
- Du findest ein Skript in meinem GitHub-Repository oder in diesem Beitrag, um die CSV per PowerShell zu exportieren
<#
Version: 1.0
Author: Jannik Reinhard (jannikreinhard.com)
Script: Get-GraphExportApiReport
Description:
Get an CSV Report from the Graph API
Release notes:
Version 1.0: Init
#>
function Get-AuthToken {
[cmdletbinding()]
param
(
[Parameter(Mandatory=$true)]
$User
)
$userUpn = New-Object "System.Net.Mail.MailAddress" -ArgumentList $User
$tenant = $userUpn.Host
$AadModule = Get-Module -Name "AzureAD" -ListAvailable
if ($AadModule -eq $null) {
Write-Host "AzureAD PowerShell module not found, looking for AzureADPreview"
$AadModule = Get-Module -Name "AzureADPreview" -ListAvailable
}
$adal = Join-Path $AadModule.ModuleBase "Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
$adalforms = Join-Path $AadModule.ModuleBase "Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll"
Add-Type -Path $adal
Add-Type -Path $adalforms
$clientId = "d1ddf0e4-d672-4dae-b554-9d5bdfd93547"
$redirectUri = "urn:ietf:wg:oauth:2.0:oob"
$resourceAppIdURI = "https://graph.microsoft.com"
$authority = "https://login.microsoftonline.com/$Tenant"
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
$platformParameters = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters" -ArgumentList "Auto"
$userId = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.UserIdentifier" -ArgumentList ($User, "OptionalDisplayableId")
$authResult = $authContext.AcquireTokenAsync($resourceAppIdURI,$clientId,$redirectUri,$platformParameters,$userId).Result
$authHeader = @{
'Content-Type'='application/json'
'Authorization'="Bearer " + $authResult.AccessToken
'ExpiresOn'=$authResult.ExpiresOn
}
return $authHeader
}
#################################################################################################
########################################### Start ###############################################
#################################################################################################
$reportName = 'DetectedAppsRawData'
#Get auth took
if(-not $global:authToken.Authorization){
if($User -eq $null -or $User -eq ""){
$User = Read-Host -Prompt "Please specify your user principal name for Azure Authentication"
Write-Host
}
$global:authToken = Get-AuthToken -User $User
}
$body = @"
{
"reportName": "$reportName",
"localizationType": "LocalizedValuesAsAdditionalColumn"
}
"@
$id = (Invoke-RestMethod -Uri https://graph.microsoft.com/beta/deviceManagement/reports/exportJobs -Headers $authToken -Method POST -Body $body).id
$status = (Invoke-RestMethod -Uri "https://graph.microsoft.com/beta/deviceManagement/reports/exportJobs('$id')" -Headers $authToken -Method GET).status
while (-not ($status -eq 'completed')) {
$response = Invoke-RestMethod -Uri "https://graph.microsoft.com/beta/deviceManagement/reports/exportJobs('$id')" -Headers $authToken -Method Get
$status = ($response).status
}
Invoke-WebRequest -Uri $response.url -OutFile "./intuneExport.zip"
Expand-Archive "./intuneExport.zip" -DestinationPath "./intuneExport"
## Copy the file to an storage or do some actions
- Lade das Skript herunter und trage den gewünschten Report in die Variable $reportName ein

- Führe das Skript aus und du erhältst die entpackte CSV-Datei als Ausgabe
Häufige Stolpersteine
Ein typischer Fehler ist, die GET-Abfrage zu früh auszuführen: Bei grossen Tenants kann die Generierung des Reports im Backend einige Minuten dauern, und solange der Status nicht completed lautet, ist das url-Feld leer. Prüfe also immer zuerst den Status, bevor du die Download-URL kopierst.
Ebenfalls wichtig: Die Download-URL ist nur für kurze Zeit gültig und läuft nach wenigen Minuten ab. Wenn der Download fehlschlägt, löst du die Abfrage einfach erneut aus, um eine frische URL zu erhalten. Achte ausserdem darauf, dass dein Konto bzw. die App die Berechtigung DeviceManagementManagedDevices.Read.All besitzt, da die Export-Jobs sonst direkt mit einem Berechtigungsfehler abgewiesen werden.
Das ist der komplette Intune-Massenexport-Workflow – vom Auslösen des Jobs im Graph Explorer bis hin zum vollautomatisierten PowerShell-Lauf. Weitere Tipps rund um Intune und Graph findest du in den anderen Anleitungen auf jannikreinhard.com.
Seems there is a problem with the bulk export: “PostExportJobAsync not supported for reportType DiscoveredAppsRawData”
Seems there is a problem with the API: “PostExportJobAsync not supported for reportType DiscoveredAppsRawData”
Did you use Post?