【问题标题】:VB.NET DirectorySearcher PagingVB.NET DirectorySearcher 分页
【发布时间】:2012-12-17 16:04:31
【问题描述】:

我一直在寻找找出已经搜索了多少页面,以便我可以多线程搜索

示例假设 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

【问题讨论】:

    标签: vb.net active-directory


    【解决方案1】:

    我不建议尝试多线程 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 之类的操作。

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多