我正在用C#开发一个程序,搜索AD中的所有用户并将它们添加到列表中。不幸的是,我遇到了一个案例,其中没有将特定用户添加到该组中。
我用来创建列表的相关代码(在try / catch块中):
List<User> ADUsers = new List<User>();
string domainPath = "LDAP://DC=domain,DC=local";
search.Filter = "(&(objectClass=user))";
//I was including propertiesToLoad here, but I removed it in testing
SearchResultCollection results = search.FindAll();
if (results != null)
{
foreach (SearchResult result in results)
{
if (result.Properties.Contains("samaccountname") && result.Properties.Contains("mail") && result.Properties.Contains("displayname"))
{
User objSurveyUser = new User((String)result.Properties["samaccountname"][0], (String)result.Properties["mail"][0], (String)result.Properties["displayname"][0]);
ADUsers.Add(objSurveyUser);
}
}
}
return ADUsers;
我获得了900多个条目(正如预期的那样),到目前为止,我已经能够搜索我尝试过的每个用户但只有一个。
我在AD中检查了用户是否被归类为用户,因此我知道不应该过滤掉用户。我还验证了(在鬣狗中)Pre-2k帐户名(samaccountname),电子邮件地址(邮件)和显示名称都已列出并且对于此用户是正确的。
我创建了else块来捕获缺少上述一个或多个的用户并尝试以这种方式找到用户,但无济于事。
有没有人看到我的代码中可能遗漏的任何明显内容?
更新:我将搜索过滤器更改为(objectCategory=person)
,并且出现了一些我无法找到的用户。越来越近了。
更新2:我认为AD Searcher的工作方式可能存在问题。我将(objectCategory=person)
更改为(|(objectCategory=person)(objectClass=user))
。根据逻辑规则,我的返回大小应该增长;相反,它缩小了。 |A U B| >= |A|
更新3 :我已完全删除search.filter
行,并尝试使用其他过滤器:(!(userAccountControl=2))
。这两个选项都为我提供了基本OU中的完整用户列表,但它们不会在其他OU中搜索。
答案 0 :(得分:0)
我将此代码添加到我的程序中以进行故障排除:tbText.text = $"Found {results.Count} AD entries."
返回Found 1000 AD entries.
该行保存了问题的关键。我不知道我的结果受到限制。快速搜索SO导致我this post。
获得该信息后,我添加了相应的代码ds.PageSize = 500;
,我的问题就解决了。