簡體   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