繁体   English   中英

从DirectorySearcher获取2000条记录中的2000条

[英]Get 2000 of 6000 records from DirectorySearcher

我有一个代码,使用DirectorySearcher获得1000或所有结果。

但是我想要获得6000个结果中的2000个。

这是获得6000结果的代码,而我只想要2000

mySearcher.SizeLimit = 2000;
mySearcher.PageSize = 1000;

SearchResultCollection results = mySearcher.FindAll();

int totalUsers = results.Count;

请帮忙。

谢谢

我的研究表明,PageSize = 0仅提供1000个结果,Pagesize = 1000给出所有结果。

需要更多帮助才能完成这项工作。

使用PageSize属性似乎有一些奇怪的行为
请将其设置为0 ,这有用吗?

顺便说说:
c #Active Directory服务findAll()仅返回1000个条目

我可以从Asp.Net中的DirectorySearcher获取超过1000条记录吗?

根据这篇文章: DirectorySearcher.FindAll() - 应该有PageSize = 1000

在这种情况下SizeLimit无关紧要因为正在使用服务器端默认值,默认为1000个结果。 我从来不需要这样的页面,但我想使用了最小大小限制(在您的大小限制和服务器大小限制之间 - 只在我自己的AD中测试它)。 你的PageSize确实是分页,但是它在后台进行分页,只返回最后一个流,因为我理解这就是你得到所有结果的原因。

我相信你最简单的解决办法就是在这个问题上使用Linq,并在结果上做一个.Take(2000) 这将以您在服务器上的额外带宽和处理成本为您获得所需的结果。

如果你真的想要对它进行排序,我想你必须更新服务器默认的分页大小更高(尽管我怀疑这是出于管理原因这是可行的)。

编辑:

下面是我大致如何粗略地对待这个问题(来自我的LinqPad的快速工作示例代码 - 还注意到我实际上带来的一切都不像你想要通过取出等式的for循环来做到这一点):

using(DirectoryEntry de = new DirectoryEntry("LDAP://domain.local/dc=domain,dc=local", "user", "password"))
using(DirectorySearcher ds = new DirectorySearcher(de))
{
    ds.Filter="(&(objectCategory=user)(objectClass=user))";
    ds.PageSize= 1000;
    ds.PropertiesToLoad.Clear();
    ds.PropertiesToLoad.Add("objectGuid");

    var results = ds.FindAll();
    var searchResults = results.Cast<System.DirectoryServices.SearchResult>().ToArray();
    int myDesiredPageSize = 2000;

    var upns = new StringCollection();

    for(var step=0; step < Math.Ceiling((double)results.Count / myDesiredPageSize); step++)
    {
        Parallel.ForEach(searchResults.Skip(step*myDesiredPageSize).Take(myDesiredPageSize), result => {
        using(var entry = result.GetDirectoryEntry())
        {
            entry.RefreshCache(new[]{ "userPrincipalName" });

            if(entry.Properties.Contains("userPrincipalName"))
                upns.Add(entry.Properties["userPrincipalName"][0] as string);
        }
        });
    }

    upns.Count.Dump();
}

在我的测试场景中,我的局域网连接在大约3秒内返回大约1400个结果。 由于我们并行查询,因此较高的数字不应线性扩展。 此外,您可能希望在某种程度上包含并行化,因为这将无情地锤击AD :)

在我的正常操作中,我使用AD对象的WhenChanged属性进行缓存,以将我的实际查询减少到仅更改的对象,而不是一遍又一遍地加载相同的东西,这只是第一次触及,后续结果只有几分之一秒。 采用这种方法,您可以完全取消分页,只需在启动时加载属性,然后只选择已更改的条目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM