如何通过Novell.Directory.Ldap.NETStandard从AD获取超1000条结果
解决Novell.Directory.Ldap.NETStandard获取AD超过1000条结果的问题
嘿,这个AD的1000条结果限制确实挺闹心的!我之前用Novell的LDAP库也碰到过一模一样的问题,其实只要开启分页搜索就能搞定——AD的这个限制本质上是强制要求用分页来获取大量结果,避免一次性返回数据过多导致性能问题。
原理说明
AD默认会限制单次搜索的结果数量(通常是1000条),Novell的LDAP库支持通过设置PagingSize属性启用分页搜索,启用后库会自动帮你分批次请求结果,直到获取所有符合条件的数据。
修改你的代码
你只需要在LdapSearchConstraints里添加PagingSize配置即可,建议设置为1000(刚好匹配AD的默认限制,也可以根据需求设更小的值比如500)。修改后的完整代码如下:
// 关键修改:添加PagingSize属性启用分页,MaxResults设为0表示获取所有结果 LdapSearchConstraints constraints = new LdapSearchConstraints { MaxResults = 0, PagingSize = 1000 // 每页获取1000条,和AD默认限制对齐 }; LdapSearchQueue queue = connection.Search( "<your base entry>", LdapConnection.SCOPE_SUB, "<your filter>", attr, false, null, constraints ); LdapMessage message; while ((message = queue.getResponse()) != null) { if (message is LdapSearchResult searchResult) { LdapEntry entry = searchResult.Entry; LdapAttributeSet attributeSet = entry.getAttributeSet(); var samAccountNameAttr = attributeSet.getAttribute("sAMAccountName"); // 增加空值判断,避免部分AD对象无该属性导致报错 if (samAccountNameAttr != null) { list.Add(samAccountNameAttr.StringValue); } } // 无需额外处理分页引用消息,库会自动完成后续分页请求 }
额外注意事项
- PagingSize取值建议:不要超过AD服务器设置的最大分页大小(默认1000),如果设得更大,AD会自动截断为它允许的最大值。
- 权限检查:确保你的LDAP连接账号有执行分页搜索的权限(普通用户一般默认拥有该权限,受限账号需要额外确认)。
- 空属性防护:代码里加了属性空值判断,避免部分AD对象(比如计算机账号、组账号)没有
sAMAccountName属性导致空引用异常。
这样修改后,你的代码就能突破1000条的限制,获取到所有符合搜索条件的AD对象啦!
内容的提问来源于stack exchange,提问作者Денис Бабушкин
相关产品推荐
相关产品推荐

