Active Directory成员属性不包含嵌套安全组

时间:2012-08-20 16:26:15

标签: active-directory

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

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

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

是否有理由确保所有嵌套组都显示在memberof属性中?

2 个答案:

答案 0 :(得分: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 DirectoryServices之前的内容不会这样做 - 如果需要,你必须完全滚动自己的

答案 1 :(得分:5)

memberOf属性不包含所有嵌套组信息的可能原因是,在加载属性时会计算该值,如上所述in this link

  

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

     

此属性未存储 - 它是计算的反向链接属性。

因此,为了支持这一点,每次LDAP查询返回memberOf属性时,您的DC都将被强制加载所有嵌套组,这可能会导致大量过多工作。

根据您使用的技术,几乎可以肯定更好的方法来检查组成员资格,而不是加载所有组并列出所有组。例如,ADSI has a pre-built function检查用户是否是该组的成员。

但是,对于纯LDAP解决方案,您可以使用显示in this answerLDAP_MATCHING_RULE_IN_CHAIN(假设您拥有用户的DN),例如,

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

这将获得管理员所属的所有组。但请注意,此查询可能非常慢。要加快性能,请考虑分页结果或将搜索范围限制为只有您要检查的组。