Partager via


Répertorier des utilisateurs

Espace de noms: microsoft.graph

Importante

Les API sous la version /beta dans Microsoft Graph sont susceptibles d’être modifiées. L’utilisation de ces API dans des applications de production n’est pas prise en charge. Pour déterminer si une API est disponible dans v1.0, utilisez le sélecteur Version .

Récupérez la liste des objets user.

Cette opération renvoie par défaut uniquement un sous-ensemble des propriétés plus couramment utilisées pour chaque utilisateur. Ces propriétés par défaut sont indiquées dans la section Propriétés. Pour obtenir des propriétés qui ne sont pas renvoyées par défaut, effectuez une opération GET pour l'utilisateur et spécifiez les propriétés dans une option de requête OData $select.

Cette API est disponible dans les déploiements de cloud national suivants.

Service global Gouvernement des États-Unis L4 Us Government L5 (DOD) Chine gérée par 21Vianet

Autorisations

L’une des autorisations suivantes est nécessaire pour appeler cette API. Pour plus d’informations, notamment sur la façon de choisir les autorisations, voir Autorisations.

Type d’autorisation Autorisations (de celle qui offre le plus de privilèges à celle qui en offre le moins)
Déléguée (compte professionnel ou scolaire) User.ReadBasic.All, User.Read.All, User.ReadWrite.All, Directory.Read.All, Directory.ReadWrite.All
Déléguée (compte Microsoft personnel) Non prise en charge.
Application User.Read.All, User.ReadWrite.All, Directory.Read.All, Directory.ReadWrite.All

Les utilisateurs invités ne peuvent pas appeler cette API. Pour plus d’informations sur les autorisations pour les utilisateurs membres et invités, consultez Quelles sont les autorisations utilisateur par défaut dans Microsoft Entra ID ?

Requête HTTP

GET /users

Paramètres facultatifs de la requête

Cette méthode prend en charge les $countparamètres de requête , $orderby$filter$expand, $search, , $select, et$top OData pour personnaliser la réponse. $skip n’est pas pris en charge. Les tailles de page par défaut et maximale sont respectivement de 100 et 999 objets utilisateur, sauf lorsque vous spécifiez $select=signInActivity ou $filter=signInActivity. Lorsque signInActivity est sélectionné ou filtré sur, la taille de page maximale est de 999. Certaines requêtes sont prises en charge uniquement lorsque vous utilisez l’en-tête ConsistencyLevel défini sur eventual et $count. Pour plus d’informations, consultez Fonctionnalités de requête avancées sur les objets d’annuaire. Les paramètres $count et $search ne sont actuellement pas disponibles dans les clients Azure AD B2C.

Les propriétés d’extension prennent également en charge les paramètres de requête, dans certains cas, uniquement avec des paramètres de requête avancés. Pour plus d’informations, consultez prise en charge des $filter propriétés par extension.

Certaines propriétés ne peuvent pas être retournées dans une collection d’utilisateurs. Les propriétés suivantes sont uniquement prises en charge lors de la récupération d’un seul utilisateur : aboutMe, birthday, hireDate, interests, mySite, pastProjects, preferredName, responsibilities, schools, skills, mailboxSettings.

Les propriétés suivantes ne sont pas prises en charge dans les comptes Microsoft personnels et seront null : aboutMe, birthday, interests, mySite, pastProjects, preferredName, responsibilities, schools, skills, streetAddress.

En-têtes de demande

En-tête Valeur
Autorisation Porteur {token}. Obligatoire. En savoir plus sur l’authentification et l’autorisation.
ConsistencyLevel éventuellement. Cet en-tête et cet $count sont requis lors de l’utilisation de $search, ou dans une utilisation spécifique de $filter. Pour plus d’informations sur l’utilisation de ConsistencyLevel et $count, consultez Fonctionnalités de requête avancées sur les objets d’annuaire.

Corps de la demande

N’indiquez pas le corps de la demande pour cette méthode.

Réponse

Si elle réussit, cette méthode renvoie un code de réponse 200 OK et une collection d’objets user dans le corps de la réponse.

Tentative d’utilisation de $selectsur la /userscollection pour récupérer les propriétés qui ne peuvent pas être retournées dans une collection d’utilisateurs (par exemple, la requête ../users?$select=aboutMe) retourne un code erreur 501 Not Implemented.

Exemples

Exemple 1 : obtenir tous les utilisateurs

Demande

L’exemple suivant illustre une demande.

GET https://graph.microsoft.com/beta/users

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
  "value":[
    {
      "displayName":"contoso1",
      "mail":"'contoso1@gmail.com",
      "mailNickname":"contoso1_gmail.com#EXT#",
      "otherMails":["contoso1@gmail.com"],
      "proxyAddresses":["SMTP:contoso1@gmail.com"],
      "userPrincipalName":"contoso1_gmail.com#EXT#@contoso.com"
    }
  ]
}

Exemple 2 : obtenir un compte d’utilisateur à l’aide d’un nom de connexion

Trouvez un compte d’utilisateur à l’aide d’un nom de connexion (également appelé compte local).

Remarque : lorsque vous filtrez pour un issuerAssignedId, vous devez fournir l’émetteur et la fonction issuerAssignedId. Toutefois, la valeur de l’émetteur est ignorée dans certains scénarios. Pour plus d’informations sur le filtrage des identités, consultez le type de ressource objectIdentity.

Demande

L’exemple suivant illustre une demande.

GET https://graph.microsoft.com/beta/users?$select=displayName,id&$filter=identities/any(c:c/issuerAssignedId eq 'j.smith@yahoo.com' and c/issuer eq 'My B2C tenant')

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
  "value": [
    {
      "displayName": "John Smith",
      "id": "87d349ed-44d7-43e1-9a83-5f2406dee5bd"
    }
  ]
}

Exemple 3 : Obtenir des utilisateurs invités (B2B) à partir d’un locataire ou d’un domaine spécifique par userPrincipalName

Demande

L’exemple suivant illustre une demande. La valeur userPrincipalName pour les utilisateurs invités (B2B Collaboration) contient toujours l’identificateur « #EXT# ». Par exemple, le userPrincipalName d’un utilisateur dans son locataire d’origine est AdeleV@adatum.com. Lorsque vous invitez l’utilisateur à collaborer dans votre locataire, contoso.com, son userPrincipalName dans votre locataire est « AdeleV_adatum.com#EXT#@contoso.com ».

Cette requête nécessite que l’en-tête ConsistencyLevel soit défini sur eventual et la $count=true chaîne de requête, car la requête inclut l’opérateur endsWith. Pour plus d’informations sur l’utilisation de ConsistencyLevel et $count, consultez Fonctionnalités de requête avancées sur les objets d’annuaire.

NOTE: Vous devez encoder le caractère réservé « # » dans la valeur userPrincipalName en tant que « %23 » dans l’URL de la requête. Pour plus d’informations, consultez Encodage de caractères spéciaux.

GET https://graph.microsoft.com/beta/users?$select=id,displayName,mail,identities&$filter=endsWith(userPrincipalName,'%23EXT%23@contoso.com')&$count=true
ConsistencyLevel: eventual

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#users(id,displayName,mail,identities)",
    "@odata.count": 2,
    "value": [
        {
            "id": "39807bd1-3dde-48f3-8165-81ddd4e46de0",
            "displayName": "Adele Vance",
            "mail": "AdeleV@adatum.com",
            "identities": [
                {
                    "signInType": "userPrincipalName",
                    "issuer": "contoso.com",
                    "issuerAssignedId": "AdeleV_adatum.com#EXT#@cntoso.com"
                }
            ]
        }
    ]
}

Exemple 4 : lister les dates de dernière connexion des utilisateurs avec un nom d’affichage spécifique

Demande

L’exemple suivant illustre une demande.

Remarque

Les détails de la propriété signInActivity nécessitent une licence Microsoft Entra ID P1 ou P2 et l’autorisation AuditLog.Read.All .

GET https://graph.microsoft.com/beta/users?$filter=startswith(displayName,'Eric')&$select=displayName,signInActivity

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context": "https://graph.microsoft.com/beta/users?$filter=startswith(displayName,'Eric')&$select=displayName,signInActivity",
  "value": [
    {
      "displayName": "Eric Solomon",
      "signInActivity": {
        "lastSignInDateTime": "2021-07-29T15:53:27Z",
        "lastSignInRequestId": "f3149ee1-e347-4181-b45b-99a1f82b1c00",
        "lastNonInteractiveSignInDateTime": "2021-07-29T17:53:42Z",
        "lastNonInteractiveSignInRequestId": "868efa6a-b2e9-40e9-9b1c-0aaea5b50200",
        "lastSuccessfulSignInDateTime": "",
        "lastSuccessfulSignInRequestId": ""
      }
    }
  ]
}

Exemple 5 : lister les dates de dernière connexion des utilisateurs dans une plage de temps spécifique

Demande

L’exemple suivant illustre une demande.

Remarque

Les détails de la propriété signInActivity nécessitent une licence Microsoft Entra ID P1 ou P2 et l’autorisation AuditLog.Read.All .

GET https://graph.microsoft.com/beta/users?filter=signInActivity/lastSignInDateTime le 2021-07-21T00:00:00Z

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context": "https://graph.microsoft.com/beta/users?filter=signInActivity/lastSignInDateTime le 2021-07-21T00:00:00Z",
  "value": [
    {
      "displayName": "Adele Vance",
      "userPrincipalName": "AdeleV@contoso.com",
      "signInActivity": {
        "lastSignInDateTime": "2021-06-17T16:41:33Z",
        "lastSignInRequestId": "d4d31c40-4c36-4775-ad59-7d1e6a171f00",
        "lastNonInteractiveSignInDateTime": "0001-01-01T00:00:00Z",
        "lastNonInteractiveSignInRequestId": "",
        "lastSuccessfulSignInDateTime": "",
        "lastSuccessfulSignInRequestId": ""
      }
    },
    {
      "displayName": "Alex Wilber",
      "userPrincipalName": "AlexW@contoso.com",
      "signInActivity": {
        "lastSignInDateTime": "2021-07-29T15:53:27Z",
        "lastSignInRequestId": "f3149ee1-e347-4181-b45b-99a1f82b1c00",
        "lastNonInteractiveSignInDateTime": "2021-07-29T17:53:42Z",
        "lastNonInteractiveSignInRequestId": "868efa6a-b2e9-40e9-9b1c-0aaea5b50200",
        "lastSuccessfulSignInDateTime": "",
        "lastSuccessfulSignInRequestId": ""
      }
    }
  ]
}

Exemple 6 : obtenir seulement un nombre d’utilisateurs

Demande

L’exemple suivant illustre une demande. Cette demande nécessite que l’en-tête ConsistencyLevel soit défini sur eventual, car $count figure dans la demande. Pour plus d’informations sur l’utilisation de ConsistencyLevel et $count, consultez Fonctionnalités de requête avancées sur les objets d’annuaire.

Remarque : Les paramètres de requête $count et $search ne sont actuellement pas disponibles dans les clients Azure AD B2C.

GET https://graph.microsoft.com/beta/users/$count
ConsistencyLevel: eventual

Réponse

L’exemple suivant illustre la réponse.

HTTP/1.1 200 OK
Content-type: text/plain

893

Exemple 7 : utiliser $filter et $top pour obtenir un utilisateur avec un nom complet commençant par « a », avec un nombre d’objets retournés

Demande

L’exemple suivant illustre une demande. Cette requête nécessite que l’en-tête ConsistencyLevel soit défini sur eventual et la chaîne de requête $count=true, car la requête a les paramètres de requête $orderby et $filter. Pour plus d’informations sur l’utilisation de ConsistencyLevel et $count, consultez Fonctionnalités de requête avancées sur les objets d’annuaire.

Remarque : Les paramètres de requête $count et $search ne sont actuellement pas disponibles dans les clients Azure AD B2C.

GET https://graph.microsoft.com/beta/users?$filter=startswith(displayName,'a')&$orderby=displayName&$count=true&$top=1
ConsistencyLevel: eventual

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/beta/$metadata#users",
  "@odata.count":1,
  "value":[
    {
      "displayName":"a",
      "mail":"a@contoso.com",
      "mailNickname":"a_contoso.com#EXT#",
      "otherMails":["a@contoso.com"],
      "proxyAddresses":["SMTP:a@contoso.com"],
      "userPrincipalName":"a_contoso.com#EXT#@contoso.com"
    }
  ]
}

Exemple 8 : utiliser $filter pour obtenir tous les utilisateurs avec un message qui se termine par « »,a@contoso.com y compris un nombre d’objets retournés, avec les résultats classés par userPrincipalName

Demande

L’exemple suivant illustre une demande. Cette requête nécessite que l’en-tête ConsistencyLevel soit défini sur eventual et la chaîne de requête $count=true, car la requête a les paramètres de requête $orderby et $filter, et et utilise également l’opérateur endsWith. Pour plus d’informations sur l’utilisation de ConsistencyLevel et $count, consultez Fonctionnalités de requête avancées sur les objets d’annuaire.

Remarque : Les paramètres de requête $count et $search ne sont actuellement pas disponibles dans les clients Azure AD B2C.

GET https://graph.microsoft.com/beta/users?$filter=endswith(mail,'a@contoso.com')&$orderby=userPrincipalName&$count=true
ConsistencyLevel: eventual

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context": "https://graph.microsoft.com/beta/$metadata#users",
  "@odata.count": 1,
  "value": [
    {
      "displayName": "Grady Archie",
      "givenName": "Grady",
      "jobTitle": "Designer",
      "mail": "GradyA@contoso.com",
      "userPrincipalName": "GradyA@contoso.com",
      "id": "e8b753b5-4117-464e-9a08-713e1ff266b3"
      }
    ]
}

Exemple 9 : Utilisez $search pour récupérer les utilisateurs ayant des noms d’affichage contenant les lettres « wa », y compris le nombre d’objets retournés

Demande

L’exemple suivant illustre une demande. Cette demande nécessite que l’en-tête ConsistencyLevel soit défini sur eventual, car $search figure dans la demande. Pour plus d’informations sur l’utilisation de ConsistencyLevel et $count, consultez Fonctionnalités de requête avancées sur les objets d’annuaire.

Remarque : Les paramètres de requête $count et $search ne sont actuellement pas disponibles dans les clients Azure AD B2C.

GET https://graph.microsoft.com/beta/users?$search="displayName:wa"&$orderby=displayName&$count=true
ConsistencyLevel: eventual

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/beta/$metadata#users",
  "@odata.count":7,
  "value":[
    {
      "displayName":"Oscar Ward",
      "givenName":"Oscar",
      "mail":"oscarward@contoso.com",
      "mailNickname":"oscward",
      "userPrincipalName":"oscarward@contoso.com"
    }
  ]
}

Exemple 10 : utiliser $search pour obtenir les utilisateurs dont les noms d’affichage contiennent les lettres « wa » ou « ad » ainsi que le nombre d’objets renvoyés

Demande

L’exemple suivant illustre une demande. Cette demande nécessite que l’en-tête ConsistencyLevel soit défini sur eventual, car $search figure dans la demande. Pour plus d’informations sur l’utilisation de ConsistencyLevel et $count, consultez Fonctionnalités de requête avancées sur les objets d’annuaire.

Remarque : Les paramètres de requête $count et $search ne sont actuellement pas disponibles dans les clients Azure AD B2C.

GET https://graph.microsoft.com/beta/users?$search="displayName:wa" OR "displayName:ad"&$orderby=displayName&$count=true
ConsistencyLevel: eventual

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/beta/$metadata#users",
  "@odata.count":7,
  "value":[
    {
      "displayName":"Oscar Ward",
      "givenName":"Oscar",
      "mail":"oscarward@contoso.com",
      "mailNickname":"oscward",
      "userPrincipalName":"oscarward@contoso.com"
    },
    {
      "displayName":"contosoAdmin1",
      "mail":"'contosoadmin1@gmail.com",
      "mailNickname":"contosoadmin1_gmail.com#EXT#",
      "proxyAddresses":["SMTP:contosoadmin1@gmail.com"],
      "userPrincipalName":"contosoadmin1_gmail.com#EXT#@contoso.com"
    }
  ]
}

Exemple 11 : utiliser $filter pour obtenir les utilisateurs auxquels est attribuée une licence spécifique

Demande

L’exemple suivant illustre une demande. Cette demande nécessite que l’en-tête ConsistencyLevel soit défini sur eventual, car $search figure dans la demande. Pour plus d’informations sur l’utilisation de ConsistencyLevel et $count, consultez Fonctionnalités de requête avancées sur les objets d’annuaire.

Remarque : Les paramètres de requête $count et $search ne sont actuellement pas disponibles dans les clients Azure AD B2C.

GET https://graph.microsoft.com/beta/users?$select=id,mail,assignedLicenses&$filter=assignedLicenses/any(u:u/skuId eq cbdc14ab-d96c-4c30-b9f4-6ada7cdc1d46)

Réponse

L’exemple suivant illustre la réponse.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context": "https://graph.microsoft.com/beta/$metadata#users(id,mail,assignedLicenses)",
  "value": [
    {
      "id": "cb4954e8-467f-4a6d-a8c8-28b9034fadbc",
      "mail": "admin@contoso.com",
      "assignedLicenses": [
        {
          "disabledPlans": [],
          "skuId": "cbdc14ab-d96c-4c30-b9f4-6ada7cdc1d46"
        }
      ]
    },
    {
      "id": "81a133c2-bdf2-4e67-8755-7264366b04ee",
      "mail": "DebraB@contoso.com",
      "assignedLicenses": [
        {
          "disabledPlans": [],
          "skuId": "cbdc14ab-d96c-4c30-b9f4-6ada7cdc1d46"
        }
      ]
    }
  ]
}

Exemple 12 : obtenir la valeur d’une extension de schéma pour tous les utilisateurs

Dans cet exemple, l’ID de l’extension de schéma est ext55gb1l09_msLearnCourses.

Demande

GET https://graph.microsoft.com/beta/users?$select=ext55gb1l09_msLearnCourses

Réponse

Dans la réponse suivante, la propriété d’extension ext55gb1l09_msLearnCourses de schéma n’est pas assignée dans deux des objets utilisateur.

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#users(ext55gb1l09_msLearnCourses)",
    "value": [
        {},
        {
            "ext55gb1l09_msLearnCourses": {
                "@odata.type": "#microsoft.graph.ComplexExtensionValue",
                "courseType": "Developer",
                "courseName": "Introduction to Microsoft Graph",
                "courseId": 1
            }
        },
        {}
    ]
}

Remarque : Vous pouvez également appliquer la $filter propriété d’extension de schéma pour récupérer des objets pour lequel une propriété de la collection correspond à une valeur spécifiée. La syntaxe pour cela est /users?$filter={schemaPropertyID}/{propertyName} eq 'value'. Par exemple : GET /users?$select=ext55gb1l09_msLearnCourses&$filter=ext55gb1l09_msLearnCourses/courseType eq 'Developer'. Les opérateurs eq et les not opérateurs sont pris en charge.

Exemple 13 : Répertorier tous les utilisateurs avec une attribution d’attribut de sécurité personnalisée qui est égale à une valeur

L’exemple suivant montre comment répertorier tous les utilisateurs avec une attribution d’attribut de sécurité personnalisée qui est égale à une valeur. L’exemple récupère les utilisateurs avec un attribut de sécurité personnalisé nommé AppCountry avec une valeur égale Canadaà . La valeur du filtre respecte la casse. Vous devez ajouter ConsistencyLevel=eventual dans la requête ou l’en-tête. Vous devez également inclure $count=true pour vous assurer que la demande est correctement routée.

Utilisateur n°1

  • Jeu d’attributs : Marketing
  • Attribut : AppCountry
  • Type de données d’attribut : collection de chaînes
  • Valeur d’attribut : ["India","Canada"]

Utilisateur n°2

  • Jeu d’attributs : Marketing
  • Attribut : AppCountry
  • Type de données d’attribut : collection de chaînes
  • Valeur d’attribut : ["Canada","Mexico"]

Pour obtenir des affectations d’attributs de sécurité personnalisées, le principal appelant doit avoir le rôle de Lecteur d’affectation d’attributs ou le rôle d’Administrateur d’affectations d’attributs et doit avoir l’autorisation CustomSecAttributeAssignment.Read.All ou CustomSecAttributeAssignment.ReadWrite.All.

Pour obtenir des exemples d’attributions d’attributs de sécurité personnalisées, consultez Exemples : Affecter, mettre à jour, lister ou supprimer des attributions d’attributs de sécurité personnalisées à l’aide de microsoft API Graph.

Demande

GET https://graph.microsoft.com/beta/users?$count=true&$select=id,displayName,customSecurityAttributes&$filter=customSecurityAttributes/Marketing/AppCountry eq 'Canada'
ConsistencyLevel: eventual

Réponse

HTTP/1.1 200 OK

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#users(id,displayName,customSecurityAttributes)",
    "@odata.count": 2,
    "value": [
        {
            "id": "dbaf3778-4f81-4ea0-ac1c-502a293c12ac",
            "displayName": "Jiya",
            "customSecurityAttributes": {
                "Engineering": {
                    "@odata.type": "#microsoft.graph.customSecurityAttributeValue",
                    "Datacenter@odata.type": "#Collection(String)",
                    "Datacenter": [
                        "India"
                    ]
                },
                "Marketing": {
                    "@odata.type": "#microsoft.graph.customSecurityAttributeValue",
                    "AppCountry@odata.type": "#Collection(String)",
                    "AppCountry": [
                        "India",
                        "Canada"
                    ],
                    "EmployeeId": "KX19476"
                }
            }
        },
        {
            "id": "6bac433c-48c6-4213-a316-1428de32701b",
            "displayName": "Jana",
            "customSecurityAttributes": {
                "Marketing": {
                    "@odata.type": "#microsoft.graph.customSecurityAttributeValue",
                    "AppCountry@odata.type": "#Collection(String)",
                    "AppCountry": [
                        "Canada",
                        "Mexico"
                    ],
                    "EmployeeId": "GS46982"
                }
            }
        }
    ]
}

Exemple 14 : Répertorier tous les utilisateurs dont la gestion est restreinte

Demande

GET https://graph.microsoft.com/beta/users?$filter=isManagementRestricted eq true&$select=displayName,userPrincipalName

Réponse

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#users(displayName,userPrincipalName)",
    "value": [
        {
            "displayName": "Adele",
            "userPrincipalName": "Adele@contoso.com"
        },
        {
            "displayName": "Bob",
            "userPrincipalName": "Bob@contoso.com"
        }
    ]
}