前回の記事の続きです。
Active Directory のすべてのユーザー オブジェクトを列挙する次のようなコードを考えてみます。
public static class Program { private static void Main(string[] args) { using (var entry = new DirectoryEntry("LDAP://example.com/DC=example,DC=com")) using (var searcher = new DirectorySearcher(entry)) { searcher.Filter = "(objectClass=user)"; using (var result = searcher.FindAll()) { foreach (var user in result .Cast<SearchResult>() .Select(x => x.GetDirectoryEntry())) { Console.WriteLine(user.Properties["name"].Value); } } } Console.ReadKey(); } }
実はこのコードには不具合があります。というのも、Active Directory の LDAP 検索では 1000 件まで取得できないという制限があるからです。
これを解決するには PageSize プロパティに 0 以上の値を設定します。これによって、内部的にページングが行われ、すべてのオブジェクトが返されます。
また、指定した件数のみ取り出したい場合は、SizeLimit プロパティを使います。ただし、SizeLimit が有効になるのは、PageSize が 0 または PageSize > SizeLimit の場合で、SizeLimit は 1000 までしか有効になりません。MSDN にも、
SizeLimit を、サーバーが決定する 1000 エントリの既定値よりも大きい値に設定した場合は、サーバーが決定する既定値が使用されます。
とあるので、その通りだと思うのですが、1000 件を超える場合で件数絞りたいときは困るなあと思ったり。内部でページングしてなければ何とかできそうではあるのですが。