2012-08-21 6 views
10

Abbiamo uno speciale attributo multivalore. Chiamiamolo ourOwnManagedBy che può contenere utenti o gruppi (il loro DN) che gestisce il gruppo corrente.Ricerca di tutti i gruppi gestiti da un utente

Come posso recuperare un elenco di tutti i gruppi gestiti da un utente specifico (con l'aiuto di managedBy e ourOwnManagedBy)?

Per esempio. Supponiamo che l'utente sia membro del gruppo GlobalAdministrators e che il gruppo ApplicationAdministrators abbia GlobalAdministrations come membro. E infine il gruppo MyApplication che ha ApplicationAdministrators nell'attributo ourOwnManagedBy.

  • User è membro del GlobalAdministrators
  • GlobalAdministrators è membro del ApplicationAdministrators
  • MyApplication ottenuto ApplicationAdministrators in ourOwnManagedBy

Come posso utilizzare queste informazioni per trovare tutti i gruppi che un utente specifico gestisce? È possibile eseguire qualche tipo di controllo ricorsivo negli attributi personalizzati (che contiene DN di utenti e gruppi)?

Aggiornamento

Ho cercato di usare una directory filtro di ricerca come questa:

string.Format("(ourOwnManagedBy:1.2.840.113556.1.4.1941:={0})", dn); 

ma potrebbe avere missunderstood cosa 1.2.840.113556.1.4.1941 fa? (MSDN page)

+0

Questo è stupido, ma l'esempio di codice nel sito collegato racchiude il suo DN tra parentesi. Hai provato lo stesso? Non mi aspetto che faccia la differenza, ma non l'ho provato. – JDB

+0

sì, l'ho provato. Ma grazie per il suggerimento – jgauffin

risposta

1

Questo è, temo, impossibile eseguire con una sola query LDAP. Dovrai dividerlo in subquery ed eseguirli separatamente, che a loro volta soffocheranno il controller di dominio se c'è molto da ripetere.

Ho provato a farlo nel modo descritto, e le prestazioni sono state orribili, almeno facendo uso dei moduli disponibili per .NET.

+0

Non sembra migliore :( – jgauffin

0

La seguente pagina dice 3.1.1.3.4.4 LDAP Matching Rules (extensibleMatch) dice che il LDAP_MATCHING_RULE_TRANSITIVE_EVAL che si sta utilizzando funziona in Windows 2008 e versioni successive. Se si utilizza 2003, potrebbe non funzionare.

+0

Come si risponde alla mia domanda? – jgauffin

+0

Non hai menzionato quale sistema operativo stai usando. Windows 2003 non eseguirà l'errore, non restituirà alcun risultato. – Roland

+0

Server is 2008R2 – jgauffin

0

Nessuna ricorsione, nessuna idea su come farà le prestazioni, potrebbe avere bug.

 string user = "username"; 
     //get domain 
     DirectoryEntry de = System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().GetDirectoryEntry(); 
     //get users dn first 
     string userDN; 
     using (var searcher = new DirectorySearcher(de)) 
     { 
      searcher.Filter = String.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))", user); 
      searcher.PropertiesToLoad.Add("distinguishedName"); 
      userDN = searcher.FindOne().Properties["distinguishedName"][0].ToString(); 
     } 

     //get list of all users groups 
     List<string> groups; 
     //see http://stackoverflow.com/questions/6252819/find-recursive-group-membership-active-directory-using-c-sharp 
     using (var searcher2 = new DirectorySearcher(de)) 
     { 
      searcher2.Filter = String.Format("(member:1.2.840.113556.1.4.1941:={0})", userDN); 
      searcher2.SearchScope = SearchScope.Subtree; 
      searcher2.PropertiesToLoad.Add("distinguishedName"); 

      SearchResultCollection src = searcher2.FindAll(); 

      groups = (from SearchResult c in src 
         select c.Properties["distinguishedName"][0].ToString()).ToList(); 
     } 

     //build giant search query 
     SearchResultCollection srcGroups; 
     using (var searcher = new DirectorySearcher(de)) 
     { 
      string baseString = "(|{0})"; 
      string managedbybase = "(managedBy={0})"; 
      //I've read that you can search multivalued lists using a standard ='s. 
      string ourOwnManagedByBase = "(ourOwnManagedBy={0})"; 

      StringBuilder sb = new StringBuilder(); 

      //add user DN to list of group dn's 
      groups.Add(userDN); 

      foreach (string g in groups) 
      { 
       sb.AppendFormat(managedbybase, g); 
       sb.AppendFormat(ourOwnManagedByBase, g); 
      } 

      searcher.Filter = string.Format(baseString, sb.ToString()); 
      srcGroups = searcher.FindAll(); 
     } 

Sarò onesto e dire che questo in realtà non funziona per me :) Ma penso che sia a causa del modo in cui il nostro dominio è configurato. Se non altro forse ti spingerà nella giusta direzione.

+0

Una stringa di ricerca gigante non funziona. L'ho provato. – jgauffin

+0

@jgauffin - Perché non funziona? – Peter

+0

Viene visualizzato un errore AD. Potrebbe essere un filtro limite di lunghezza? – jgauffin