如何提升LDAP数据查询限制?解决超1000条记录报错问题
解决AD全量用户查询的大小限制问题
AD默认限制单次搜索请求返回最多1000条记录,这就是你遇到“The size limit was exceeded”错误的原因。要获取全量8万条用户数据,必须使用分页查询,通过PageResultRequestControl实现分批获取数据,循环直到所有记录都被拉取完成。
修改后的实现代码
// 初始化搜索请求 SearchRequest searchRequest = new SearchRequest( userStore, "(&(&(objectClass=User)(objectCategory=Person)))", SearchScope.Subtree, new string[] { "department", "manager", "mobile" }); // 添加分页控件,设置每页获取1000条(匹配AD默认单次返回上限) int pageSize = 1000; PageResultRequestControl pageControl = new PageResultRequestControl(pageSize); searchRequest.Controls.Add(pageControl); List<SearchResultEntry> allUsers = new List<SearchResultEntry>(); byte[] cookie = null; do { // 后续分页请求更新控件的cookie if (cookie != null) { pageControl.Cookie = cookie; } // 发送请求并获取响应 SearchResponse response = (SearchResponse)_connection.SendRequest(searchRequest); // 收集当前页的用户数据 foreach (SearchResultEntry entry in response.Entries) { allUsers.Add(entry); } // 提取下一页的分页cookie PageResultResponseControl responseControl = (PageResultResponseControl)response.Controls.Find(typeof(PageResultResponseControl).FullName, false); cookie = responseControl.Cookie; } while (cookie != null && cookie.Length > 0); // 无下一页cookie时终止循环 // allUsers 即为全量用户列表
关键说明
PageResultRequestControl:告知AD服务器启用分页模式,指定每页返回的记录数(建议设为1000,匹配AD默认限制)。- 分页Cookie:每次请求后从响应控件中获取cookie,下一次请求携带该cookie,AD服务器会返回后续批次的记录。
- 循环终止条件:当cookie为空或长度为0时,代表所有记录已获取完成。
额外注意事项
- 确保你的AD账户拥有读取所有目标用户数据的权限。
- 建议添加异常处理逻辑(如连接超时、权限错误),避免循环中断导致数据不完整。
- 针对8万条级别的数据,可适当添加请求间隔延迟,减轻AD服务器负载。
内容的提问来源于stack exchange,提问作者Christy Pirumova
相关产品推荐
相关产品推荐

