0

J'ai un groupe appelé "Building Residents". Dans ce groupe, j'ai 2 groupes pour chaque appartement:Azure Graph API liste les utilisateurs dans les groupes enfants

- Apt1a_Renters 
- Apt1a_Owners 

- Apt2a_Renters 
- Apt2a_Owners 

etc, etc ...

Une personne peut être dans le groupe Apt2a_Owners, mais aussi dans le groupe Apt1a_Renters.

Je souhaite interroger tous les membres du groupe "Résidents de bâtiments" pour les utilisateurs, mais lorsque je fais cela, je récupère simplement les groupes qui s'y trouvent.

Existe-t-il un moyen, en utilisant une seule requête, de lister tous les résidents du bâtiment sans ramener les doublons (même personne dans apt2a_owners et apt1a_renters)?

+0

Pourriez-vous s'il vous plaît préciser votre question? Qu'avez-vous déjà essayé? Parlez-vous de l'utilisation de l'API Azure Graph REST ou d'un wrapper? –

+0

@JanKruse Ma question est la dernière phrase de mon message (se termine par un point d'interrogation). J'ai essayé d'interroger les membres du groupe "Building Residents" (tel que spécifié dans la phrase précédente). Je parle de l'API Azure Graph (comme spécifié dans le titre). – Progger

+0

Essayez-vous d'interroger l'API via REST ou utilisez-vous un wrapper comme les bibliothèques C#? Je ne comprends pas la structure de vos données que vous essayez de décrire. S'agit-il des groupes AAD, des groupes Office 365, des groupes de sécurité? Est-ce que je comprends bien: vous voulez tous les objets utilisateur AAD, qui sont membres du groupe "Building Residents"? Pourriez-vous fournir des exemples de données, vos requêtes que vous avez déjà essayées et les réponses API correspondantes? –

Répondre

2

Azure Graph REST peut uniquement obtenir les membres directs d'un groupe. Pour obtenir les utilisateurs membres récursivement, nous devons l'implémenter nous-mêmes. Voici un câblage exemple de code avec C# en utilisant la bibliothèque Azure AD graphique pour votre référence:

public void testGetMembersRecursively() 
{ 
    var accessToken=""; 
    var tenantId=""; 
    var groupName=""; 
    var client = GraphHelper.CreateGraphClient(accessToken,tenantId); 
    var group = (Group)client.Groups.ExecuteAsync().Result.CurrentPage.First(g => g.DisplayName ==groupName); 
    var groupFetcher = client.Groups.GetByObjectId(group.ObjectId); 
    List<string> users = new List<string>(); 
    GetMembersRecursively(groupFetcher, users); 
    Console.WriteLine(String.Join("\n", users.Distinct<string>().ToArray())); 
} 

public void GetMembersRecursively(Microsoft.Azure.ActiveDirectory.GraphClient.IGroupFetcher groupFetcher, List<string> users) 
{ 
    var membersResoult = groupFetcher.Members.ExecuteAsync().Result; 
    AddMember(membersResoult, users); 

    while (membersResoult.MorePagesAvailable) 
    { 
     membersResoult = membersResoult.GetNextPageAsync().Result; 
     AddMember(membersResoult, users); 
    } 
} 

public void AddMember(IPagedCollection<IDirectoryObject> membersResoult, List<string> users) 
{ 
    var members = membersResoult.CurrentPage; 

    foreach (var obj in members) 
    { 
     var _user = obj as Microsoft.Azure.ActiveDirectory.GraphClient.User; 
     if (_user != null) 
      users.Add(_user.DisplayName); 
     else 
     { 
      var groupMember = obj as Microsoft.Azure.ActiveDirectory.GraphClient.Group; 
      if (groupMember != null) 
      { 
       GetMembersRecursively(GetGroupById(groupMember.ObjectId), users); 
      } 
     } 
    } 
} 

classe GraphHelper:

class GraphHelper 
{ 
    public static ActiveDirectoryClient CreateGraphClient(string accessToken, string tenantId) 
    { 
     string graphResourceId = "https://graph.windows.net"; 

     Uri servicePointUri = new Uri(graphResourceId); 
     Uri serviceRoot = new Uri(servicePointUri, tenantId); 

     ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot, async() => await Task.FromResult(accessToken)); 

     return activeDirectoryClient; 
    }  
}