c# - single - login asp net
¿Puedo obtener más de 1000 registros de un DirectorySearcher en ASP.NET? (1)
Me di cuenta de que la lista de resultados se limita a 1000. Tengo más de 1000 grupos en mi dominio (ENORME dominio). ¿Cómo puedo obtener más de 1000 registros? ¿Puedo comenzar en un registro posterior? ¿Puedo cortarlo en múltiples búsquedas?
Aquí está mi consulta:
DirectoryEntry dirEnt = new DirectoryEntry("LDAP://dhuba1kwtn004");
string[] loadProps = new string[] { "cn", "samaccountname", "name", "distinguishedname" };
DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps);
var results = srch.FindAll();
He intentado establecer srch.SizeLimit = 2000; , pero eso no parece funcionar. ¿Algunas ideas?
Debe establecer DirectorySearcher.PageSize en un valor distinto de cero para obtener todos los resultados.
Por cierto, también debe disponer DirectorySearcher cuando haya terminado con él
using(DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
srch.PageSize = 1000;
var results = srch.FindAll();
}
La documentación de la API no es muy clara, pero esencialmente:
cuando hace una búsqueda paginada, SizeLimit se ignora, y todos los resultados coincidentes se devuelven al iterar a través de los resultados devueltos por FindAll. Los resultados se recuperarán del servidor página por página. Elegí el valor de 1000 anterior, pero puede usar un valor menor si lo prefiere. La desventaja es que usar un tamaño de página pequeño devolverá cada página de resultados más rápido, pero requerirá llamadas más frecuentes al servidor cuando se repite una gran cantidad de resultados.
por defecto, la búsqueda no está paginada (PageSize = 0). En este caso, se devuelve hasta los resultados de SizeLimit.
Como señaló Biri, es importante disponer de SearchResultCollection devuelto por FindAll; de lo contrario, es posible que tenga una pérdida de memoria como se describe en la sección Observaciones de la documentación de MSDN para DirectorySearcher.FindAll: http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx
Una forma de ayudar a evitar esto en .NET 2.0 o posterior es escribir un método de envoltura que elimine automáticamente SearchResultCollection. Esto podría parecerse a lo siguiente (o podría ser un método de extensión en .NET 3.5):
public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
{
using(SearchResultCollection results = searcher.FindAll())
{
foreach (SearchResult result in results)
{
yield return result;
}
} // SearchResultCollection will be disposed here
}
A continuación, puede usar esto de la siguiente manera:
using(DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
srch.PageSize = 1000;
var results = SafeFindAll(srch);
}