KanyeBest
KanyeBest

Reputation: 33

C# Active Directory calls very slow

I have an application that needs to have a list of names and email addresses of users in a specific security group. I am currently doing this with the code below. When I run on VPN it comes back right away within a second or two usually but when I run on either on ethernet or wireless (both on the domain), it takes about 40 seconds for this to come back. Is there any way I can improve the time of this method on ethernet or wireless?

        ...
        DirectoryEntry entry = new DirectoryEntry(ldap);
        DirectorySearcher mySearcher = new DirectorySearcher(entry);
        mySearcher.Filter = "(&(objectCategory=group)(objectClass=group)(groupType:1.2.840.113556.1.4.803:=2147483648))";
        mySearcher.PropertiesToLoad.Add("member");

        SearchResultCollection results = mySearcher.FindAll();
        foreach (SearchResult result in results)
        {
            foreach (string distinguishedMember in result.Properties["member"])
            {
                string memberPath = "LDAP://" + distinguishedMember;
                DirectoryEntry member = new DirectoryEntry(memberPath);
                DirectorySearcher Searcher = new DirectorySearcher(member);
                Searcher.Filter = "(&(objectCategory=user))";
                Searcher.PropertiesToLoad.Add("mail");
                Searcher.PropertiesToLoad.Add("name");
                SearchResult memberFound = Searcher.FindOne();

                if (memberFound != null)
                {
                    String memberEmail = memberFound.Properties["mail"][0].ToString();
                    String memberName = memberFound.Properties["name"][0].ToString();
                    users.Add(new KeyValuePair<String, String>(memberName, memberEmail));
                }
            }
        }

Upvotes: 3

Views: 2190

Answers (2)

nikhil
nikhil

Reputation: 51

Do not fetch all members at one time. Instead, I recommend using the pagesize property of the DirectorySearcher class:

mySearcher.PageSize = 10;

Upvotes: 0

Jerry Federspiel
Jerry Federspiel

Reputation: 1524

Maybe it would help to get all of the users in one go, instead of fetching them one by one*:

Searcher.Filter = "(&(objectCategory=user)(memberOf=" + myGroupsDistinguishedName + "))"
Searcher.PropertiesToLoad.Add("mail");
Searcher.PropertiesToLoad.Add("name");
var allMembers = Searcher.FindAll();
var users = allMembers.Cast<SearchResult>().ToDictionary(sr=>sr.Properties["name"].ToString(), sr=>sr.Properties["mail"].ToString());

*This doesn't handle scenarios with over 1000 users.

Upvotes: 1

Related Questions