Obter membros de um grupo do Active Directory recursivamente, ou seja, incluindo subgrupos

Dado um grupo como este no Active Directory:

MainGroup
  GroupA
    User1
    User2
  GroupB
    User3
  User4

Posso determinar facilmente se o Usuário3 é membro do MainGroup ou de qualquer um de seus subgrupos com código como este:

using System;
using System.DirectoryServices;

static class Program {
    static void Main() {
        DirectoryEntry user = new DirectoryEntry("LDAP://CN=User3,DC=X,DC=y");
        string filter = "(memberOf:1.2.840.113556.1.4.1941:=CN=MainGroup,DC=X,DC=y");
        DirectorySearcher searcher = new DirectorySearcher(user, filter);
        searcher.SearchScope = SearchScope.Subtree;
        var r = searcher.FindOne();
        bool isMember = (r != null);
    }
}

Gostaria de saber se existe uma maneira semelhante de obter todos os usuários que são membros de um grupo ou qualquer um de seus subgrupos, ou seja, no exemplo do MainGroup, obter Usuário1, Usuário2, Usuário3 e Usuário4.

A maneira óbvia de conseguir todos os usuários é consultar recursivamente cada subgrupo, mas eu queria saber se existe uma maneira mais fácil.

Usando a mesma abordagem com omemberOf:1.2.840.113556.1.4.1941: filtro, mas não é possível usar a raiz do domínio em vez do usuário como base de pesquisa, pois a consulta leva muito tempo (provavelmente calcula todas as associações do grupo recursivamente para todos os usuários no domínio e verifica se eles são membros do grupo especificado )

Qual é a melhor maneira de obter todos os membros de um grupo, incluindo seus subgrupos?

questionAnswers(2)

yourAnswerToTheQuestion