我有一个包含所有AD用户名(超过1,500)的列表,我想知道检索该列表中包含的所有用户的电子邮件地址的最佳方法。
具体来说,我可以调用一个方法并为其提供一个用户名列表,并让该方法返回一个相同大小的列表,其中包含初始列表中提供的所有用户名的电子邮件地址。
我已经知道如何使用传统的LDAP方式检索电子邮件地址,如http://lozanotek.com/blog/articles/149.aspx所示,我知道我可以使用Foreach,但我正在寻找一种更有效的方法来检索超过1,500个电子邮件地址没有查询AD超过1500次。
答案 0 :(得分:2)
嘿我正在寻找同样的东西,这对我有用:http://forums.asp.net/t/1610245.aspx/1
答案 1 :(得分:0)
使用链接中的方法,您不会查询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循环中的列表中。通过使用二叉树或其他已排序的集合轻松遍历列表,查看用户是否存在应该相当快。您还可以从列表中删除用户,以便更快地进行后续搜索。
答案 2 :(得分:0)
我在下面使用过这段代码,但现在我意识到这与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/>");
}