c# LDAP成员枚举

本文关键字:枚举 成员 LDAP | 更新日期: 2023-09-27 18:10:41

这是我的问题:我需要枚举活动目录中某些组的成员。复杂的是,组的'membersOf'属性中的对象的DN不包含我需要的标识符。具体来说,用户对象的CN对我来说是无用的,只有用户对象的一个属性(userID)是有用的。

我想到了三种方法:

  1. 我可以首先枚举组以获得组中DN的列表,然后对每个用户DN进行查找以找到他们的userID

  2. 我可以枚举AD中的每个用户,抓取他们的userID &他们的membersOf集合,然后检查他们是否有正确的成员。

  3. 我可以用CNuserID抓取所有用户的列表,然后枚举组以获得成员CN。然后我可以加入原始列表中的列表,以获得我的userID成员列表。

一些问题立即出现——选项1)将产生非常大量的子查询和拥挤的网络流量(不希望的),选项2)从AD提取大量的数据(大约30mb)。选项3)是中间路线——但它仍然会提取相当多的数据并有多个查询。有没有另一种不存在这些问题的方法?

我正在使用System.DirectoryServices工具在c#中完成此操作。

事先感谢您的时间和考虑。

c# LDAP成员枚举

也许还有一个选项#4:

  • 你可以设置一个DirectorySearcher来枚举用户
  • 您可以将memberOf=.......定义为您的搜索条件之一
  • 你可以很容易地从目录搜索器中定义你需要的属性

如果这工作(我的印象是,我得到这个工作之前-但它是相当长的一段时间!),然后你可以做一个,单一的相当集中的搜索和自动获得你需要的信息。

试试这样写:

// define the "root" of your search (where to begin)
DirectoryEntry searchRoot = new DirectoryEntry("LDAP://cn=users,dc=yourcompany,dc=com");
DirectorySearcher searcher = new DirectorySearcher(searchRoot);
// set properties
searcher.SearchScope = SearchScope.Subtree;
// define search filter
searcher.Filter = "(&(objectCategory=Person)(memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))";
// define attributes to load
searcher.PropertiesToLoad.Add("userid"); 
... add more if needed .....
foreach(SearchResult entry in searcher.FindAll())
{
   string userid = entry.Properties["userid"][0].ToString();
}