Question

J'ai seulement besoin du commonName des groupes dont un utilisateur est membre.

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. Cela a du sens, mais ce n’est pas ce que je veux.

Je suis sûr que je ne créerais pas DirectoryEntry pour chacun de ces chemins pour obtenir le nom commun, mais est-il préférable d’analyser simplement le CN du chemin? (cela semble plutôt brutal)

Il doit exister un meilleur moyen d'obtenir un SearchResults des groupes dont un utilisateur est membre.

BTW, il s’agit du .NET 2, je ne peux donc rien faire d’imaginaire entre LINQ et AD et je n’ai pas non plus accès aux nouveaux bits de DirectoryServices for ActiveDirectory.

Était-ce utile?

La solution

Le CN n'est pas nécessairement égal au nom du groupe. Il n'est pas recommandé de l'analyser dans le DN, car le DN est échappé. Vous devrez interroger le répertoire des 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 émettez la requête.

Il est conseillé de mettre en cache les résultats de la requête dans votre application pour éviter de générer plusieurs fois la même requête LDAP (au cas où vous récupériez le memberOf de plusieurs objets à la suite).

Exemple de code ( juste à côté du 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();

Autres conseils

Malheureusement, il n’existe pas de meilleur moyen dans .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.

Cet ancien fil de discussion a été trouvé dans le lien "Connexes". section.

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

Tous les codes sont en C #.

Requête de portée d'attribut (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 gérez pas l'appartenance au groupe principal
  • Nécessite le niveau fonctionnel de 2003 (domaine / forêt oublié)
  • Les ASQ ne fonctionnent pas d’un domaine à l’autre (au moins System.DirectoryServices ne le peut pas, il lèvera une exception pour tout objet d’un autre domaine)

Règle de correspondance LDAP_MATCHING_RULE_IN_CHAIN:

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 gérez pas l'appartenance au groupe principal
  • Requiert le niveau fonctionnel de 2008 R2 (domaine / forêt oublié)
  • il obtient l'appartenance à un groupe imbriqué, pas seulement à un niveau de memberOf
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top