2009-05-06 7 views
4

J'ai juste besoin du commonName des groupes dont un utilisateur est membre.La propriété memberOf de DirectoryEntry renvoie le chemin complet

DirectoryEntry user = new DirectoryEntry("LDAP://cn=myuser...."); 
foreach(string path in user.Properties["memberOf"]) 
    Console.WriteLine(path); 

alors la propriété memberOf contient un ensemble de chaînes, les chemins complets des groupes. C'est logique, mais ce n'est pas ce que je veux. Je suis sûr que je ne devrais pas créer un DirectoryEntry pour chacun de ces chemins pour obtenir le nom commun, mais est-ce la meilleure idée d'analyser simplement le cn du chemin? (Cela semble plutôt brutal)

Il doit y avoir une meilleure façon d'obtenir un SearchResults de groupes dont un utilisateur est membre.

BTW, c'est .NET 2, donc je ne peux pas faire l'un des trucs fantaisie LINQ à AD ni j'ai accès aux nouveaux bits dans DirectoryServices pour ActiveDirectory.

Répondre

2

Le CN n'est pas nécessairement égal au nom du groupe. L'analyser à partir du DN n'est pas recommandé, car le DN est échappé. Vous auriez besoin d'interroger le répertoire pour les objets.

Pour récupérer un seul objet, définissez la base de recherche sur son nom distinctif, l'étendue de la recherche sur "base" et lancez la requête. La mise en cache des résultats de la requête dans votre application pour éviter d'émettre la même requête LDAP plusieurs fois est conseillée (dans le cas où vous récupérez le memberOf de plusieurs objets d'affilée).

Exemple de code (right off the MSDN, légèrement modifié):

string dn = "LDAP://CN=Group Name,ON=Groups,DC=fabrikam,DC=com"; 

// Bind to a specific group. 
DirectoryEntry entry = new DirectoryEntry(dn); 

// Create a DirectorySearcher object. 
DirectorySearcher mySearcher = new DirectorySearcher(entry); 
mySearcher.SearchScope = SearchScope.Base; 
mySearcher.PropertiesToLoad.Add("displayName"); 

// Use the FindOne method to find the group object. 
SearchResult resEnt = mySearcher.FindOne(); 
0

Malheureusement, il n'y a pas de meilleur moyen de .NET 2.0 que ce que vous décrivez. L'attribut memberOf contient simplement les noms distinctifs complets de tous les groupes dont l'utilisateur est membre. Votre meilleure solution consiste donc à analyser chaque nom distinctif.

0

trouvé ce vieux fil dans la section "connexes".

Vous avez deux autres suggestions à cette question.
Chacun d'eux peut obtenir des objets dans l'attribut memberOf directement en tant que SearchResult en une recherche.

Tous les codes sont en C#.

attribut Requête Portée (ASQ):

DirectoryEntry userEntry = new DirectoryEntry("LDAP://<server>/<user DN>", "user", "pwd"); 

DirectorySearcher searcher = new DirectorySearcher(userEntry); 
searcher.SearchScope = SearchScope.Base; 
searcher.AttributeScopeQuery = "memberOf"; 
searcher.PropertiesToLoad.Clear(); 
// just load any attributes you want, not limited to cn 
searcher.PropertiesToLoad.Add("cn"); 

foreach (SearchResult result in searcher.FindAll()) 
{ 
    Console.WriteLine(result.Path); 
} 

Limitations:

  • Ne pas manipuler l'appartenance au groupe primaire
  • Niveau requis fonctionnel de 2003 (oublié domaine/forêt)
  • ASQ ne fonctionne pas à travers domaine (au moins système.DirectoryServices ne peut pas, il jetteront exception pour tout objet dans un autre domaine)

LDAP_MATCHING_RULE_IN_CHAIN ​​de règle de correspondance:

DirectoryEntry rootEntry = new DirectoryEntry("GC://<GC server>", "user", "pwd"); 

DirectorySearcher searcher = new DirectorySearcher(rootEntry); 
searcher.SearchScope = SearchScope.Subtree; 
searcher.Filter = "(member:1.2.840.113556.1.4.1941:=<user DN>)"; 
searcher.PropertiesToLoad.Clear(); 
// just load any attributes you want, not limited to cn 
searcher.PropertiesToLoad.Add("cn"); 

foreach (SearchResult result in searcher.FindAll()) 
{ 
    Console.WriteLine(result.Path); 
} 

Limitations:

  • Ne pas gérer l'appartenance au groupe primaire
  • Requiert le niveau fonctionnel de 2008 R2 (domaine/forêt oublié)
  • il obtient l'appartenance à un groupe imbriqué, pas seulement un niveau de membreDe
Questions connexes