Étant donné un nom d'utilisateur, comment procéder pour écrire une requête LDAP qui retournera tous les groupes dont l'utilisateur est membre?Requête LDAP pour lister tous les groupes Utilisateur est un membre?
Répondre
Êtes-vous sur .NET 3.5 ??
Si tel est le cas, consultez cet excellent article MSDN Managing Directory Security Principals in the .NET Framework 3.5 qui présente la nouvelle fonctionnalité de gestion des utilisateurs et des groupes dans .NET 3.5.
Dans ce cas, vous avez besoin d'un contexte principal (par exemple votre domaine):
PrincipalContext domainContext =
new PrincipalContext(ContextType.Domain, "YourDomain");
et vous pouvez trouver assez facilement l'utilisateur:
UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, "username");
et l'objet "UserPrincipal" a une méthode appelée « GetAuthorizationGroups » qui renvoie tous les groupes auxquels l'utilisateur est un membre de:
PrincipalSearchResult<Principal> results = user.GetAuthorizationGroups();
// display the names of the groups to which the
// user belongs
foreach (Principal result in results)
{
Console.WriteLine("name: {0}", result.Name);
}
P retty facile, hein?
C'est beaucoup plus de travail dans .NET avant 3.5, ou dans LDAP "direct" d'une autre langue (PHP, Delphi, etc.).
Marc
Voici une autre façon d'obtenir les informations de groupe:
Assurez-vous d'ajouter une référence pour System.DirectoryServices.
DirectoryEntry root = new DirectoryEntry("LDAP://OU=YourOrganizationOU,DC=foo,DC=bar");
DirectoryEntry user = GetObjectBySAM("SomeUserName", root);
if (user != null)
{
foreach (string g in GetMemberOf(user))
{
Console.WriteLine(g);
}
}
Les méthodes suivantes obtiennent l'entrée de l'utilisateur et renvoient une liste de chaînes qui sont les groupes dont l'utilisateur est membre.
public List<string> GetMemberOf(DirectoryEntry de)
{
List<string> memberof = new List<string>();
foreach (object oMember in de.Properties["memberOf"])
{
memberof.Add(oMember.ToString());
}
return memberof;
}
public DirectoryEntry GetObjectBySAM(string sam, DirectoryEntry root)
{
using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam)))
{
SearchResult sr = searcher.FindOne();
if (!(sr == null)) return sr.GetDirectoryEntry();
else
return null;
}
}
Fonctionne bien! Merci beaucoup. – Donut