0

У меня есть группа под названием «Building Residents». В этой группе у меня есть 2 группы для каждой квартиры:API-интерфейс Azure Graph перечисляет пользователей в дочерних группах

- Apt1a_Renters 
- Apt1a_Owners 

- Apt2a_Renters 
- Apt2a_Owners 

и т.д., и т.д ...

Человек может быть в группе Apt2a_Owners, но и в группе Apt1a_Renters.

Я хочу запросить всех пользователей группы «Резиденты» для пользователей, но когда я это сделаю, я просто возвращаю группы внутри него.

Есть ли способ, используя один запрос, перечислить всех жителей здания, не возвращая дубликатов (тот же человек в apt2a_owners и apt1a_renters)?

+0

Не могли бы вы уточнить ваш вопрос? Что вы уже пробовали? Вы говорите об использовании Azure Graph REST API или любой оболочки? –

+0

@JanKruse Мой вопрос - последнее предложение моего сообщения (заканчивается знаком вопроса). Я попробовал опросить членов группы «Жители зданий» (как указано в предложении до этого). Я говорю о API Azure Graph (как указано в названии). – Progger

+0

Вы пытаетесь запросить API через REST или используете оболочку, такую ​​как библиотеки C#? Я не понимаю структуру ваших данных, которые вы пытаетесь описать. Это касается групп AAD, групп Office 365, групп безопасности? Правильно ли я понимаю: вы хотите, чтобы все пользовательские объекты AAD, входящие в группу «Building Residents»? Не могли бы вы предоставить образцы данных, ваши запросы, которые вы уже пробовали, и соответствующие ответы API? –

ответ

2

Azure Graph REST может получать только прямые члены из одной группы. Чтобы рекурсивно получить пользователей-участников, мы должны реализовать их сами. Вот пример кода проводки с C#, используя библиотеку Azure AD Graph для справки:

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); 
      } 
     } 
    } 
} 

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; 
    }  
}