2014-11-25 4 views
0
public bool IsUserGroupMember(string user, string unit) 
{ 
    bool member = false; 

    try 
    { 
     PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
     string[] groups = unit.Split(','); 
     foreach (string word in groups) 
     { 
      GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, word); 

      if (grp != null) 
      { 
       foreach (Principal p in grp.GetMembers(true)) 
       { 
        if (p.SamAccountName == user) 
        { 
         member = true; 
         grp.Dispose(); 
         ctx.Dispose(); 
         return member; 
        } 
       } 
      } 
      else 
      { 
       grp.Dispose(); 
       ctx.Dispose(); 
       return member; 
      } 
     } 
    } 
    catch (COMException) 
    { 
     return member; 
    } 

    return member; 
} 

Я использую метод выше, чтобы найти, является ли пользователь членом группы в Active Directory, рекурсивно. Он работает хорошо ... хотя иногда я получаю странное исключение.Active Directory exception asp .net

Указанный способ не поддерживается. foreach (Основной p в grp.GetMembers (true)) красный (извините, я не могу загрузить изображение исключения). Самая странная вещь в том, что это, кажется, брошена в случайном порядке, и если я обновить страницу она хорошо работает ..

Я пытался найти решение в Интернете, но не радостных новостей на данный момент ..

ответ

0

У меня наконец-то появилось решение!

Я просто должен был добавить свое доменное имя, следующим образом:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "MyDomain"); 

Это решило проблему прямо сейчас!

И про медлительность .. Я использовал куки, следующие за этим link.

0

Вы должны сделайте это наоборот: получите пользователя, а затем группы авторизации, в которых этот пользователь является участником - этот вызов (на UserPrincipal) уже есть поиск групп рекурсивно для вас!

public bool IsUserGroupMember(string user, string unit) 
{ 
    bool isMember = false; 

    try 
    { 
     // put the PrincipalContext in a using(..) block - then it's 
     // automatically, safely and properly disposed of at the end 
     using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
     { 
      // get the user 
      UserPrincipal up = UserPrincipal.FindByIdentity(ctx, user); 

      if(up != null) 
      { 
       // get the authorization groups for the user 
       // this call is *RECURSIVELY* enumerating all groups 
       // that this user is a member of 
       var authGroups = up.GetAuthorizationGroups(); 

       // now that you have the groups - just determine if the user 
       // is a member of the group you're looking for...... 
      } 
     } 
    } 
    catch (COMException comEx) 
    { 
     isMember = false; 
    } 

    return isMember; 
} 
+0

Благодарим за ответ @marc_s. Я понимаю ваш код. Единственная проблема сейчас в том, что я получаю это exeption: «up.GetAuthorizationGroups()» выбрасывает исключение типа «System.AppDomainUnloadedException» \t System.DirectoryServices.AccountManagement.PrincipalSearchResult {System. AppDomainUnloadedException}. Как это исправить? :) – Sarah

+0

Привет @marc_s, можете ли вы дать мне новый намек, пожалуйста? Я все еще придерживаюсь своего метода, который также требует времени для обработки; результат: начальная страница берет навсегда для загрузки .. :( – Sarah

Смежные вопросы