C# LDAP查询解决默认1000条限制
最近有个项目需要获取指定ou下的AD用户,作为一个小白,刚接触ldap查询,不知道其中的水深。以为可以使用ldap查询(如下代码)可以直接查出ou下的所有用户。
private const string domainName = "**.com";
private const string adAdmin = "administrator";
private const string password = "****";
private const string ouName = "text";//只是一个子节点名
DirectoryEntry adRoot = new DirectoryEntry("LDAP://OU=**,DC=**,DC=com", adAdmin, password, AuthenticationTypes.Secure);
DirectoryEntry ou = adRoot.Children.Find("OU=" + ouName);
DirectorySearcher mySearcher = new DirectorySearcher(ou);//想搜索出所有,此处可省参数
mySearcher.SizeLimit = 4000;//服务器返回4000用户数量
mySearcher.Filter = ("(objectClass=user)"); //user表示用户,group表示组
foreach (System.DirectoryServices.SearchResult resEnt in mySearcher.FindAll())
{
DirectoryEntry user = resEnt.GetDirectoryEntry();
if (user.Properties.Contains("sAMAccountName"))
{
var sAMAccountName = user.Properties["sAMAccountName"][0].ToString();
Console.WriteLine(sAMAccountName);
}
}
后续测试时发现上面的方式只能查询1000个用户信息,再网上找解决方式时,发现了微软的ldap官文:
MaxPageSize -此值控制的最大独立的每个返回的对象的大小对单个搜索结果中返回的对象数。要执行的搜索的结果可能超过此数目的对象,客户端必须指定分页的搜索控件。这是在不大于MaxPageSize值的组中返回的结果进行分组。总之, MaxPageSize控制在单个搜索结果中返回的对象的数目。 默认值: 1000
可查询:https://support.microsoft.com/zh-cn/help/315071/how-to-view-and-set-ldap-policy-in-active-directory-by-using-ntdsutil
然后在官网中找到了两个解决方式
1.分页查询 可以不受ldap查询上限的限制
采用分页查询可以解决
private const string adAdmin = "administrator";
private const string password = "****";
var adPath = "LDAP://OU=text,OU=**,DC=***,DC=com";
DirectoryEntry entry = new DirectoryEntry(adPath, adAdmin, password, AuthenticationTypes.Secure);
DirectorySearcher directorySearch = new DirectorySearcher(entry);
directorySearch.Filter = "(&(objectClass=user))";
directorySearch.Sort.PropertyName = "cn";
directorySearch.SearchScope = SearchScope.Subtree;
directorySearch.PageSize = 5000;//查询的数量
SearchResultCollection results = directorySearch.FindAll();
foreach (System.DirectoryServices.SearchResult resEnt in results)
{
DirectoryEntry user = resEnt.GetDirectoryEntry();
if (user.Properties.Contains("sAMAccountName"))
{
var sAMAccountName = user.Properties["sAMAccountName"][0].ToString();
Console.WriteLine(sAMAccountName);
}
}
已经测试OK,采用分页的方式是可以的。
2.修改AD域LDAP查询上限
注意:修改Ldap查询上限,会影响ad域,占据域环境宽带
操作步骤:
1.开始–运行–输入"ntdsutil" //回车
2.输入"ldap policies" //回车
3.输入"connections" //回车
4.输入"connect to domain 域名"
5.提出连接成功后,输入"quit" //回车
6. 输入"show values" //回车
以上步骤是用于connect域控的,连接成功后,可以显示内容
maxpagesize为连接数最大信息,默认为1000(图中是测试时修改为4000)
7.输入"set maxpagesize to 3000" //改最大连接数为
8.再次输入"show values" //确认最大返回数
9.输入"commit changes" //确认修改
10.再次确认"show values" //进行确认最大返回数
11.输入"quit"
12.输入"quit"
操作完成,此时导入与读取AD用户数限制为3000