2011-07-17 19 views
8

utilizo este código:Si una unidad organizativa contiene 3000 usuarios, ¿cómo utilizar DirectorySearcher para encontrarlos?

DirectoryEntry objEntry; 
DirectorySearcher objSearchEntry; 
SearchResultCollection objSearchResult; 
string strFilter = "(&(objectCategory=User))"; 
objEntry = new DirectoryEntry(conOUPath, conUser, conPwd, AuthenticationTypes.Secure); 
objEntry.RefreshCache(); 
objSearchEntry = new DirectorySearcher(objEntry); 
objSearchEntry.Filter=strFilter; 
objSearchEntry.SearchScope=SearchScope.Subtree; 
objSearchEntry.CacheResults=false; 
objSearchResult=objSearchEntry.FindAll(); 

Cada vez, sólo se devuelven 1000 usuarios, pero hay 3000 usuarios de esa unidad organizativa.

¿Cómo puedo encontrar todas?

Respuesta

9

Si estás en .NET 3.5 o posterior, que debería echa un vistazo a la PrincipalSearcher y un director "de consulta por ejemplo" para hacer su búsqueda:

// create your domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=SomeOU,DC=YourCompany,DC=com"); 

// define a "query-by-example" principal - here, we search for a UserPrincipal 
// and with the first name (GivenName) of "Bruce" 
UserPrincipal qbeUser = new UserPrincipal(ctx); 
qbeUser.GivenName = "Bruce"; 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

// set the PageSize on the underlying DirectorySearcher to get all 3000 entries 
((DirectorySearcher)srch.GetUnderlyingSearcher()).PageSize = 500; 

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
} 

Si aún no lo ha - leer el artículo de MSDN absolutamente Managing Directory Security Principals in the .NET Framework 3.5 que muestra muy bien cómo hacer el mejor uso de la nuevas funciones en System.DirectoryServices.AccountManagement

Actualización:

Por supuesto, dependiendo de sus necesidades, es posible que desee especificar otras propiedades en ese principal "de consulta por ejemplo" usuario se crea:

  • Surname (o último nombre)
  • DisplayName (normalmente: nombre + espacio + apellido)
  • SAM Account Name - su/AD nombre de cuenta de Windows
  • User Principal Name - su "[email protected]" nombre de estilo

Puede especificar cualquiera de las propiedades en el UserPrincipal y utilizar los como "consulta por ejemplo" para su PrincipalSearcher.

Actualización n. ° 2: Si desea buscar dentro de una unidad organizativa determinada, puede definir esa unidad organizativa en el constructor de la PrincipalContext.

+0

pero quiero filtrar por unidad organizativa, y obtener un resultado de todo tipo es usuario en esa unidad organizativa, aquí no hay palabra clave para buscar – cciikk

+0

¡Es genial, gracias! – cciikk

+0

@cciikk: vea mi actualización: puede limitar su búsqueda a un contenedor específico definiéndolo en el constructor del 'PrincipalContext' –

6

Debe configurar el DirectorySearcher.PageSize property para poder devolver todos los resultados. Por ejemplo:

objSearchEntry.PageSize = 500; 

lo contrario, el número de artículos devueltos estará limitado por el límite en el lado del servidor, que es 1000 de forma predeterminada. También hay algo llamado SizeLimit, que puede establecer si desea limitar explícitamente el número de elementos devueltos. Si SizeLimit y PageSize son 0 (valores predeterminados), entonces usará SizeLimit predeterminado del lado del servidor. Un poco contra-intuitivo en mi opinión.

Si desea volver todos los resultados, la única manera es fijar PageSize a un valor distinto de cero y sizeLimit a 0.

+0

devuelve a todos los usuarios en el AD, ¿puede filtrar por el objectGUID de OU? – cciikk

+0

Luego debe vincular DirectorySearcher a DirectoryEntry que es la unidad organizativa que desea. es decir, objEntry debe ser la unidad organizativa en la que desea buscar usuarios. –

Cuestiones relacionadas