[英]C# - query large number of AD users / a device attached to the system is no longer functioning
我正在為大約 10,000 個用戶檢索一些 LDAP(Active Directory)屬性。 我知道 AD 查詢不是世界上最快的,但在 19 分鍾標記處(幾乎完全相同)程序停止處理,大約 15 分鍾后我收到錯誤
連接到系統的設備不再運行
在DirectorySearcher.FindOne()
方法上。
我不認為我在代碼中做任何奇怪的事情,但我想知道是否需要將其重新寫入FindAll()
,然后解析該列表。
searcher.Filter = "(sAMAccountName=" + u.LogonName + ")";
string[] properties = new string[]
{
"givenName",
"sn",
"displayName",
"mail",
"physicalDeliveryOfficeName",
"division",
"grpDivision"
};
searcher.PropertiesToLoad.AddRange(properties);
SearchResult result = searcher.FindOne();
它不會每次都停在同一個用戶身上,它確實停在我已經檢查過他們的屬性是否有任何突出的地方並且找不到任何不尋常的地方。
正如您可以想象的那樣,以 35 分鍾為增量進行調試會變得非常乏味,所以我希望有人以前見過這個或知道一些隱藏的 Active Directory 連接時間限制。
謝謝!
讓我們以最大的塊獲得您的結果。 一次獲得一個結果非常慢。 除非您調整了 DC 的設置,否則您無法一次獲得所有 10,000 名成員; 默認設置是一次最多返回 1000 個結果。 因此,我們將使用 * 運算符進行 26 次查詢,對 sAMAccountName 可能以開頭的每個字母進行一次查詢。
public static IEnumerable<SearchResult> DirectMembers(string nameOfMyBigGroup)
{
var namePrefixes = "abcdefghijklmnopqrstuvwxyz".Select(c=>c.ToString());
foreach(var namePrefix in namePrefixes)
{
searcher.Filter = "(&(sAMAccountName=" + namePrefix + "*)(memberOf=" + nameOfMyBigGroup + "))";
string[] properties = new string[]
{
"givenName",
"sn",
"displayName",
"mail",
"physicalDeliveryOfficeName",
"division",
"grpDivision"
};
searcher.PropertiesToLoad.AddRange(properties);
var results = searcher.FindAll();
foreach (var result in results) yield return result;
}
}
編輯:這假設您的域設置為 sAMAccountName 不區分大小寫,並且您的用戶都有名字的首字母取自英文字母表。 如果不滿足這些假設,您會想要做一個涉及分頁的更健壯的解決方案。
雖然我沒有確定的根本原因 - 問題已經消失了。 我沒有更改我的代碼,但是當我在家中(通過 VPN 連接)嘗試時,程序成功完成。 由於連接速度較慢,現在需要 110 分鍾,但不再出錯。
顯然這是源於服務器的東西,所以我想我遇到了兩種可能性之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.