Intune – Installationsstatus von Apps über PowerShell auswerten

Ü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.

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.

  1. Ü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
  1. Ü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
  1. 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 
  1. Beim Verteilstatus kann es 2 Möglichkeiten geben.
    1. Eine App wurde auf kein Gerät verteilt.
    2. 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++ 
}
  1. 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"
  1. Über Excel lässt sich die Datei importieren, filtern, sortieren und mehr.

Die Commands zusammengefasst.

Share
Avatar-Foto

Tobias Asböck

Tobias ist ein Senior System Engineer mit rund 10 Jahren Berufserfahrung für Microsoft 365 Produkte wie SharePoint Online, OneDrive for Business, Teams Collaboration, Entra ID, Information Protection, Universal Print und Microsoft 365 Lizenzierung. Aus der Vergangenheit kennt er über einen Zeitraum von 15+ Jahren die Planung, Administration und den Betrieb von SharePoint Server Umgebungen. Tobias ist ein PowerShell Scripter mit Zertifizierungen für Microsoft 365 Produkte. In seiner Freizeit beschäftigt sich Tobias mit Aktualisierungen in der M365-Welt, ist mit seinem Rennvelo unterwegs und anderen sportlichen Aktivitäten beschäftigt.

2 Responses

  1. Rick sagt:

    Kleiner Hinweis: bei Windows mit englischen Datums-Einstellungen schlägt das Schreiben der CSV-Datei fehl:

    IntuneAppInstallationState-5\4\2022.csv’.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert