C# Active Directory 调用非常慢

标签 c# performance active-directory directoryservices

我有一个应用程序需要包含特定安全组中用户的姓名和电子邮件地址列表。我目前正在使用下面的代码执行此操作。当我在 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));
                }
            }
        }

最佳答案

也许一次性获取所有用户而不是一个一个地获取它们会有所帮助*:

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 个用户的场景。

关于C# Active Directory 调用非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25189602/

相关文章:

c# - 根据 ASP .NET 中的某个时间表做某事

c# - ASP.Net Core `cookies authentication` 在哪里存储对该 cookie 的引用?

c# - 如何创建最小化的持续通知,如 USB 连接或谷歌天气

c# - 使用用户输入在 Active Directory 中搜索计算机名称

Powershell交换模块远程邮箱问题

c# - 使用 LINQ 修剪 List<string[]> 中所有字符串的最简单方法?

mysql - 处理大量数据的批量插入

python - 在递归函数中将巨大的列表作为参数传递时的性能?

performance - 为什么在 Matlab 中 .* 运算符在某些情况下比 * 对于标量更快?

powershell - 检查用户是否存在于组中