Проверять членство в группе активных каталогов рекурсивно

Поэтому у меня есть вопрос относительно рекурсивных групп в активной директории. У меня есть небольшой метод, который проверяет, есть ли идентификатор пользователя в группе или нет. Работает отлично. Сегодня узнал, что он не проверяет рекурсивное членство в группах, и я не слишком уверен, как (или если) есть способ сделать это. Вот что у меня есть для нерекурсивных:

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, и хотя я понимаю концепции, некоторые другие вещи все еще немного потеряны для меня.

Спасибо!

2 ответа

Решение

Вот решение, использующее пространство имен System.DirectoryServices.AccountManagement. Это своего рода рекурсивное решение. В разделе Поиск рекурсивного членства в группах (Active Directory) с использованием 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);    
}

Вы также можете проверить, используя рекурсивную опцию 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;
}
Другие вопросы по тегам