1

这是我的问题:我需要枚举 Active Directory 中某些组的成员。复杂之处在于组的“membersOf”属性中的对象的 DN 不包含我需要的标识符。具体来说,CN用户对象的 对我来说没用,只有用户对象的一个​​属性(userID)是有用的。

于是想到了三种方法:

  1. 我可以先枚举组以获取组中的列表DN,然后查找每个用户 DN 以找出他们的userID

  2. 我可以枚举广告中的每个用户,获取他们userIDmembersOf收藏,然后检查他们是否拥有正确的会员资格。

  3. CN我可以使用他们的 ' 和'获取所有用户的列表userID,然后枚举组以获取成员 CN。然后我可以加入原始列表中的列表以获取我的成员列表userID

一些问题立即出现 - 选项 1) 将生成大量子查询和拥塞网络流量(不受欢迎),选项 2) 从 AD 中提取大量数据(大约 30mb)。选项 3) 处于中间状态 - 但它仍然会提取大量数据并且有多个查询。是否有另一种选择可以做到这一点而没有这些问题?

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

提前感谢您的时间和考虑。

4

1 回答 1

1

也许还有一个选项#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();
}
于 2013-04-24T20:37:07.223 回答