Se você estiver no .NET 3.5 ou superior, poderá usar o novo System.DirectoryServices.AccountManagement
namespace (S.DS.AM), que torna isso muito mais fácil do que costumava ser.
Leia tudo sobre isso aqui: Gerenciando princípios de segurança de diretório no .NET Framework 3.5
Atualização: artigos mais antigos da revista MSDN não estão mais online, infelizmente - você precisará baixar o CHM para a revista MSDN de janeiro de 2008 da Microsoft e ler o artigo lá.
Basicamente, você precisa ter um "contexto principal" (normalmente seu domínio), um principal do usuário, e então obter seus grupos muito facilmente:
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;
}
e isso é tudo que existe! Agora você tem um resultado (uma lista) de grupos de autorização aos quais o usuário pertence - iterar sobre eles, imprimir seus nomes ou o que quer que você precise fazer.
Atualização: para acessar certas propriedades, que não são apresentadas no UserPrincipal
objeto, você precisa se aprofundar em 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;
}
Atualização nº 2: parece que não deve ser muito difícil colocar esses dois trechos de código juntos ... mas ok - aqui vai:
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
- veja minha resposta atualizada para saber como acessá- la.