.NET Core 3.1使用Novell.Directory.Ldap无法获取全部LDAP用户
解决Novell.Directory.Ldap.NETStandard获取AD用户时的“大小限制超出”问题
问题原因
当前代码未启用LDAP分页搜索,尽管AD的MaxPageSize设为5000,但客户端未配置分页的情况下,AD会返回默认结果数量限制(通常在1000条以内,具体取决于域控配置),导致无法获取全部4000+用户,同时触发“大小限制超出”错误。
解决方案
修改代码启用LDAP分页搜索,通过LdapSearchConstraints配置分页参数:
var ldapConn = new LdapConnection { SecureSocketLayer = false }; ldapConn.Connect(domainName, 389); ldapConn.Bind(username, password); // 配置分页搜索约束,设置页大小(建议不超过AD的MaxPageSize) var searchConstraints = new LdapSearchConstraints(); searchConstraints.SetPaging(1000); // 每页获取1000条,可根据实际调整 ILdapSearchResults lsc = ldapConn.Search( "OU=myOU,DC=domain,DC=com", LdapConnection.ScopeSub, "(objectClass=person)", null, false, searchConstraints); // 传入分页约束 CSV WriteToCSV = new CSV(); while (lsc.HasMore()) { try { var nextEntry = lsc.Next(); LdapAttributeSet attributeSet = nextEntry.GetAttributeSet(); if (attributeSet.ContainsKey("sAMAccountName")) { string result = attributeSet.GetAttribute("sAMAccountName").StringValue; WriteToCSV.WriteToCsv("Persons.csv", result); // 补充原代码缺失的参数 } } catch (LdapException ex) { // 分页触发的SIZE_LIMIT_EXCEEDED属于正常机制,无需终止程序 if (ex.ResultCode != LdapException.SIZE_LIMIT_EXCEEDED) { throw; } } } // 完成后关闭连接 ldapConn.Disconnect();
关键说明
SetPaging(int pageSize):设置每页返回的条目数,建议设为小于等于AD的MaxPageSize(此处为5000),比如1000,避免单次请求数据量过大。- 异常处理:分页过程中触发的
SIZE_LIMIT_EXCEEDED异常是分页的正常触发逻辑,只需捕获后跳过,继续循环即可获取下一页数据。 - 原代码中
WriteToCSV.WriteToCsv("Persons.csv",);存在语法错误,需补充要写入的参数(如上述代码中的result)。
内容的提问来源于stack exchange,提问作者marah
相关产品推荐
相关产品推荐

