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.
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
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.
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
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.
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.
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.
Zusätzlich kannst du es über Graph Explorer im Browser simulieren. Den Header nicht vergessen.