LDAP搜索返回的对象少于预期
本文关键字:于预期 对象 搜索 返回 LDAP | 更新日期: 2023-09-27 18:26:59
我正试图从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()
});
}
}
这只给了我大约四分之三的名字,我期待。这是为了把我排除在外。。。。所以我很好奇,添加了一个新的过滤器,看看我是否可以通过将过滤器改为来吸引自己
search.Filter = "(&(objectClass=user)(sn=za*))";
事实上,这确实正确地吸引了我,我基本上是通过设置过滤器来搜索以za
开头的每个姓氏来迫使它吸引我。但是,为什么我使用的第一个搜索过滤器没有吸引所有用户?
为什么我使用的第一个搜索过滤器没有把所有用户都拉进来?
很可能是因为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
,请参阅DirectorySearcher.FindAll()
的MSDN文档中的"备注"。using
块将正确处理对象