Если вы используете .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
- см. Мой обновленный ответ, чтобы узнать, как его получить.