2012-04-02 5 views
1

Мы используем следующий код, чтобы получить группы пользователей активного каталога.Группа пользователей домена не получает для пользователя активного каталога

StringCollection groups = new StringCollection(); 

try 
{ 
    using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName, userName, password)) 
    { 
     //find user roles 
     UserPrincipal user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, loginUserName); 

     if (user != null) 
     { 
     DirectoryEntry de = (DirectoryEntry)user.GetUnderlyingObject(); 
     object obGroups = de.Invoke("Groups");       

     foreach (object ob in (IEnumerable)obGroups) 
     { 
      DirectoryEntry obGpEntry = new DirectoryEntry(ob);        
      groups.Add(obGpEntry.Name); 
     }  
     } 
    } 
} 
catch (Exception e) 
{ 
} 

Это работает почти так, как ожидалось. Но пока мы проверяем пользователей с помощью группы Domain Users, метод не возвращает имя группы. Некоторые пользователи только с этой группой Domain Users, и пока мы вызываем этот метод для таких пользователей, он возвращает пустую группу.

Любые предложения, пожалуйста ..

ответ

2

Это хорошо известно и документально «упущение», что так называемая первичная группа не возвращенное методом Groups в этом коде. Есть несколько довольно загадочных путей вокруг этого - или попробуйте этот другой подход:

Если вы на .NET 3.5 и выше, вы должны проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM). Читайте об этом здесь:

В принципе, вы можете определить контекст домена и легко найти пользователей и/или групп в AD:

// set up domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// find a user 
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName"); 

if(user != null) 
{ 
    // the call to .GetAuthorizationGroups() will return **all** groups that 
    // user is a member of - including the primary group and all nested 
    // group memberships, too! 
    var result = user.GetAuthorizationGroups(); 
} 

новый S.DS.AM позволяет очень легко играть с пользователями и группами в AD!

Update: если вы настаиваете на использовании старой унаследованной технологии, проверить this blog post by Ryan Dunn, который объясняет в деталях, как получить первичную группу для учетной записи AD в C#.

+0

Да, я использовал это раньше, но потом я получил сообщение об ошибке «Не удалось получить информацию о домене (1355)». Я не могу понять причину, поэтому я перешел к использованию старой техники. –

+0

Данная ссылка сейчас показывает ошибку 404 http://dunnry.com/blog/2005/01/18/DeterminingYourPrimaryGroupInActiveDirectoryUsingNET.aspx%24 –

+0

@mahesh: извините, у меня был дополнительный символ после вставки - исправлено, работает сейчас. –

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