【问题标题】:Retrieve a C# List with email addresses from Active Directory从 Active Directory 中检索包含电子邮件地址的 C# 列表
【发布时间】:2012-12-17 01:39:40
【问题描述】:

我有一个包含所有 AD 用户名(超过 1,500 个)的列表,我想知道为该列表中包含的所有用户检索电子邮件地址的最佳方法是什么。

具体来说,我可以调用一个方法并为其提供用户名列表,并让该方法返回一个大小相同的列表,其中包含初始列表中提供的所有用户名的电子邮件地址。

我已经知道如何使用http://lozanotek.com/blog/articles/149.aspx 中所示的传统 LDAP 方式检索电子邮件地址,并且我知道我可以使用 Foreach,但是我正在寻找一种更有效的方式来检索超过 1,500 个电子邮件地址而无需查询AD 超过 1,500 次。

【问题讨论】:

    标签: c# asp.net list email active-directory


    【解决方案1】:

    我在下面使用过这段代码,但现在我意识到这与 Srinivas 所说的代码相同。

    DirectoryEntry entry = new DirectoryEntry("LDAP://YourDomain"); 
    DirectorySearcher dSearch = new DirectorySearcher(entry); 
    dSearch.Filter = "(objectClass=user)"; 
    foreach (SearchResult sResultSet in dSearch.FindAll()) 
    { 
        if (sResultSet.Properties["mail"].Count > 0) 
            Response.Write(sResultSet.Properties["mail"][0].ToString() + "<br/>"); 
    }
    

    【讨论】:

      【解决方案2】:

      使用链接中的方法,您不会查询 AD 1500 次,您将运行一个将所有 1500 个用户作为对象返回的查询。然后使用 foreach 循环,您将遍历每个对象以获取用户的电子邮件。

      查询 AD 1500 次的示例是,如果您有一个包含所有用户名的 ArrayList 并执行以下操作(伪代码):

      ArrayList UserNames = new ArrayList();
      Foreach(string name in UserNames)
      {
         //Query AD to get email of user by passing in name
      }
      

      加快此速度的一种方法是添加多线程并让每个线程同时处理对 AD 的不同查询。例如,您可以在查询中添加过滤器,以便它只返回以 A 开头的名称并让一个线程处理该名称,而另一个线程处理以 B 开头的名称,依此类推。这将需要对 AD 进行更多查询(26 个,字母表中的每个字母 1 个),但您可以并行处理返回的数据。

      除非您有非常旧的域控制器,否则我不会担心严重打击 AD,它就是为此而设计的。我每晚将所有 AD(用户、组、计算机和它们之间的关系)缓存到数据库中,我们有 8000 多个用户。我这样做是因为对 AD 的调用往往很慢,并且我们希望通过网页获得组成员信息,而无需用户永远等待。这种缓存每分钟会调用数千次 AD,这不会影响我公司在 3 小时运行时间内的工作流程。

      更新:
      抱歉,我快速阅读了您的问题,并错过了您正在尝试使用所有名称列表的方法。您可以使用我之前所说的多线程方法,但将每个用户名传递给不同的线程(限制线程数,使其不会失控!!)或使用一个查询来获取所有用户并检查他们是否存在于 foreach 循环中的列表中。通过使用二叉树或其他排序集合使您的列表易于遍历,查看用户是否存在应该相当快。您还可以将用户从您的列表中删除,以便更快地进行后续搜索。

      【讨论】:

        【解决方案3】:

        嘿,我也在寻找同样的东西,这对我有用:http://forums.asp.net/t/1610245.aspx/1

        【讨论】:

        • 虽然 forums.asp.net 上的代码看起来不错 - 请提供一些代码并查看 FAQ section 有关仅链接的答案
        • 感谢您的宝贵意见@PilgerstorferFranz...一定会做到的。非常感谢。
        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        相关资源
        最近更新 更多