C# LDAP搜索返回的对象少于预期
我正在尝试从Active Directory中提取每个用户。我目前正在使用此方法:C# LDAP搜索返回的对象少于预期,c#,active-directory,ldap,ldap-query,C#,Active Directory,Ldap,Ldap Query,我正在尝试从Active Directory中提取每个用户。我目前正在使用此方法: DirectorySearcher search = new DirectorySearcher(); search.Filter = "(objectClass=user)"; foreach (SearchResult result in search.FindAll()) { if(result.
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
开头的每个姓氏来迫使它拉我进来。但是为什么我使用的第一个搜索过滤器并没有吸引所有的用户呢
为什么我使用的第一个搜索过滤器没有把所有用户都拉进来
最有可能是因为有1000条记录。设置以启用结果分页
在没有过滤器的情况下执行.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
,请参阅中的“备注”。使用块的将正确处理对象
它返回了多少用户?你说的是3/4,但它是否返回一个精确的数字,比如100、500、1000等等。?返回的结果可能有服务器端限制。另外,由于您只查找具有
mail
和displayName
的用户,为什么不首先将这些用户添加到ldap筛选器中?效率更高。它返回644,据我所知,服务器端限制为1000。谢谢。这完全有道理,解释得很好。