我正在尝试从Active Directory中提取每个用户。我目前正在使用这种方法:
DirectorySearcher search = new DirectorySearcher();
search.Filter = "(objectClass=user)";
foreach (SearchResult result in search.FindAll())
{
if(result.Properties["mail"].Count > 0 && result.Properties["displayName"].Count > 0)
{
emailAddresses.Add(new EmailDetails
{
EmailAddress = result.Properties["mail"][0].ToString(),
EmailDisplayName = result.Properties["displayName"][0].ToString()
});
}
}
这只是我想要的3/4个名字。这是让一个人离开我....所以我很好奇,并添加了一个新的过滤器,看看我是否可以通过更改过滤器来拉自己:
search.Filter = "(&(objectClass=user)(sn=za*))";
事实上这确实让我了解了,我基本上是强迫它通过设置过滤器来搜索以za
开头的每个姓氏来吸引我。但是为什么我使用的第一个搜索过滤器没有拉动所有用户?
答案 0 :(得分:1)
为什么我使用的第一个搜索过滤器没有拉动所有用户?
最有可能因为SizeLimit在1000条记录中开始。设置PageSize以启用结果分页。
在没有过滤器的情况下执行.FindAll()
,然后在客户端上过滤结果是愚蠢的。写一个合适的过滤器。
var search = new DirectorySearcher();
search.Filter = "(&(objectClass=user)(mail=*)(displayName=*))";
search.PageSize = 1000; // see 1.
using (var results = searcher.FindAll()) { // see 2.
foreach (var result in results)
{
emailAddresses.Add(new EmailDetails
{
EmailAddress = result.Properties["mail"][0].ToString(),
EmailDisplayName = result.Properties["displayName"][0].ToString()
});
}
}
SearchResultCollection
,请参阅"备注"在the MSDN documentation of DirectorySearcher.FindAll()
。 using
块将正确配置对象。