I created a small tool to mirror AD data into an SQL Server database. The AD queries essentially looked like this
var conn = new ADODB.Connection();
conn.Open("Provider=ADsDSOObject", "", "", 0);
const string where = "objectCategory='group' ";
var qry = string.Format(@"SELECT objectCategory, displayName, [more attributes]
FROM 'LDAP://{0}/{1}'
WHERE {2}", server, start, where);
object recs;
var rs = conn.Execute(qry, out recs, 0);
for (; !rs.EOF; rs.MoveNext())
{
// ... process record
}
The attributes available in AD have been taken from here.
The code worked fine for many months, until one day it threw an exception:
System.Runtime.InteropServices.COMException (0x80072023): The size limit for this request was exceeded.
at ADODB.RecordsetClass.MoveNext()
It turned out that the query result suddenly exceeded 3000 records, which may or may not be a magic or configurable limit of fetches for a single AD query – probably also including the number of records each fetch returns. Who knows.
Thanks goes to the internetz, which provided me with a solution which now fetches more than 3000 records. Just replace the conn.Execute() part with
var cmd = new ADODB.Command {ActiveConnection = conn, CommandText = qry};
cmd.Properties["Page Size"].Value = 10000;
cmd.Properties["Timeout"].Value = 30;
cmd.Properties["Cache Results"].Value = false;