2010-05-25 14 views
5

Sto cercando di estrarre un elenco di OU correnti da Active Directory Ho guardato qualche codice di esempio online per un po ', ma O non sembra essere in grado di farlo funzionare.Acquisizione elenco OU AD

 string defaultNamingContext; 

     DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE"); 
     defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString(); 
     DirectorySearcher ouSearch = new DirectorySearcher(rootDSE, "(objectClass=organizationalUnit)", 
      null, SearchScope.Subtree); 

     MessageBox.Show(rootDSE.ToString()); 
     try 
     { 
      SearchResultCollection collectedResult = ouSearch.FindAll(); 
      foreach (SearchResult temp in collectedResult) 
      { 
       comboBox1.Items.Add(temp.Properties["name"][0]); 
       DirectoryEntry ou = temp.GetDirectoryEntry(); 
      } 

L'errore che ottengo è Non fornitore non supporta la ricerca e non può cercare LDAP: // RootDSE qualche idea? per ognuno di quelli restituiti risultati di ricerca Voglio aggiungerli a una casella combinata. (non dovrebbe essere troppo difficile)

risposta

10

Non è possibile cercare sul livello LDAP://RootDSE - questo è solo un indirizzo "informativo" con alcune cose. In realtà non rappresenta alcuna posizione nella tua directory. Hai bisogno di legarsi al contesto di denominazione di default prima:

string defaultNamingContext; 

DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE"); 
defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString(); 

DirectoryEntry default = new DirectoryEntry("LDAP://" + defaultNamingContext); 

DirectorySearcher ouSearch = new DirectorySearcher(default, 
            "(objectClass=organizationalUnit)", 
            null, SearchScope.Subtree); 

Una volta fatto questo, si dovrebbe essere ok per trovare tutti i OU nel dominio.

E per velocizzare le cose, mi raccomando di non cercare usando objectClass - quella proprietà è non indicizzata in AD. Utilizzare objectCategory invece, che è indicizzato:

DirectorySearcher ouSearch = new DirectorySearcher(default, 
            "(objectCategory=Organizational-Unit)", 
            null, SearchScope.Subtree); 

UPDATE:
ho scoperto questo filtro è sbagliato - anche se il objectCategory è mostrato come CN=Organizational-Unit,..... nel ADSI browser, è necessario specificare objectCategory=organizationalUnit nella ricerca di esso per avere successo:

DirectorySearcher ouSearch = new DirectorySearcher(default, 
            "(objectCategory=organizationalUnit)", 
            null, SearchScope.Subtree); 
+0

Ho provato a cercare utilizzando il tuo suggerimento qui sopra, sembra una buona idea, anche se ha un noob che sta cercando di implementarlo. Ho cambiato l'impostazione predefinita in "dominio", che non ho potuto vedere se si trattava di un problema, il mio problema è che domain = System.DirectoryServices.DirectoryEntry, piuttosto che LDAP: // ... sebbene sia nella sua proprietà Path. –

+2

Ho pensato di aggiungere per chiunque lo trovi dopo. Server 2003 R2 e precedenti non facevano * not * index 'objectClass', comunque 2008 e versioni successive. Non un colpo contro la risposta! Solo nuove informazioni. Fonte: http://msdn.microsoft.com/en-us/library/ms675095(v=vs.85).aspx – klyd

Problemi correlati