Voici une fonction qui permet de savoir si un utilisateur fait partie d'un groupe AD (directement ou par héritage)
Exemple :
toto fait partie du groupe A qui fait partie du groupe B
Si je teste si l'utilisateur fait partie du groupe B -> réponse vrai (par héritage)
Si je teste si l'utilisateur fait partie du groupe A -> réponse vrai (directement)
L'utilisation est très simple :
Il suffit d'appeler la fonction isMemberOf avec comme paramètres
distinguishedGroupName - correspond au distinguishedName du groupe
distinguishedUserName - correspond au distinguishedName de l'utilisateur
Remarque :
Cette fonction a été utilisée dans une classe. Comme vous pouvez le voir, l'instance DirectoryEntry n'apparait pas. Il faudra instancier un DirectoryEntry avant d'utiliser la fonction.
Source / Exemple :
/// <summary>
/// Détermine si l'utilisateur est membre du groupe distinguishedGroupName (soit directement, soit par héritage).
/// </summary>
/// <param name="distinguishedGroupName">Propriété distinguishedName du groupe (ex : CN=....,OU=Groupes Hierarchiques,OU=Groupes,DC=...,DC=fr)</param>
/// <param name="distinguishedUserName">Propriété distinguishedName de l'utilisateur (ex : CN=NOM Prenom,OU=....,OU=.....,OU=Poles,DC=....,DC=fr)</param>
/// <returns>
/// <c>vrai</c> si l'utilisateur est membre du groupe distinguishedGroupName; sinon, <c>faux</c>.
/// </returns>
public bool IsMemberOf(string distinguishedGroupName,string distinguishedUserName)
{
DirectorySearcher myDirectorySearcher;
DirectoryEntry myDirEntry = null;
bool isMember = false;
SearchResultCollection myResults;
try
{
//On crée un nouvel objet DirectorySearcher.
myDirectorySearcher = new DirectorySearcher();
//On applique les paramètres de recherche.
myDirectorySearcher.SearchRoot = this.myDirectoryEntry;
myDirectorySearcher.Filter = "(&(objectClass=group)(distinguishedName="+distinguishedGroupName+"))";
myDirectorySearcher.SearchScope = SearchScope.Subtree;
myDirectorySearcher.SizeLimit = 1;
myDirectorySearcher.PropertiesToLoad.AddRange(new string[]{"cn"});
//On récupère le résultat
SearchResult myResult = myDirectorySearcher.FindOne();
if(myResult!=null)
{
myDirEntry = myResult.GetDirectoryEntry();
//Vérification si l'utilisateur userName est directement membre du groupe distinguishedGroupName
if((bool)myDirEntry.Invoke("IsMember",new Object[]{"chemin racine AD"+distinguishedUserName}))
{
isMember=true;
}
else
{
//On crée un nouvel objet DirectorySearcher.
myDirectorySearcher = new DirectorySearcher();
//On applique les paramètres de recherche.
myDirectorySearcher.SearchRoot = this.myDirectoryEntry;
myDirectorySearcher.Filter = "(&(objectClass=group)(memberOf="+distinguishedGroupName+"))";
myDirectorySearcher.SearchScope = SearchScope.Subtree;
//on indique les propriétés à charger
myDirectorySearcher.PropertiesToLoad.AddRange(new string[]{"distinguishedName"});
//On récupère les résultats.
myResults = myDirectorySearcher.FindAll();
foreach(SearchResult result in myResults)
{
isMember=isMember || IsMemberOf(result.Properties["distinguishedName"][0].ToString(),distinguishedUserName);
}
}
}
else
{
throw(new Exception("Le groupe " + distinguishedGroupName + " est introuvable."));
}
}
catch(Exception ex)
{
throw(new Exception("Echec de vérification de l'appartenance à un groupe",ex));
}
return isMember;
}
Conclusion :
Je suis à l'écoute des quelconques remarques.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.