Якщо ви перебуваєте на .NET 3.5 або вище, ви можете використовувати новий System.DirectoryServices.AccountManagement
(S.DS.AM) простір імен, що робить це набагато простіше, ніж раніше.
Про це читайте тут: Керування принципами безпеки каталогів у .NET Framework 3.5
Оновлення: старіші статті журналу MSDN більше не в Інтернеті, на жаль - вам потрібно буде завантажити CHM для журналу MSDN за січень 2008 року від Microsoft і прочитати статтю там.
По суті, вам потрібно мати "основний контекст" (як правило, ваш домен), головний користувач, і тоді ви дуже легко отримуєте його групи:
public List<GroupPrincipal> GetGroups(string userName)
{
List<GroupPrincipal> result = new List<GroupPrincipal>();
// establish domain context
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);
// if found - grab its groups
if(user != null)
{
PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
// iterate over all groups
foreach(Principal p in groups)
{
// make sure to add only group principals
if(p is GroupPrincipal)
{
result.Add((GroupPrincipal)p);
}
}
}
return result;
}
і це все є! Тепер у вас є результат (список) груп авторизації, до якого належить користувач, - повторіть їх, роздрукуйте їхні імена або все, що вам потрібно зробити.
Оновлення: для доступу до певних властивостей, які не з’являються на UserPrincipal
об’єкті, вам потрібно перекопатись до основної DirectoryEntry
:
public string GetDepartment(Principal principal)
{
string result = string.Empty;
DirectoryEntry de = (principal.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
return result;
}
Оновлення №2: здається, не повинно бути надто складно скласти ці два фрагменти коду разом .... але нормально - ось це:
public string GetDepartment(string username)
{
string result = string.Empty;
// if you do repeated domain access, you might want to do this *once* outside this method,
// and pass it in as a second parameter!
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find the user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, username);
// if user is found
if(user != null)
{
// get DirectoryEntry underlying it
DirectoryEntry de = (user.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
}
return result;
}
UserPrincipal
- див. Мою оновлену відповідь про те, як її отримати.