4

我正在使用的 AD 设置具有存储为(多个)安全组成员的用户。

我正在使用读取用户的 memberof 属性来计算访问权限的软件。

在 AD Explorer 中,我可以看到用户的 memberof 属性显示了他们所属的直接安全组,例如“课程 - 英语”。它不显示父母组,嵌套显示“所有学生”。

是否有这样做的原因或确保所有嵌套组都显示在 memberof 属性中的方法?

4

2 回答 2

5

如果您使用的是 .NET 3.5 及更高版本,则应查看System.DirectoryServices.AccountManagement(S.DS.AM) 命名空间。在这里阅读所有相关信息:

基本上,您可以定义域上下文并在 AD 中轻松找到用户和/或组:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

if(user != null)
{
   var groups = user.GetAuthorizationGroups();

   // enumerate over groups
   foreach(GroupPrincipal gp in groups)
   {
      // do something here....
   }
}

新的 S.DS.AM 使得在 AD 中与用户和组一起玩变得非常容易!

.GetAuthorizationGroups()方法是我所知道的唯一一种会进行递归搜索的方法,例如,通过另一个组查找用户所属的组。.NET 3.5 之前的DirectoryServices东西不这样做——如果你需要的话,你必须完全自己动手。

于 2012-08-20T17:05:28.057 回答
5

memberOf属性不包含所有嵌套组信息的可能原因是该值是在加载属性时计算的,如此链接中所述:

请注意,此属性列出了在其成员属性中包含用户的组 - 它不包含嵌套前辈的递归列表。例如,如果用户 O 是组 C 的成员,并且组 B 和组 B 嵌套在组 A 中,则用户 O 的 memberOf 属性将列出组 C 和组 B,而不是组 A。

这个属性没有被存储——它是一个计算的反向链接属性。

因此,为了支持这一点,每次 LDAP 查询返回memberOf属性时,您的 DC 将被迫加载所有嵌套组,这可能是很多多余的工作。

根据您使用的技术,几乎可以肯定有比加载所有组并列出所有组更好的方法来检查组成员身份。例如,ADSI 有一个预先构建的函数来检查用户是否是组的成员。

但是,对于纯 LDAP 解决方案,您可以使用此答案LDAP_MATCHING_RULE_IN_CHAIN中所示的(假设您有用户的 DN),例如,

(member:1.2.840.113556.1.4.1941:=CN=Administrator,OU=Users,DC=fabrikam,DC=com)

这将获得管理员所属的所有组。但是请注意,此查询可能非常慢。为了提高性能,请考虑对结果进行分页或将搜索库限制为仅您有兴趣检查的组。

于 2012-08-20T17:05:57.993 回答