C#中的Active Directory无法找到所有用户

3

我有一些代码可以查询Active Directory以验证用户是否存在,我正在尝试验证大约1300个ID的长列表。我已经尝试过几种方法来验证用户帐户(包括LINQ到AD、DirectorySearcher(带或不带父目录项)以及链接到WinNT://路径的DirectoryEntry)。每次它都会返回并说有几个用户不存在。如果我在代码中硬编码他们的用户ID并逐个执行,它会验证存在性。如果我尝试在foreach循环中执行,我会得到几个错误的负面结果。

这是我现在正在使用的代码...

static string[] userIDs = new string[] "user1","user2","user3","user4","user5","user6","user7","user8"...,"user1300"};

List<string> nonExistingUsers = new List<string>();
List<string> ExistingUsers = new List<string>();
foreach (string s in userIDs)
{
 DirectorySearcher search = new DirectorySearcher();
 search.Filter = String.Format("(SAMAccountName={0})", s);
 search.PropertiesToLoad.Add("cn");
 DirectorySearcher ds = new DirectorySearcher(de, "(&(objectClass=user)(cn=" + s + "))", new string[] { "Name" }, SearchScope.Subtree);
 SearchResultCollection resultCollection = ds.FindAll();
 SearchResult result = search.FindOne();
 if (result != null)
  ExistingUsers.Add(s);
 else
  nonExistingUsers.Add(s);
}

任何建议或原因可以解释为什么我收到了误报负面反馈?
1个回答

4

有几件事情:

  • 首先,尝试在LDAP过滤器中使用“anr =”(模糊名称解析)-它搜索几个与名称相关的属性,并使搜索更容易。用户ID可能不是实际“公共名称”(CN = user1)的一部分。

  • 其次,使用objectCategory而不是objectClass- objectCategory是单值且索引化的,因此在搜索时速度更快

  • 第三:为什么需要在下一行先调用.FindAll()然后再调用.FindOne()?似乎完全没有必要...

  • WinNT://实际上仅用于向后兼容以及如果您需要处理本地计算机帐户-尽可能避免使用它,它还公开比LDAP少得多的属性

这里是我会写的代码:

static string[] userIDs = new string[] "user1","user2","user3","user4","user5","user6","user7","user8"...,"user1300"};

DirectoryEntry searchRoot = new DirectoryEntry("LDAP://cn=Users,dc=YourComp,dc=com");

List<string> nonExistingUsers = new List<string>();
List<string> ExistingUsers = new List<string>();

foreach (string s in userIDs)
{
   DirectorySearcher search = new DirectorySearcher(searchRoot);

   search.SearchScope = SearchScope.Subtree;
   search.Filter = string.Format("(&(objectCategory=person)(anr={0}))", s);

   SearchResultCollection resultCollection = ds.FindAll();

   if(resultCollection != null && resultCollection.Count > 0)
      ExistingUsers.Add(s);
   else
      nonExistingUsers.Add(s);
}

这在你的情况下能行吗?

另外,如果你正在使用.NET 3.5或更高版本,事情会变得更加容易 - 请参见:

在.NET Framework 3.5中管理目录安全主体


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接