Список пользователей Azure Graph API в дочерних группах

У меня есть группа под названием «Жители строительства». В этой группе у меня есть по 2 группы на каждую квартиру:

- Apt1a_Renters
- Apt1a_Owners

- Apt2a_Renters
- Apt2a_Owners

и т. д. и т. д.

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

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

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


person Progger    schedule 17.01.2017    source источник
comment
Не могли бы вы сформулировать свой вопрос? Что вы уже пробовали? Вы говорите об использовании REST API Azure Graph или какой-либо оболочки?   -  person Jan Kruse    schedule 17.01.2017
comment
@JanKruse Мой вопрос - последнее предложение моего поста (заканчивается вопросительным знаком). Я попытался опросить членов группы «Жители зданий» (как указано в предложении перед этим). Я говорю об API Azure Graph (как указано в заголовке).   -  person Progger    schedule 17.01.2017
comment
Вы пытаетесь запросить API через REST или используете оболочку, такую ​​как библиотеки C #? Я не понимаю структуру ваших данных, которые вы пытаетесь описать. Это о группах AAD, Office 365, группах безопасности? Правильно ли я понимаю: вам нужны все пользовательские объекты AAD, входящие в группу Building Residents? Не могли бы вы предоставить образцы данных, свои запросы, которые вы уже пробовали, и соответствующие ответы API?   -  person Jan Kruse    schedule 17.01.2017
comment
@JanKruse - я пока не использую ни обертки, ни библиотеки. Прямо сейчас я просто использую graphexplorer и почтальон (оставьте api напрямую). Когда я запрашиваю членов группы Building Residents, например: graph.windows.net {my_ord} / groups / {obj_id} / $ links / members? api-version = 1.6, он возвращает идентификаторы объектов группы, а не идентификаторы участников. Затем мне нужно войти в каждую группу и запросить эту группу. Я просто хочу, чтобы все пользователи, перечисленные во всех дочерних группах, не запрашивали группу верхнего уровня. Не знаю, возможно ли это.   -  person Progger    schedule 17.01.2017
comment
Теперь я понимаю :-) Я не думаю, что REST API достаточно мощный, чтобы выполнять эту работу. Но, используя оболочку C # и LINQ, должно быть очень легко поместить это в одну строку кода - при условии, что вы собираетесь использовать C # - но, тем не менее, это приведет к отправке нескольких запросов в API ...   -  person Jan Kruse    schedule 17.01.2017


Ответы (1)


REST Azure Graph может получить прямых участников только из одной группы. Чтобы рекурсивно получать пользователей-участников, нам нужно реализовать это самостоятельно. Вот пример кода для подключения к 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;
    }    
}
person Fei Xue - MSFT    schedule 18.01.2017