我一直在寻找找出已经搜索了多少页面,所以我可以多线程搜索
示例假设Active Directory有5000台计算机。 Active Directory只返回1000台计算机查询。 以下代码将返回5页的1000个结果。我如何计算出DirectorySearcher需要做多少页才能获得所有结果?
谢谢
Dim Searcher As DirectorySearcher = New DirectorySearcher("(objectClass=computer)")
Searcher.PageSize = Integer.MaxValue
Searcher.SizeLimit = Integer.MaxValue
Dim Result As SearchResultCollection = Searcher.FindAll()
For Each i As SearchResult In Result
//some code
Next
答案 0 :(得分:2)
我不建议尝试多线程LDAP查询。个人搜索是独立的。假设你有两个线程,第一个请求第一个2500,第二个得到其余的。注意如果第一个线程进行查询会发生什么,并且在第二个线程进行查询之前会删除其中一个计算机。第2501台计算机刚好在第一个线程的范围之外,然后就在第二个线程的范围之外。您在查询中找不到此计算机。
我将假设您想要多线程,因为FindAll方法需要太长时间。通过将PageSize设置为Integer.MaxValue,您强制DC在发送结果之前处理整个查询。如果希望FindAll更快地返回,请设置较小的页面大小。只要您设置页面大小,DirectorySearcher就会抽象出它必须要求服务器获得更多结果的事实(否则它只会返回前1000个结果)。另一件需要注意的是prior to Server 2008, the objectClass attribute wasn't indexed。
最后,如果您确实想要在多个线程之间分发页面,请使用System.DirectoryServices.Protocols namespace。它的级别低于System.DirectoryServices,因此您可以执行asynchronous searches and ask for the pages yourself之类的操作。