【问题标题】:Check active directory group membership recursively递归检查活动目录组成员身份
【发布时间】:2012-04-13 17:50:48
【问题描述】:

所以我有一个关于活动目录中递归组的问题。我有一个小方法可以检查用户 ID 是否在组中。效果很好。今天发现它不检查递归组成员身份,我不太确定如何(或是否)有办法做到这一点。到目前为止,这是我对非递归的了解:

public static bool CheckGroupMembership(string userID, string groupName, string Domain)
{
  bool isMember = false;

  PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain, Domain);
  UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID);

  if (user.IsMemberOf(ADDomain, IdentityType.Name, groupName.Trim()))
  {
    isMember = true;
  }

  return isMember;
}

我已经看到了一些关于目录搜索器或其他东西的东西,但我对直接使用 AD 有点陌生,虽然我理解了这些概念,但我仍然对其他一些东西有点迷茫。

谢谢!

【问题讨论】:

    标签: c#-4.0 active-directory group-membership


    【解决方案1】:

    您也可以使用GroupPrincipal.GetMembers的递归选项进行检查。

    public static bool CheckGroupMembership(string userID, string groupName, string Domain) {
        bool isMember = false;
    
        PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain, Domain);
        UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID);
        GroupPrincipal group = GroupPrincipal.FindByIdentity(ADDomain, groupName);
    
        if ((user != null) && (group != null)) {
            isMember = group.GetMembers(true).Contains(user);
        }
    
        return isMember;
    }
    

    【讨论】:

    • GetMember 比 IsMember 快得多
    • 非常酷。找了一个多小时,这是迄今为止我见过的最好的方法!
    • 请注意,如果你有一个 huge AD,那么这两种建议的方法都是最慢的。不要责怪答案,只是提醒在这种情况下,解决方案可能需要一些妥协......
    • 对我来说是更好的解决方案,因为这只会获取真正的成员,而 GetAuthorizationGroups(已接受的答案)返回成员可能会变得棘手“返回的集合还可能包括系统认为用户是其成员的其他组授权目的。” (微软)
    【解决方案2】:

    这是使用System.DirectoryServices.AccountManagement Namespace 的解决方案。这是一种递归解决方案。在Find Recursive Group Membership (Active Directory) using C# 中,我给出了一个递归解决方案,它也适用于通讯组。

    /* Retreiving a principal context
     */
    Console.WriteLine("Retreiving a principal context");
    PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "jpb", "PWD");
    
    
    /* Look for all the groups a user belongs to
     */
    UserPrincipal aUser = UserPrincipal.FindByIdentity(domainContext, "user1");
    PrincipalSearchResult<Principal> a =  aUser.GetAuthorizationGroups();
    
    foreach (GroupPrincipal gTmp in a)
    {
      Console.WriteLine(gTmp.Name);    
    }
    

    【讨论】:

    • 您确定这也会返回通讯组吗?
    • 不,这是这样写的:在使用 C# 查找递归组成员资格 (Active Directory) 中,我给出了一个递归解决方案,它也适用于通讯组。这是针对安全组的。
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2019-01-15
    相关资源
    最近更新 更多