Über Intune verteilte Software Pakete liefern einen Status zurück, ob sie erfolgreich installiert wurden, auf Installation warten oder fehlerhaft sind. Der Status lässt sich mit PowerShell auswerten und als Übersicht exportieren. Ein Beispiel für die Auswertung.
Werden über Intune Apps (oder Softwarepakete) verteilt liefern sie an Intune einen Status zurück. Im Intune Portal zeigt es als Übersicht eine Nummer für fehlerhafte Installationen, und darüber weitere Informationen über die betroffenen Apps. Im besten Fall sind es 0 fehlerhafte App Installationen.
In meinem Beispiel werte ich über PowerShell und Microsoft Graph den Installationsstatus für über Intune verteilte Apps aus. Am Ende exportiert es das Ergebnis in eine csv-Datei.
In die Auswertung inkludiere ich folgende Daten:
- App ID
- App Displayname
- App Version (sofern verfügbar)
- Ob die App an Geräte zugewiesen ist
- An welche Geräte die App zugewiesen ist (sofern sie zugewiesen ist)
- Geräte ID
- Wann das Gerät zuletzt mit Intune synchronisiert wurde
- Installationsstatus der App (sofern sie zugewiesen ist)
Bei Microsoft Graph sind dafür zwei APIs erforderlich.
- List mobileApps (Beta API); liefert alle über Intune verteilten Apps.
- List mobileAppInstallStatuses (Beta API); liefert den App Installationsstatus pro Gerät.
Für die Auswertung über Microsoft Graph ist wie üblich eine Azure AD App erforderlich. Hier eine Hilfe zur Erstellung. Für beide APIs ist die Berechtigung DeviceManagementApps.Read.All ausreichend. Am Ende von dem Beitrag ist das Beispiel zusammengefasst.
- Über mein Command Get-TAMSAuthToken hole ich mir einen Token zur Authentifizierung.
Import-module TAMPowerShell
$AuthHeader = Get-TAMSAuthToken -AppID [AppID] -ClientSecret [ClientSecret] -Tenantname "[Tenantname].onmicrosoft.com" -API Graph -PermissionType Application -ReturnAuthHeader
- Über die List mobileApps API frage ich alle in Intune verfügbaren Apps ab, und falls die API durch Paging nicht sofort alle zurückgibt wiederholt sich die Abfrage bis es alle Apps erhalten hat.
$Url = "https://graph.microsoft.com/beta/deviceAppManagement/mobileApps"
$AllIntuneApps = Invoke-RestMethod -Method GET -uri $Url -Headers $AuthHeader
$AllIntuneApps = Get-TAMSGraphAllResults -Results $AllIntuneApps -AuthHeader $AuthHeader
- Im nächsten Schritt ist es eine Schleife die alle Apps durchläuft und für jede App auswertet auf welchen Geräten es verteilt ist.
$AppInstallationState = @()
$Count = 1
foreach($App in $AllIntuneApps)
{
Write-Host ("$Count of " + $AllIntuneApps.Count + " - " + $App.displayName + "...")
$IntuneAppID = $App.id
$Url = "https://graph.microsoft.com/beta/deviceAppManagement/mobileApps/$IntuneAppID/deviceStatuses"
$AllAppStates = Invoke-RestMethod -Method GET -uri $Url -Headers $AuthHeader
$AllAppStates = $AllAppStates.value
- Beim Verteilstatus kann es 2 Möglichkeiten geben.
- Eine App wurde auf kein Gerät verteilt.
- Eine App wurde auf ein oder mehrere Geräte verteilt.
Für die Möglichkeiten liefert es den Status zurück bzw. so viel eben möglich ist. Ist eine App auf keinem Gerät installiert bleiben die optionalen Daten leer. Wurde eine App auf mehrere Geräte verteilt liefert es für jedes Gerät den Status.
if( $AllAppStates.Count -eq 0 )
{
# App is not installed on any device
$AppStateObj = New-Object -TypeName PSObject
$AppStateObj | Add-Member -MemberType NoteProperty -Name AppID -Value $IntuneAppID
$AppStateObj | Add-Member -MemberType NoteProperty -Name Displayname -Value $App.displayName
$AppStateObj | Add-Member -MemberType NoteProperty -Name AppVersion -value $App.displayVersion
$AppStateObj | Add-Member -MemberType NoteProperty -Name isAssigned -value $App.isAssigned
$AppStateObj | Add-Member -MemberType NoteProperty -Name DeviceName -Value $null
$AppStateObj | Add-Member -MemberType NoteProperty -Name DeviceID -Value $null
$AppStateObj | Add-Member -MemberType NoteProperty -Name LastDeviceSync -Value $null
$AppStateObj | Add-Member -MemberType NoteProperty -Name InstallState -value $null
$AppInstallationState += $AppStateObj
} else
{
# App is installed on multiple devices
foreach($AppState in $AllAppStates)
{
$AppStateObj = New-Object -TypeName PSObject
$AppStateObj | Add-Member -MemberType NoteProperty -Name AppID -Value $IntuneAppID
$AppStateObj | Add-Member -MemberType NoteProperty -Name Displayname -Value $App.displayName
$AppStateObj | Add-Member -MemberType NoteProperty -Name AppVersion -value $App.displayVersion
$AppStateObj | Add-Member -MemberType NoteProperty -Name isAssigned -value $App.isAssigned
$AppStateObj | Add-Member -MemberType NoteProperty -Name DeviceName -Value $AppState.deviceName
$AppStateObj | Add-Member -MemberType NoteProperty -Name DeviceID -Value $AppState.deviceId
$AppStateObj | Add-Member -MemberType NoteProperty -Name LastDeviceSync -Value (get-date $AppState.lastSyncDateTime -Format G)
$AppStateObj | Add-Member -MemberType NoteProperty -Name InstallState -value $AppState.installState
$AppInstallationState += $AppStateObj
}
}
$Count++
}
- Im letzten Schritt exportiert es die Daten in eine csv-Datei und legt diese im Benutzerverzeichnis unter Dokumente ab.
$Date = (get-date -format d).Replace(".","-")
$ExportPath = ([Environment]::GetFolderPath("MyDocuments") + "\IntuneAppInstallationState-$Date.csv")
$AppInstallationState | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding utf8 -Force
Write-Host "File export: $ExportPath"
- Über Excel lässt sich die Datei importieren, filtern, sortieren und mehr.
Die Commands zusammengefasst.
Kleiner Hinweis: bei Windows mit englischen Datums-Einstellungen schlägt das Schreiben der CSV-Datei fehl:
IntuneAppInstallationState-5\4\2022.csv’.
Hallo Rick, danke für den Hinweis. Ich passte es gerade an. In dem Format ist es unabhängig zur Sprache des Systems.