我正在使用的AD设置具有存储为(多个)安全组成员的用户。
我使用的软件读取用户的memberof属性来计算访问权限。
在AD Explorer中,我可以看到用户的memberof属性显示他们所属的直接安全组,并说“课程 - 英语”。它没有显示父母团体,嵌套说“所有学生”。
是否有理由确保所有嵌套组都显示在memberof属性中?
答案 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 answer的LDAP_MATCHING_RULE_IN_CHAIN
(假设您拥有用户的DN),例如,
(member:1.2.840.113556.1.4.1941:=CN=Administrator,OU=Users,DC=fabrikam,DC=com)
这将获得管理员所属的所有组。但请注意,此查询可能非常慢。要加快性能,请考虑分页结果或将搜索范围限制为只有您要检查的组。