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 photo

Tobias Asböck

Tobias is a Senior System Engineer with more than 10 years of professional experience with Microsoft 365 products such as SharePoint Online, SharePoint Premium, OneDrive for Business, Teams Collaboration, Entra ID, Information Protection, Universal Print, and Microsoft 365 Licensing. He also has 15+ years of experience planning, administering, and operating SharePoint Server environments. Tobias is a PowerShell Scripter with certifications for Microsoft 365 products. In his spare time, Tobias is busy with updates in the Microsoft 365 world or on the road with his road bike and other sports activities. If you have additional questions, please contact me via LinkedIn or [email protected].

Leave a Reply

Your email address will not be published. Required fields are marked *