Einführung in Microsoft Graph Advanced Queries

In meinem PowerShell Command für den Export aller Microsoft To-Do Listen filtere ich über Microsoft Graph alle Benutzerkonten mit einem To-Do Serviceplan. Mit einem normalen Filter gibt die Graph API einen Fehler zurück, der Filter sei zu komplex.

PowerShell
Import-Module Microsoft.Graph.Authentication
Connect-Graph -Scopes User.Read.All
$Url = "https://graph.microsoft.com/v1.0/users?`$filter=assignedPlans/any(x:x/service eq 'To-Do')"
$Results = Invoke-MgGraphRequest -Method get $Url

PowerShell

In der Fehlermeldung ist die Begründung über eine zu komplexe Query für mein gesuchtes Property assignedPlans vermerkt. Die Fehlermeldung hilft die Query anzupassen.

Complex query on property assignedPlans is not supported

Für komplexe Queries ist im Microsoft Developer Blog die Information über Advanced Queries in Microsoft Graph für verschiedene OData System Query Optionen beschrieben.
Für mein gesuchtes Property assignedPlans sind im Filter zwei weiteren Angaben erforderlich.

  • In der Query URL die Angabe über count=true
  • Im Header der Anfrage die Angabe ConsistencyLevel = eventual

Zur Zusammenfassung beschreibt es Microsoft in der Dokumentation über Azure AD Advanced Queries.

The Microsoft Graph query engine uses an index store to fulfill query requests. To add support for additional query capabilities on some properties, these properties are now indexed in a separate store. This separate indexing allows Azure AD to increase support and improve the performance of the query requests. However, these advanced query capabilities are not available by default but, the requestor must also set the ConsistencyLevel header to eventual and, with the exception of $search, use the $count query parameter. The ConsistencyLevel header and $count are referred to as advanced query parameters.

In der Dokumentation sind ausserdem unterstützte Properties und Operatoren aufgelistet. Für die Auswertung über Benutzerkonten mit einem gesuchten Serviceplan listet es mein Property assignedPlans.

Screenshot

Mit dem Wissen über Advanced Queries lassen sich beide Angaben sehr einfach in einer Graph Abfrage ergänzen.
In Zeile 3 wird die Angabe über count ergänzt, in Zeile 4 der Header

PowerShell
Import-Module Microsoft.Graph.Authentication
Connect-Graph -Scopes User.Read.All
$Url = "https://graph.microsoft.com/v1.0/users?`$count=true&`$filter=assignedPlans/any(x:x/service eq 'To-Do')"
$AllUsers = Invoke-MgGraphRequest -Method get $Url -Headers @{"ConsistencyLevel" = "eventual"}
$AllUsers.Value.Count


Die Graph API liefert mir nun die gesuchten Benutzerkonten zurück. Zur Erinnerung, durch Paging würde die API jeweils nur eine begrenzte Zahl an Ergebnissen zurückliefern.

PowerShell

Noch einfacher fällt es mit den PowerShell Modulen von Microsoft Graph.
Für mein einfaches Beispiel mit Benutzerkonten ist es das Modul Microsoft.Graph.Users.

PowerShell
Install-Module Microsoft.Graph.Users
Import-Module Microsoft.Graph.Users
Connect-Graph -Scopes User.Read.All
Get-MgUser -ConsistencyLevel eventual -Count userCount -All -Filter "assignedPlans/any(x:x/service eq 'To-Do')"


Das oben erwähnte Paging fällt mit dem Parameter -All weg. Die Graph API liefert wieder 23 Ergebnisse zurück.

PowerShell

Zusätzlich kannst du es über Graph Explorer im Browser simulieren. Den Header nicht vergessen.

Abfrage in Graph Explorer simulieren
Abfrage in Graph Explorer simulieren
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. Bei Fragen kontaktiere mich über LinkedIn oder [email protected].

Schreibe einen Kommentar

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