【问题标题】:C# Active Directory calls very slowC# Active Directory 调用非常慢
【发布时间】:2014-08-07 18:29:32
【问题描述】:

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

【问题讨论】:

    标签: c# performance active-directory directoryservices


    【解决方案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 个用户的场景。

    【讨论】:

      【解决方案2】:

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

      mySearcher.PageSize = 10;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2011-12-15
        • 2016-12-31
        • 2023-03-29
        • 2015-04-02
        • 2015-08-28
        • 1970-01-01
        相关资源
        最近更新 更多