Fonctionnalités de requête avancées sur les objets Microsoft Entra ID
Microsoft Graph prend en charge des fonctionnalités de requête avancées sur différents objets Microsoft Entra ID, également appelés objets d’annuaire, pour vous aider à accéder efficacement aux données. Par exemple, l’ajout d’opérateurs Not (not
), Non égaux (ne
) et se termine avec (endsWith
) sur le paramètre de $filter
requête.
Le moteur de requête Microsoft Graph utilise un magasin d’index pour répondre aux demandes de requête. Pour ajouter la prise en charge de fonctionnalités de requête supplémentaires sur certaines propriétés, ces propriétés peuvent être indexées dans un magasin distinct. Cette indexation distincte améliore les performances des requêtes. Toutefois, ces fonctionnalités de requête avancées ne sont pas disponibles par défaut, mais le demandeur doit définir l’en-tête eventual
ConsistencyLevelsur et, à l’exception de $search
, utiliser le paramètre de $count
requête. L’en-tête ConsistencyLevel et $count
font référence aux paramètres de requête avancée.
Par exemple, pour récupérer uniquement les comptes d’utilisateur inactifs, vous pouvez exécuter l’une de ces requêtes qui utilisent le paramètre de requête $filter
.
Option 1 : Utilisez le paramètre de $filter
requête avec l’opérateur eq
. Cette requête fonctionne par défaut et ne nécessite pas les paramètres de requête avancés.
GET https://graph.microsoft.com/v1.0/users?$filter=accountEnabled eq false
Option 2 : Utilisez le paramètre de $filter
requête avec l’opérateur ne
. Cette requête n’est pas prise en charge par défaut, car l’opérateur ne
est uniquement pris en charge dans les requêtes avancées. Par conséquent, vous devez ajouter l’en-tête ConsistencyLevel défini sur eventual
et utiliser la chaîne de $count=true
requête.
GET https://graph.microsoft.com/v1.0/users?$filter=accountEnabled ne true&$count=true
ConsistencyLevel: eventual
Microsoft Entra ID objets (répertoire) qui prennent en charge les fonctionnalités de requête avancées
Les fonctionnalités de requête avancées sont prises en charge uniquement sur les objets d’annuaire et leurs relations, y compris les objets suivants :
Scénarios de requête nécessitant des fonctionnalités de requête avancées
Le tableau suivant répertorie les scénarios de requête sur des objets annuaire qui sont uniquement pris en charge dans des requêtes avancées :
Description | Exemple |
---|---|
Utilisation de $count en tant que segment d’URL |
GET~/groups/$count |
Utilisation de $count comme paramètre de chaîne de requête |
GET~/servicePrincipals?$count=true |
Utilisation de $count dans une expression $filter |
GET~/users?$filter=assignedLicenses/$count eq 0&$count=true |
Utilisation de $search |
GET~/applications?$search="displayName:Browser" |
Utilisation de $orderby sur certaines propriétés |
GET~/applications?$orderby=displayName&$count=true |
Utilisation de $filter avec l’opérateur endsWith |
GET~/users?$count=true&$filter=endsWith(mail,'@outlook.com') |
Utilisateur de $filter et $orderby dans la même requête |
GET../applications?$orderby=displayName&$filter=startsWith(displayName, 'Box')&$count=true |
Utilisation de $filter avec les opérateurs startsWith sur des propriétés spécifiques. |
GET~/users?$filter=startsWith(mobilePhone, '25478') OR startsWith(mobilePhone, '25473')&$count=true |
Utilisation de $filter avec les opérateurs ne et not |
GET~/users?$filter=companyName ne null and NOT(companyName eq 'Microsoft')&$count=true |
Utilisation de $filter avec les opérateurs not et startsWith |
GET~/users?$filter=NOT startsWith(displayName, 'Conf')&$count=true |
Utilisation de $filter sur une collection avec l’opérateur endsWith |
GET~/users?$count=true&$filter=proxyAddresses/any (p:endsWith(p, 'contoso.com'))&$select=id,displayName,proxyaddresses |
Utilisation de la conversion OData avec la liste des membres transitifs |
GET~/me/transitiveMemberOf/microsoft.graph.group?$count=true |
Remarque
- L’utilisation simultanée de
$filter
et$orderby
est uniquement pris en charge par les requêtes avancées. -
$expand
n’est actuellement pas pris en charge avec les requêtes avancées. - Ces fonctionnalités de requête avancée ne sont pas disponibles chez les clients Azure AD B2C.
- Pour utiliser des fonctionnalités de requête avancées dans les requêtes par lots, spécifiez l’en-tête ConsistencyLevel dans le corps JSON de la demande
POST
.
Prise en charge du filtrage par propriétés des objets Microsoft Entra ID (répertoire)
Les propriétés d’objets annuaire se comportent différemment dans leur prise en charge pour des paramètres de requête. Les scénarios suivants sont courants pour les objets annuaire :
-
in
L’opérateur est pris en charge par défaut chaque fois queeq
l’opérateur est pris en charge par défaut. - L’opérateur
endswith
est pris en charge uniquement avec les paramètres de requête avancés et uniquement par les propriétés mail, otherMails, userPrincipalName et proxyAddresses . - L’obtention de collections vides (
/$count eq 0
,/$count ne 0
) et de collections avec moins d’un objet (/$count eq 1
,/$count ne 1
) est prise en charge uniquement avec des paramètres de requête avancés. - Les
not
opérateurs de négation etne
sont pris en charge uniquement avec les paramètres de requête avancés.- Toutes les propriétés qui prennent en charge l’opérateur
eq
prennent également en charge lesne
opérateurs ounot
. - Pour les requêtes utilisant l’opérateur lambda
any
, utilisez l’opérateurnot
. Voir Filtrage en utilisant des opérateurs lambda.
- Toutes les propriétés qui prennent en charge l’opérateur
Les tableaux suivants résument la prise en charge des $filter
opérateurs par les propriétés des objets d’annuaire et indiquent où l’interrogation est prise en charge par le biais de fonctionnalités de requête avancées.
Légende
-
L’opérateur
$filter
fonctionne par défaut pour cette propriété. -
L’opérateur
$filter
fonctionne uniquement sans paramètres de requête avancés. -
L’opérateur
$filter
nécessite desparamètres de requête avancés, qui sont les suivants :- En-tête
ConsistencyLevel=eventual
- Chaîne de requête
$count=true
- En-tête
-
L’opérateur
$filter
n’est pas pris en charge sur cette propriété. Envoyez-nous vos commentaires pour demander la prise en charge de cette propriété$filter
pour vos scénarios. - Les cellules vides indiquent que la requête n’est pas valide pour cette propriété.
- La colonne valeur nulle indique que la propriété peut avoir la valeur Null et peut être filtrée à l’aide de
null
. - Les propriétés qui ne sont pas répertoriées ici ne prennent pas en charge
$filter
du tout.
Propriétés des unités administratives
Propriété | eq | startsWith | eq Null |
---|---|---|---|
description | |||
displayName | |||
isMemberManagementRestricted | |||
membershipRule | |||
membershipRuleProcessingState |
Propriétés de l’application
Propriété | eq | startsWith | ge/le | eq Null |
---|---|---|---|---|
appId | ||||
createdDateTime | ||||
description | ||||
disabledByMicrosoftStatus | ||||
displayName | ||||
federatedIdentityCredentials/any(f :f/issuer) | ||||
federatedIdentityCredentials/any(f :f/name) | ||||
federatedIdentityCredentials/any(f :f/subject) | ||||
identifierUris/any(p:p) | ||||
info/logoUrl | ||||
info/termsOfServiceUrl | ||||
notes | ||||
publicClient/redirectUris/any(p:p) | ||||
publisherDomain | ||||
requiredResourceAccess/any(r:r/resourceAppId) | ||||
serviceManagementReference | ||||
signInAudience | ||||
spa/redirectUris/any(p:p) | ||||
tags/any(p:p) | ||||
uniqueName | ||||
verifiedPublisher/displayName | ||||
web/homePageUrl | ||||
web/redirectUris/any(p:p) |
Les propriétés suivantes de l’entité d’application prennent en charge $count
une collection dans une expression de filtre.
Propriété | eq Count 0 | nombre d’eq 1 |
---|---|---|
extensionProperties/$count | ||
federatedIdentityCredentials/$count |
Propriétés du contrat
Propriété | eq | startsWith |
---|---|---|
customerId | ||
defaultDomainName | ||
displayName |
Propriétés du périphérique
Propriété | eq | startsWith | ge/le | eq Null |
---|---|---|---|---|
accountEnabled | ||||
alternativeSecurityIds/any(a:a/identityProvider) | ||||
alternativeSecurityIds/any(a:a/type) | ||||
approximateLastSignInDateTime | ||||
deviceCategory | ||||
deviceId | ||||
deviceOwnership | ||||
displayName | ||||
enrollmentProfileName | ||||
extensionAttributes/extensionAttribute1-15 | ||||
hostnames/any(p:p) | ||||
isCompliant | ||||
isManaged | ||||
isRooted | ||||
managementType | ||||
Fabricant | ||||
mdmAppId | ||||
model | ||||
onPremisesLastSyncDateTime | ||||
onPremisesSecurityIdentifier | ||||
onPremisesSyncEnabled | ||||
operatingSystem | ||||
operatingSystemVersion | ||||
physicalIds/any(p:p) | ||||
profileType | ||||
registrationDateTime | ||||
trustType |
Les propriétés suivantes de l’entité d’appareil prennent en charge $count
une collection dans une expression de filtre.
Propriété | eq Count 0 | nombre d’eq 1 |
---|---|---|
physicalIds/$count | ||
systemLabels/$count |
Propriétés du rôle d’annuaire
Propriété | eq | startsWith | eq Null |
---|---|---|---|
description | |||
displayName | |||
roleTemplateId |
Propriétés de Group
Propriété | eq | startsWith | ge/le | eq Null |
---|---|---|---|---|
assignedLicenses/any(a:a/skuId) | ||||
classification | ||||
createdByAppId | ||||
createdDateTime | ||||
description | ||||
displayName | ||||
expirationDateTime | ||||
groupTypes/any(p :p) | ||||
hasMembersWithLicenseErrors | ||||
infoCatalogs/any(p:p) | ||||
isAssignableToRole | ||||
mailEnabled | ||||
mailNickname | ||||
membershipRule | ||||
membershipRuleProcessingState | ||||
onPremisesLastSyncDateTime | ||||
onPremisesProvisioningErrors/any(o:o/category) | ||||
onPremisesProvisioningErrors/any(o:o/propertyCausingError) | ||||
onPremisesSamAccountName | ||||
onPremisesSecurityIdentifier | ||||
onPremisesSyncEnabled | ||||
preferredLanguage | ||||
proxyAddresses/any(p:p) | ||||
renewedDateTime | ||||
resourceBehaviorOptions/any(p:p) | ||||
resourceProvisioningOptions/any(p:p) | ||||
securityEnabled | ||||
uniqueName |
Les propriétés suivantes de l’entité de groupe prennent en charge $count
une collection dans une expression de filtre.
Propriété | eq Count 0 | nombre d’eq 1 |
---|---|---|
assignedLicenses/$count | ||
onPremisesProvisioningErrors/$count | ||
proxyAddresses/$count |
Propriétés du contact organisationnel
Propriété | eq | startsWith | ge/le | eq Null |
---|---|---|---|---|
CompanyName | ||||
Service | ||||
displayName | ||||
givenName | ||||
jobTitle | ||||
mailNickname | ||||
manager/id | ||||
onPremisesLastSyncDateTime | ||||
onPremisesProvisioningErrors/any(o:o/category) | ||||
onPremisesProvisioningErrors/any(o:o/propertyCausingError) | ||||
onPremisesSyncEnabled | ||||
proxyAddresses/any(p:p) | ||||
surname |
Les propriétés suivantes de l’entité orgContact prennent en charge $count
une collection dans une expression de filtre.
Propriété | eq Count 0 | nombre d’eq 1 |
---|---|---|
onPremisesProvisioningErrors/$count | ||
proxyAddresses/$count |
Propriétés principales du service
Propriété | eq | startsWith | ge/le | eq Null |
---|---|---|---|---|
accountEnabled | ||||
alternativeNames/any(p:p) | ||||
appId | ||||
appOwnerOrganizationId | ||||
appRoleAssignmentRequired | ||||
applicationTemplateId | ||||
claimsPolicy/id | ||||
createdObjects/any(c:c/id) | ||||
description | ||||
displayName | ||||
federatedIdentityCredentials/any(f :f/issuer) | ||||
federatedIdentityCredentials/any(f :f/name) | ||||
federatedIdentityCredentials/any(f :f/subject) | ||||
homepage | ||||
info/logoUrl | ||||
info/termsOfServiceUrl | ||||
notes | ||||
preferredSingleSignOnMode | ||||
preferredTokenSigningKeyEndDateTime | ||||
publisherName | ||||
remoteDesktopSecurityConfiguration/id | ||||
servicePrincipalNames/any(p:p) | ||||
servicePrincipalType | ||||
tags/any(p:p) | ||||
verifiedPublisher/displayName |
Les propriétés suivantes de la prise en charge $count
de l’entité servicePrincipal d’une collection dans une expression de filtre.
Propriété | eq Count 0 | nombre d’eq 1 |
---|---|---|
federatedIdentityCredentials/$count |
Propriétés utilisateur
Propriété | eq | startsWith | ge/le | eq Null |
---|---|---|---|---|
accountEnabled | ||||
ageGroup | ||||
assignedLicenses/any(a:a/skuId) | ||||
assignedPlans/any(a:a/capabilityStatus) | ||||
assignedPlans/any(a:a/service) | ||||
assignedPlans/any(a:a/servicePlanId) | ||||
authorizationInfo/certificateUserIds/any(p :p) | ||||
businessPhones/any(p:p) | ||||
Ville | ||||
cloudRealtimeCommunicationInfo/isSipEnabled | ||||
CompanyName | ||||
consentProvidedForMinor | ||||
country | ||||
createdDateTime | ||||
createdObjects/any(c:c/id) | ||||
creationType | ||||
Service | ||||
displayName | ||||
employeeHireDate | ||||
employeeId | ||||
employeeOrgData/costCenter | ||||
employeeOrgData/division | ||||
employeeType | ||||
externalUserState | ||||
faxNumber | ||||
givenName | ||||
identities/any(i:i/issuer) | ||||
imAddresses/any(p:p) | ||||
infoCatalogs/any(p:p) | ||||
isLicenseReconciliationNeeded | ||||
isResourceAccount | ||||
jobTitle | ||||
mailNickname | ||||
mobilePhone | ||||
officeLocation | ||||
onPremisesDistinguishedName | ||||
onPremisesExtensionAttributes/extensionAttribute1-15 | ||||
onPremisesImmutableId | ||||
onPremisesLastSyncDateTime | ||||
onPremisesProvisioningErrors/any(o:o/category) | ||||
onPremisesProvisioningErrors/any(o:o/propertyCausingError) | ||||
onPremisesSamAccountName | ||||
onPremisesSecurityIdentifier | ||||
onPremisesSipInfo/isSipEnabled | ||||
onPremisesSyncEnabled | ||||
otherMails/any(p:p) | ||||
passwordPolicies | ||||
passwordProfile/forceChangePasswordNextSignIn | ||||
passwordProfile/forceChangePasswordNextSignInWithMfa | ||||
postalCode | ||||
preferredLanguage | ||||
provisionedPlans/any(p:p/provisioningStatus) | ||||
provisionedPlans/any(p:p/service) | ||||
proxyAddresses/any(p:p) | ||||
state | ||||
streetAddress | ||||
surname | ||||
usageLocation | ||||
userPrincipalName | ||||
userType |
Les propriétés suivantes de l’entité utilisateur prennent en charge $count
une collection dans une expression de filtre.
Propriété | eq Count 0 | nombre d’eq 1 |
---|---|---|
assignedLicenses/$count | ||
onPremisesProvisioningErrors/$count | ||
otherMails/$count | ||
ownedObjects/$count | ||
proxyAddresses/$count |
Le tableau suivant indique la prise en charge $filter
par d’autres propriétés d’extension sur l’objet utilisateur .
Type d’extension | eq | startsWith | eq null |
---|---|---|---|
Extensions de schéma | |||
Extensions d’ouverture | |||
Extensions du schéma Directory |
Prise en charge du tri par propriétés des objets Microsoft Entra ID (répertoire)
Le tableau suivant récapitule la prise en charge $orderby
par les propriétés des objets d’annuaire et indique où le tri est pris en charge via des fonctionnalités de requête avancées.
Légende
-
L’opérateur
$orderby
fonctionne par défaut pour cette propriété. -
L’opérateur
$orderby
nécessite desparamètres de requête avancés, qui sont les suivants :- En-tête
ConsistencyLevel=eventual
- Chaîne de requête
$count=true
- En-tête
- L’utilisation de
$filter
et$orderby
dans la même requête pour les objets d’annuaire nécessite toujours des paramètres de requête avancés. Pour plus d’informations, consultez Scénarios de requête qui nécessitent des fonctionnalités de requête avancées.
Objet d’annuaire | Nom de la propriété | $orderby |
---|---|---|
administrativeUnit | createdDateTime | |
administrativeUnit | deletedDateTime | |
administrativeUnit | displayName | |
application | createdDateTime | |
application | deletedDateTime | |
application | displayName | |
orgContact | createdDateTime | |
orgContact | displayName | |
device | approximateLastSignInDateTime | |
device | createdDateTime | |
device | deletedDateTime | |
device | displayName | |
group | createdDateTime | |
group | deletedDateTime | |
group | displayName | |
servicePrincipal | createdDateTime | |
servicePrincipal | deletedDateTime | |
servicePrincipal | displayName | |
utilisateur | createdDateTime | |
utilisateur | deletedDateTime | |
utilisateur | displayName | |
utilisateur | userPrincipalName | |
[tous les autres] | [tous les autres] |
Traitement des erreurs pour les requêtes avancées sur des objets annuaire
La section suivante fournit des exemples de scénarios d’erreur courants lorsque vous n’utilisez pas de paramètres de requête avancés si nécessaire.
Le comptage d’objets annuaire est uniquement pris en charge en utilisant les paramètres de requêtes avancées. Si l’en-tête ConsistencyLevel=eventual
n’est pas spécifié, la requête retourne une erreur lorsque le $count
segment d’URL (/$count
) est utilisé ou ignore silencieusement le $count
paramètre de requête (?$count=true
) s’il est utilisé.
GET https://graph.microsoft.com/v1.0/users/$count
{
"error": {
"code": "Request_BadRequest",
"message": "$count is not currently supported.",
"innerError": {
"date": "2021-05-18T19:03:10",
"request-id": "d9bbd4d8-bb2d-44e6-99a1-71a9516da744",
"client-request-id": "539da3bd-942f-25db-636b-27f6f6e8eae4"
}
}
}
Pour les objets d’annuaire, $search
fonctionne uniquement dans les requêtes avancées. Si l’en-tête ConsistencyLevel n’est pas spécifié, la requête retourne une erreur.
GET https://graph.microsoft.com/v1.0/applications?$search="displayName:Browser"
{
"error": {
"code": "Request_UnsupportedQuery",
"message": "Request with $search query parameter only works through MSGraph with a special request header: 'ConsistencyLevel: eventual'",
"innerError": {
"date": "2021-05-27T14:26:47",
"request-id": "9b600954-ba11-4899-8ce9-6abad341f299",
"client-request-id": "7964ef27-13a3-6ca4-ed7b-73c271110867"
}
}
}
Si une propriété ou un paramètre de requête dans l’URL est uniquement pris en charge dans les requêtes avancées, mais que l’en-tête ConsistencyLevel ou la chaîne de requête $count=true
est manquant, la requête renvoie une erreur.
GET https://graph.microsoft.com/beta/users?$filter=endsWith(userPrincipalName,'%23EXT%23@contoso.com')
{
"error": {
"code": "Request_UnsupportedQuery",
"message": "Operator 'endsWith' is not supported because the required parameters might be missing. Try adding $count=true query parameter and ConsistencyLevel:eventual header. Refer to https://aka.ms/graph-docs/advanced-queries for more information",
"innerError": {
"date": "2023-07-14T08:43:39",
"request-id": "b3731da7-5c46-4c37-a8e5-b190124d2531",
"client-request-id": "a1556ddf-4794-929d-0105-b753a78b4c68"
}
}
}
Si une propriété n’est pas indexée pour prendre en charge un paramètre de requête, la requête retourne une erreur même si des paramètres de requête avancés sont spécifiés. Par exemple, la propriété createdDateTime de la ressource de groupe n’est pas indexée pour les fonctionnalités de requête.
GET https://graph.microsoft.com/beta/groups?$filter=createdDateTime ge 2021-11-01&$count=true
ConsistencyLevel: eventual
{
"error": {
"code": "Request_UnsupportedQuery",
"message": "Unsupported or invalid query filter clause specified for property 'createdDateTime' of resource 'Group'.",
"innerError": {
"date": "2023-07-14T08:42:44",
"request-id": "b6a5f998-94c8-430d-846d-2eaae3031492",
"client-request-id": "2be83e05-649e-2508-bcd9-62e666168fc8"
}
}
}
Toutefois, une requête qui inclut des paramètres de requête peut échouer en mode silencieux. Par exemple, pour les paramètres de requête non pris en charge et pour les combinaisons de paramètres de requête non prises en charge. Dans ce cas, examinez les données retournées par la requête pour déterminer si les paramètres de requête que vous avez spécifiés ont eu l’effet souhaité. Dans l’exemple qui suit, le paramètre @odata.count
est manquant bien que la requête soit réussie.
GET https://graph.microsoft.com/v1.0/users?$count=true
HTTP/1.1 200 OK
Content-type: application/json
{
"@odata.context":"https://graph.microsoft.com/v1.0/$metadata#users",
"value":[
{
"displayName":"Oscar Ward",
"mail":"oscarward@contoso.com",
"userPrincipalName":"oscarward@contoso.com"
}
]
}
Contenu connexe
- Utilisation de paramètres de requête pour personnaliser des réponses
- Limitations de paramètres de requête
- Utiliser le paramètre de requête $search pour mettre en correspondance un critère de recherche
- Explorer les fonctionnalités de requête avancées pour les objets Microsoft Entra ID avec le Kit de développement logiciel (SDK) .NET