Anil Jain
Anil Jain

Reputation: 85

Get all users in .NET Azure Active Directory groups recursively

I am struggling to get all users in .NET Azure Active Directory groups recursively. I googled out but all articles are on users memberof groups for Azure Active Directory.

Any help would be highly appreciated.

Thanks

Anil Jain

Upvotes: 0

Views: 1397

Answers (1)

Fei Xue
Fei Xue

Reputation: 14649

Based on my understanding, to retrieve the members from group recursively, we only need to detect the type of member. If the member is group we can request the members again.

I also wrote a demo using Azure AD graph client for your reference:

public void testPrintMembersRecursively()
{
    var client = GraphHelper.CreateGraphClient();
    var group = (Group)client.Groups.ExecuteAsync().Result.CurrentPage.First(g => g.DisplayName == "group4");
    var groupFetcher = client.Groups.GetByObjectId(group.ObjectId);

   PrintMembersRecursively(groupFetcher, 0);
}

public void PrintMembersRecursively(Microsoft.Azure.ActiveDirectory.GraphClient.IGroupFetcher groupFetcher, int level)
{
    var membersResoult = groupFetcher.Members.ExecuteAsync().Result;
    Print(level, membersResoult);

    while (membersResoult.MorePagesAvailable)
    {
        membersResoult=membersResoult.GetNextPageAsync().Result;
        Print(level,membersResoult);
    }
}

private void Print(int level, IPagedCollection<IDirectoryObject> membersResoult)
{
    var members = membersResoult.CurrentPage;

    foreach (var obj in members)
    {
        var user = obj as Microsoft.Azure.ActiveDirectory.GraphClient.User;
        if (user != null)
            Console.WriteLine(String.Format("{0," + level * 8 + "}", user.DisplayName));
        else
        {
            var groupMember = obj as Microsoft.Azure.ActiveDirectory.GraphClient.Group;
            if (groupMember != null)
            {
                Console.WriteLine(String.Format("{0," + level * 8 + "}", groupMember.DisplayName));
                    PrintMembersRecursively(GetGroupById(groupMember.ObjectId), level + 1);
            }
        }
    }
}


public static ActiveDirectoryClient CreateGraphClient()
{
    string accessToken = "";
    string tenantId = "xxx.onmicrosoft.com"; 
    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;
}

Upvotes: 2

Related Questions