Active Directory: ajuste o desempenho da função para recuperar membros do grupo

Esta postagem é uma continuação do seguinte:

Active Directory: lista de membros DirectoryEntry <> GroupPrincipal.GetMembers ()

Eu tenho uma função que recupera o atributo distinguishedName para todos os membros de um grupo no Active Directory. Essa função é usada em um script muito grande que recupera todos os objetos de usuário e grupo (o tempo total de execução é de 7 a 10 minutos). Meu problema aqui é que a pesquisa SSIS a jusante no distinguishedName é extremamente lenta. Isso não é surpreendente devido ao fato de estar pesquisando um varchar (255) versus UniqueIdentifier (16 bytes). Eu poderia fazer um SQL Select na fonte e depois Mesclar Join, o que aceleraria as coisas. Mas estou percebendo uma condição de corrida em potencial (veja o tempo de execução acima) no extrato em que os membros do grupo existem sem um Nome distinto correspondente. Se for esse o caso, preciso resolver isso; no entanto, uma junção de mesclagem não falhará no carregamento, enquanto uma pesquisa pode ser configurada para falhar no carregamento.

Então, eu preciso obter o guid on-the-fly através do distinguishedName. No entanto, quando tento usar o método abaixo, o desempenho da função GetGroupMemberList cai substancialmente. Existe uma maneira melhor / mais rápida de obter o guia do membro do grupo por meio do distinguishedName?

Método (para ambos os loops):

listGroupMemberGuid.Add(new DirectoryEntry("LDAP://" + member, null, null, AuthenticationTypes.Secure).Guid);

listGroupMemberGuid.Add(new DirectoryEntry("LDAP://" + user, null, null, AuthenticationTypes.Secure).Guid);

Função:

private List<string> GetGroupMemberList(string strPropertyValue, string strActiveDirectoryHost, int intActiveDirectoryPageSize)
{
    // Variable declaration(s).
    List<string> listGroupMemberDn = new List<string>();
    string strPath = strActiveDirectoryHost + "/<GUID=" + strPropertyValue + ">";
    const int intIncrement = 1500; // https://msdn.microsoft.com/en-us/library/windows/desktop/ms676302(v=vs.85).aspx

    var members = new List<string>();

    // The count result returns 350.
    var group = new DirectoryEntry(strPath, null, null, AuthenticationTypes.Secure);
    //var group = new DirectoryEntry($"LDAP://{"EnterYourDomainHere"}/<GUID={strPropertyValue}>", null, null, AuthenticationTypes.Secure);

    while (true)
    {
        var memberDns = group.Properties["member"];
        foreach (var member in memberDns)
        {
            members.Add(member.ToString());
        }

        if (memberDns.Count < intIncrement) break;

        group.RefreshCache(new[] { $"member;range={members.Count}-*" });
    }

    //Find users that have this group as a primary group
    var secId = new SecurityIdentifier(group.Properties["objectSid"][0] as byte[], 0);

    /* Find The RID (sure exists a best method)
     */
    var reg = new Regex(@"^S.*-(\d+)$");
    var match = reg.Match(secId.Value);
    var rid = match.Groups[1].Value;

    /* Directory Search for users that has a particular primary group
     */
    var dsLookForUsers =
        new DirectorySearcher {
            Filter = string.Format("(primaryGroupID={0})", rid),
            SearchScope = SearchScope.Subtree,
            PageSize = 1000,
            SearchRoot = new DirectoryEntry(strActiveDirectoryHost)
    };
    dsLookForUsers.PropertiesToLoad.Add("distinguishedName");

    var srcUsers = dsLookForUsers.FindAll();

    foreach (SearchResult user in srcUsers)
    {
        members.Add(user.Properties["distinguishedName"][0].ToString());
    }
    return members;
}

Atualização 1:

Código para recuperar o DN no foreach (searchResult):

foreach (SearchResult searchResult in searchResultCollection)
{
    string strDn = searchResult.Properties["distinguishedName"][0].ToString();
    var de = new DirectoryEntry("LDAP://" + strDn, null, null, AuthenticationTypes.Secure);
    de.RefreshCache(new[] { "objectGuid" });
    var guid = new Guid((byte[])de.Properties["objectGuid"].Value);
}

questionAnswers(1)

yourAnswerToTheQuestion