C# 4.0 递归检查active directory组成员身份

C# 4.0 递归检查active directory组成员身份,c#-4.0,active-directory,group-membership,C# 4.0,Active Directory,Group Membership,所以我有一个关于active directory中递归组的问题。我有一个检查用户id是否在组中的小方法。效果很好。今天发现它不检查递归组成员资格,我不太确定如何(或是否)有办法做到这一点。以下是我到目前为止关于非递归的内容: public static bool CheckGroupMembership(string userID, string groupName, string Domain) { bool isMember = false; PrincipalContext AD

所以我有一个关于active directory中递归组的问题。我有一个检查用户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有些陌生,虽然我理解这些概念,但我对其他一些东西还是有点迷茫

谢谢

下面是一个使用的解决方案。这是一种递归解决方案。在中,我给出了一个同样适用于通讯组的递归解决方案

/* 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);    
}
/*检索主体上下文
*/
Console.WriteLine(“检索主上下文”);
PrincipalContext domainContext=新PrincipalContext(ContextType.Domain,“WM2008R2ENT:389”,“dc=dom,dc=fr”,“jpb”,“PWD”);
/*查找用户所属的所有组
*/
UserPrincipal aUser=UserPrincipal.FindByIdentity(domainContext,“user1”);
PrincipalSearchResult a=aUser.GetAuthorizationGroups();
foreach(a中的GroupPrincipal gTmp)
{
Console.WriteLine(gTmp.Name);
}

您还可以使用
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;
}

GetMembers比IsMembers快得多,非常酷。已经搜索了一个多小时,这是迄今为止我见过的最好的方法!请注意,如果你有一个巨大的广告,两种建议的方法都是有史以来最慢的。不要责怪答案,只是提醒大家,在这种情况下,解决方案可能需要一些折衷……对我来说,这是更好的解决方案,因为它只获得真实的成员,而GetAuthorizationGroups(接受的答案)返回成员可能会变得棘手“返回的集合还可以包括系统将考虑用户为授权目的的其他组。”(微软)您确信这也会返回分发组吗?不,这是WrnEn:在查找递归组成员(ActiveDirectory)中。使用C#,我给出了一个同样适用于通讯组的递归解决方案。