2010-05-25 17 views
5

Estoy buscando poder obtener una lista de unidades organizativas actuales de Active Directory. He estado buscando algún código de ejemplo en línea por algún tiempo, pero parece que no puedo hacer que esto funcione.Adquiriendo la lista AD OU

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

El error que consigo es No proveedor no admite la búsqueda y no se puede buscar LDAP: // RootDSE alguna idea? para cada uno de esos resultados de búsqueda devueltos Quiero agregarlos a un cuadro combinado. (no debería ser demasiado difícil)

Respuesta

10

No puede buscar en el nivel LDAP://RootDSE, es solo una dirección "informativa" con algunas cosas. Realmente no representa ninguna ubicación en su directorio. Es necesario para enlazar con el contexto de nomenclatura predeterminado primera:

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 vez hecho esto, usted debe estar bien para encontrar todos los OU en su dominio.

Y con el fin de acelerar las cosas, yo recomendaría no busca usando objectClass - que la propiedad es no indexada en la EA. Utilice objectCategory lugar, que está indexado:

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

ACTUALIZACIÓN:
descubrí este filtro está mal - aunque el objectCategory se muestra como CN=Organizational-Unit,..... en el ADSI browser, es necesario que especifique objectCategory=organizationalUnit en la búsqueda de ella para tener éxito:

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

He intentado buscar utilizando su sugerencia anterior, parece una muy buena idea, aunque tiene un novato que intenta implementarla. Cambié el valor predeterminado a 'dominio', que no pude ver si había algún problema, mi problema es ese dominio = System.DirectoryServices.DirectoryEntry, en lugar de LDAP: // ... aunque eso está en su propiedad Path. –

+2

Solo pensé que agregaría para cualquiera que encuentre esto más tarde. Server 2003 R2 y versiones anteriores no * index * 'objectClass', sin embargo, 2008 y posteriores lo hacen. ¡No es un golpe en contra de la respuesta! Solo nueva información. Fuente: http://msdn.microsoft.com/en-us/library/ms675095(v=vs.85).aspx – klyd

Cuestiones relacionadas