Si vous utilisez .NET 3.5 ou une version ultérieure, vous pouvez utiliser le nouvel System.DirectoryServices.AccountManagement
espace de noms (S.DS.AM), ce qui rend cela beaucoup plus facile qu'auparavant.
Pour en savoir plus, cliquez ici: Gestion des principaux de sécurité d'annuaire dans .NET Framework 3.5
Mise à jour: les anciens articles du magazine MSDN ne sont plus en ligne, malheureusement - vous devrez télécharger le CHM pour le magazine MSDN de janvier 2008 de Microsoft et lire l'article qui s'y trouve.
Fondamentalement, vous devez avoir un "contexte principal" (généralement votre domaine), un principal utilisateur, puis vous obtenez ses groupes très facilement:
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;
}
et c'est tout ce qu'il y a! Vous avez maintenant un résultat (une liste) des groupes d'autorisation auxquels l'utilisateur appartient - parcourez-les, imprimez leurs noms ou tout ce que vous devez faire.
Mise à jour: pour accéder à certaines propriétés, qui ne sont pas visibles sur l' UserPrincipal
objet, vous devez creuser dans le sous-jacent 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;
}
Mise à jour n ° 2: semble ne devrait pas être trop difficile de mettre ces deux extraits de code ensemble ... mais ok - voilà:
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
- voir ma réponse mise à jour pour savoir comment y accéder.