2009-06-26 21 views
5

El directorio activo que tengo que tratar se presenta como tal: el dominio contiene muchas OU. Una de estas OU se denomina "OU primaria". Dentro de esta unidad organizativa hay varias unidades organizativas nombradas con la ubicación de las oficinas globales (es decir, "Chicago", "París").Consulta LDAP para todos los usuarios en sub OU dentro de una unidad organizativa particular

Cualquier cuenta de usuario que sea una persona real de carne y hueso se coloca en la OU nombrada para la oficina en la que trabajan como su OU principal. Cualquier cuenta de usuario que sea un alias, una cuenta genérica o que no esté directamente vinculada a una persona real, tiene la unidad organizativa "OU principal" establecida como su unidad organizativa principal.

En cuanto a los datos, esta distinción OU primaria es lo único que indica qué usuarios son personas reales y qué usuarios no. No hay ningún grupo que solo contenga personas reales, ningún indicador en ningún campo de que sean personas reales o no, y está estrictamente prohibido realizar cambios en el directorio activo o en cualquier cuenta de usuario.

Mi tarea es escribir una consulta que solo obtendrá todas las personas reales de carne y hueso.

Desafortunadamente LDAP no es exactamente mi punto fuerte y la única forma en que se me ocurrió es buscar cada una de estas unidades organizativas de oficina individualmente y juntar todos los resultados, pero hay muchas oficinas y requeriría una cambie a la consulta si se agregaron oficinas, lo cual debo evitar.

¿Hay alguna manera de consultar a todos los usuarios dentro de las unidades organizativas "sub" de una OU en particular, pero no devolver ningún usuario directamente en la unidad organizativa principal?

+0

Lo entorno de programación? .RED ?? .NET 2.0 o .NET 3.5 ?? –

+0

Estoy buscando la consulta LDAP, pero en última instancia usaré el objeto DirectorySearcher en .NET 3.5 para ejecutar la consulta – kscott

Respuesta

9

Sí, claro - que tendría que:

1) se unen a lo particular OU

DirectoryEntry myOU = new DirectoryEntry("LDAP://OU=MyOU,......,DC=MyCompany,DC=com"); 

2) Enumerar de todos sus sub-OU

DirectorySearcher subOUsearcher = new DirectorySearcher(myOU); 
subOUsearcher.SearchScope = SearchScope.OneLevel; // don't recurse down 
subOUsearcher.Filter = "(objectClass=organizationalUnit)"; 

foreach(SearchResult subOU in subOUsearcher.FindAll()) 
{ 
    // stick those Sub OU's into a list and then handle them 
} 

3) One- uno por uno enumera todos los usuarios en cada uno de los sub-OU y los pega en una lista global de usuarios

DirectorySearcher userSearcher = new DirectorySearcher(myCurrentSubOu); 
userSearcher.SearchScope = SearchScope.OneLevel; // don't recurse down 
userSearcher.Filter = "(objectClass=user)"; 

foreach(SearchResult user in userSearcher.FindAll()) 
{ 
    // stick those users into a list being built up 
} 

4) devolver esa lista

Marc

+0

Esa puede ser la forma en que tengo que ir, solo tenía curiosidad por saber si había algún tipo de forma de hacerlo. escriba una consulta para devolver a todos los usuarios de una vez, algo así como quizás una configuración de búsquedaScope que solo busque OU secundarias y no la principal. – kscott

+0

No, no creo que puedas hacer esto en una sola solicitud: tendrás que tomar tu información poco a poco :-) –

+0

Solo en caso de que alguien más se encuentre con esto como yo lo hice: debes asegurarte de que en paso 3) anterior "myCurrentSubOu" es del tipo DirectoryEntry - Usé la propiedad Path del subOU que es de tipo string. Como también hay una sobrecarga para el constructor DirectorySearcher que acepta cadena (un filtro), esto puede llevar a un comportamiento aparentemente extraño. – Gorgsenegger

6
// Create a new DirectorySearcher that starts at the root. 
// You can start it anywhere you want though 
//  by providing a value in the DirectoryEntry constructor. 
DirectorySearcher searcher = new DirectorySearcher(new DirectoryEntry()); 

// Set the scope to Subtree in order to search all children. 
searcher.SearchScope = SearchScope.Subtree; 

// Set the filter to only look for Organizational Units 
//  that have the name you are looking for. 
searcher.Filter = "(&(objectClass=organizationalUnit)(name=" + ouName + "))"; 

// If you are looking for only one result then do the following two things. 
SearchResult result = searcher.FindOne(); 

DirectoryEntry newDir = result.GetDirectoryEntry(); 
Cuestiones relacionadas