Se utilizzi .NET 3.5 o versioni successive, puoi utilizzare il nuovo System.DirectoryServices.AccountManagement
versioni spazio dei nomi (S.DS.AM) che lo rende molto più semplice di quanto non fosse in passato.
Leggi tutto qui: Gestione delle entità di protezione delle directory in .NET Framework 3.5
Aggiornamento: i vecchi articoli della rivista MSDN non sono più online, sfortunatamente: dovrai scaricare CHM per la rivista MSDN di gennaio 2008 da Microsoft e leggere l'articolo in esso contenuto.
Fondamentalmente, devi avere un "contesto principale" (in genere il tuo dominio), un'entità utente e quindi ottenere i suoi gruppi molto 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 questo è tutto quello che c'è! Ora hai un risultato (un elenco) di gruppi di autorizzazione a cui appartiene l'utente: iterali su di essi, stampa i loro nomi o qualunque cosa tu debba fare.
Aggiornamento: per accedere a determinate proprietà, che non sono emerse UserPrincipal
sull'oggetto, è necessario scavare nel sottostante 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;
}
Aggiornamento n. 2: sembra non dovrebbe essere troppo difficile mettere insieme questi due frammenti di codice ... ma ok - eccolo:
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
- vedi la mia risposta aggiornata per come arrivarci.