Ton*_*nyP 5 c# active-directory
我正在使用ADS Directory搜索器findAll()方法搜索现有登录(如下面的代码所示).似乎findall方法只返回1000个条目,尽管有更多的条目.如何查找每次登录的所有()?
IList<string> adslist = new List<string>();
using (DirectoryEntry de = new DirectoryEntry("LDAP://armlink.com", null, null, AuthenticationTypes.Secure))
using (DirectorySearcher ds = new DirectorySearcher(de, "(objectclass=user)", new string[] { "samaccountname" }))
foreach (SearchResult sr in ds.FindAll())
{
string[] e = sr.Path.Split(new string[] { "LDAP://", "OU=", ",", "DC=", ".com", "/CN=" }, StringSplitOptions.RemoveEmptyEntries);
ResultPropertyCollection pc = sr.Properties;
adslist.Add(e[0] + "/" + pc["samaccountname"][0].ToString());
// Debug.WriteLine(adslist.Last());
}
Run Code Online (Sandbox Code Playgroud)
mar*_*c_s 15
有两种解决此限制的方法 - 有关详细信息,请参阅DirectorySearcher上的MSDN文档:
将DirectorySearcher.SizeLimit属性设置为您需要的某个值 - 这将在单个搜索中返回给定数量的条目; 但是,您不能在单个操作中获得超过服务器限制(默认值:1'000个条目) - 但是,该服务器限制是可配置选项 - 您可以将其设置得更高,然后将目录搜索者的大小限制设置得更高 - 但是您想要一次返回的条目越多,您的通话时间就越长!
设置DirectorySearcher.PageSize为某个值,例如250左右,进行"分页搜索",例如,您在一次操作中返回250个条目,如果您迭代到第251个条目,则目录搜索器返回(在第二个,第三个,第四个电话)获得另外250个条目.这通常是更好的选择,因为您可以快速返回该数量的条目,但您可以根据需要继续搜索更多条目
处理需要超过1000个条目的情况的首选方法绝对是分页搜索 - 请参阅MSDN文档:
在服务器找到由PageSize属性指定的对象数之后,它将停止搜索并将结果返回给客户端.当客户端请求更多数据时,服务器将重新启动它停止的搜索.
Jon*_*eet 12
这是由服务器端限制造成的.从DirectorySearcher.SizeLimit文档:
服务器在搜索中返回的最大对象数.默认值为零,这意味着使用服务器确定的1000个条目的默认大小限制.
和:
如果将SizeLimit设置为大于服务器确定的默认值1000条目的值,则使用服务器确定的默认值.
基本上,从这看起来,除非有一种方法可以改变服务器端的默认值,否则你将被限制为1000个条目.有可能指定一个PageSize会让你一次获取一个特定的数字,总数大于1000 ......不确定.
顺便说一句,看起来你应该有一个using指令SearchResultCollection:
using (SearchResultCollection results = ds.FindAll())
{
foreach (SearchResult sr in results)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26283 次 |
| 最近记录: |