[英]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.