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

use*_*886 4 active-directory

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

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

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

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

mar*_*c_s 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....
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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


ig0*_*774 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)
Run Code Online (Sandbox Code Playgroud)

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