C#调用Active Directory非常缓慢

3

我有一个应用程序需要列出特定安全组中用户的姓名和电子邮件地址。我目前使用以下代码来实现此功能。当我在VPN上运行时,通常会立即返回结果,大约需要一两秒钟,但是当我在以太网或无线网络(都在域内)上运行时,需要大约40秒才能返回结果。是否有任何方法可以改善以太网或无线网络上该方法的响应时间?

        ...
        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));
                }
            }
        }
2个回答

1
也许一次性获取所有用户会更有帮助,而不是一个一个地获取。
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());

*这无法处理超过1000个用户的情况。


0

不要一次获取所有成员。相反,我建议使用DirectorySearcher类的pagesize属性:

mySearcher.PageSize = 10;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接