如何获取Active Directory中指定用户的直接所属组(非嵌套组)
仅获取Active Directory用户直接所属组的解决方案
我太懂你这个痛点了——你用的UserPrincipal.GetAuthorizationGroups()方法确实会递归返回所有嵌套组,包括用户间接通过子组继承的权限组,这完全不是AD里用户“隶属于”列表显示的直接所属组。
要解决这个问题其实很简单:把GetAuthorizationGroups()换成UserPrincipal.GetGroups()方法就可以了!这个方法专门用来获取用户直接所属的组,和你在AD用户属性里看到的“隶属于”列表完全一致。
修改后的代码如下:
public List<GroupPrincipal> GetDirectGroups(string userName) { List<GroupPrincipal> result = new List<GroupPrincipal>(); // 建立域上下文 PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain); // 查找目标用户 UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName); if(user != null) { // 仅获取直接所属的组,而非嵌套递归的授权组 PrincipalSearchResult<Principal> directGroups = user.GetGroups(); foreach(Principal p in directGroups) { if(p is GroupPrincipal) { result.Add((GroupPrincipal)p); } } } return result; }
关键区别说明:
GetAuthorizationGroups():返回用户所有有效授权组,包括嵌套组、跨域组,甚至系统自动生成的组(比如Authenticated Users),是为权限验证场景设计的。GetGroups():只返回用户直接添加到的组,完全对应AD用户属性中“隶属于”标签页的内容,没有递归。
如果需要额外过滤掉系统内置组(比如Domain Users这类默认组),可以在遍历的时候加个判断,比如检查组的IsSecurityGroup属性或者名称前缀。
内容的提问来源于stack exchange,提问作者danivegas
相关产品推荐
相关产品推荐

