Domanda

Ho bisogno solo del nome comune dei gruppi di cui un utente è membro.

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

quindi la proprietà memberOf contiene un set di stringhe, i percorsi completi dei gruppi. Questo ha senso, ma non è quello che voglio.

Sono abbastanza sicuro di non aggiungere un DirectoryEntry per ognuno di quei percorsi per ottenere il nome comune, ma è la migliore idea semplicemente analizzare il cn dal percorso? (sembra piuttosto brutale)

Deve esserci un modo migliore per ottenere i risultati di ricerca dei gruppi di cui un utente è membro.

A proposito, questo è .NET 2, quindi non posso fare nessuna delle fantasiose cose LINQ to AD né ho accesso ai nuovi bit in DirectoryServices for ActiveDirectory.

È stato utile?

Soluzione

Il CN non è necessariamente uguale al nome del gruppo. Non è consigliabile analizzarlo dal DN, poiché il DN è sfuggito. Dovresti interrogare la directory per gli oggetti.

Per recuperare un singolo oggetto, imposta la base di ricerca sul nome distinto, l'ambito di ricerca su "base" ed emettere la query.

È consigliabile memorizzare nella cache i risultati della tua app per evitare di emettere la stessa query LDAP più di una volta (nel caso in cui recuperi il memberOf di più di un oggetto di fila).

Codice di esempio ( direttamente da MSDN , solo leggermente modificato ):

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();

Altri suggerimenti

Sfortunatamente non c'è modo migliore in .NET 2.0 di quello che descrivi. L'attributo memberOf contiene semplicemente i nomi distinti completi di tutti i gruppi di cui l'utente è membro, quindi la soluzione migliore è analizzare ciascun nome distinto.

Trovato questo vecchio thread nel " Correlato " sezione.

Ho altri due suggerimenti per questa domanda.
Ognuno di loro può ottenere oggetti nell'attributo memberOf direttamente come SearchResult in una ricerca.

Tutti i codici sono in C #.

Query sull'ambito degli attributi (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);
}

Limitazioni:

  • Non gestire l'appartenenza al gruppo primario
  • Richiede il livello funzionale del 2003 (dominio / foresta dimenticati)
  • ASQ non funziona su tutto il dominio (almeno System.DirectoryServices non può, genererà eccezioni per qualsiasi oggetto in un altro dominio)

LDAP_MATCHING_RULE_IN_CHAIN ??regola di corrispondenza:

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);
}

Limitazioni:

  • Non gestire l'appartenenza al gruppo primario
  • Richiede il livello funzionale di 2008 R2 (dominio / foresta dimenticati)
  • ottiene l'appartenenza al gruppo nidificato, non solo un livello di memberOf
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top