@@ -101,7 +101,7 @@ public static List<LdapGroup> GetGroups(string? name = null)
101101 var searchResults = SearchActiveDirectory ( filter , Server . OU , ObjectType . Group ) ;
102102 List < LdapGroup > groups = new ( ) ;
103103
104- foreach ( SearchResultEntry e in searchResults . Entries )
104+ foreach ( SearchResultEntry e in searchResults )
105105 {
106106 groups . Add ( new LdapGroup ( e ) ) ;
107107 }
@@ -120,9 +120,9 @@ public static List<LdapGroup> GetGroups(string? name = null)
120120 string filter = string . Format ( "(&(objectClass=group)(distinguishedName={0}))" , dn ) ;
121121 var searchResults = SearchActiveDirectory ( filter , Server . OU , ObjectType . Group ) ;
122122 LdapGroup ? group = null ;
123- if ( searchResults . Entries . Count == 1 )
123+ if ( searchResults . Count == 1 )
124124 {
125- group = new LdapGroup ( searchResults . Entries [ 0 ] ) ;
125+ group = new LdapGroup ( searchResults [ 0 ] ) ;
126126 }
127127
128128 return group ;
@@ -160,7 +160,7 @@ public static List<LdapUser> GetUsers(bool fromOu = false, string? name = null,
160160 var searchResults = SearchActiveDirectory ( filter , fromOu ? Server . OU : Server . AD3 , ObjectType . Person ) ;
161161
162162 List < LdapUser > users = new ( ) ;
163- foreach ( SearchResultEntry result in searchResults . Entries )
163+ foreach ( SearchResultEntry result in searchResults )
164164 {
165165 users . Add ( new LdapUser ( result ) ) ;
166166 }
@@ -180,7 +180,7 @@ public static List<LdapUser> GetUsers(bool fromOu = false, string? name = null,
180180 string . Format ( "(&(objectClass=user)(samAccountName={0}))" , samAccountName ) ,
181181 fromOu ? Server . OU : Server . AD3 ,
182182 ObjectType . Person ) ;
183- return searchResults . Entries . Count == 1 ? new LdapUser ( searchResults . Entries [ 0 ] ) : null ;
183+ return searchResults . Count == 1 ? new LdapUser ( searchResults [ 0 ] ) : null ;
184184 }
185185
186186 /// <summary>
@@ -196,11 +196,11 @@ public static List<LdapUser> GetGroupMembership(string groupDn)
196196 var ouSearchResults = SearchActiveDirectory ( filter , Server . OU , ObjectType . Person ) ;
197197 var ad3SearchResults = SearchActiveDirectory ( filter , Server . AD3 , ObjectType . Person ) ;
198198
199- foreach ( SearchResultEntry result in ouSearchResults . Entries )
199+ foreach ( SearchResultEntry result in ouSearchResults )
200200 {
201201 users . Add ( new LdapUser ( result ) ) ;
202202 }
203- foreach ( SearchResultEntry result in ad3SearchResults . Entries )
203+ foreach ( SearchResultEntry result in ad3SearchResults )
204204 {
205205 users . Add ( new LdapUser ( result ) ) ;
206206 }
@@ -277,7 +277,7 @@ private static List<LdapUser> SortUsers(List<LdapUser> users)
277277 /// <param name="ou"></param>
278278 /// <param name="groupProperties"></param>
279279 /// <returns></returns>
280- private static SearchResponse SearchActiveDirectory ( string searchFilter , Server server , ObjectType objectType )
280+ private static List < SearchResultEntry > SearchActiveDirectory ( string searchFilter , Server server , ObjectType objectType )
281281 {
282282 var ldapIdentifier = server == Server . OU
283283 ? new LdapDirectoryIdentifier ( _ouServer , port )
@@ -292,12 +292,32 @@ private static SearchResponse SearchActiveDirectory(string searchFilter, Server
292292 using var lc = new LdapConnection ( ldapIdentifier , new System . Net . NetworkCredential ( _username , cred , "ad3.ucdavis.edu" ) ) ;
293293 lc . SessionOptions . ProtocolVersion = 3 ;
294294 lc . SessionOptions . SecureSocketLayer = true ;
295- lc . SessionOptions . VerifyServerCertificate = ( connection , certificate ) => true ;
296295 lc . Bind ( ) ;
297296
298297 var searchRequest = new SearchRequest ( searchStart , searchFilter , SearchScope . Subtree , props ) ;
299- var response = ( SearchResponse ) lc . SendRequest ( searchRequest ) ;
300- return response ;
298+ // AD caps a single search at 1000 entries; use paging to retrieve all results.
299+ var pageRequest = new PageResultRequestControl ( 1000 ) ;
300+ searchRequest . Controls . Add ( pageRequest ) ;
301+
302+ var entries = new List < SearchResultEntry > ( ) ;
303+ while ( true )
304+ {
305+ var response = ( SearchResponse ) lc . SendRequest ( searchRequest ) ;
306+ foreach ( SearchResultEntry entry in response . Entries )
307+ {
308+ entries . Add ( entry ) ;
309+ }
310+
311+ var pageResponse = response . Controls
312+ . OfType < PageResultResponseControl > ( )
313+ . FirstOrDefault ( ) ;
314+ if ( pageResponse == null || pageResponse . Cookie . Length == 0 )
315+ {
316+ break ;
317+ }
318+ pageRequest . Cookie = pageResponse . Cookie ;
319+ }
320+ return entries ;
301321 }
302322 }
303323}
0 commit comments