からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

DirectorySearcher の PageSize と SizeLimit をいじってみる

前回の記事の続きです。

blog.karamem0.jp

Active Directory のすべてのユーザー オブジェクトを列挙する次のようなコードを考えてみます。

public static class Program {

    private static void Main(string[] args) {
        using (var entry = new DirectoryEntry("LDAP://domain.local/DC=domain,DC=local"))
        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 件まで取得できないという制限があるからです。

gallery.technet.microsoft.com

これを解決するには PageSize プロパティに 0 以上の値を設定します。これによって、内部的にページングが行われ、すべてのオブジェクトが返されます。
また、指定した件数のみ取り出したい場合は、SizeLimit プロパティを使います。ただし、SizeLimit が有効になるのは、PageSize が 0 または PageSize > SizeLimit の場合で、SizeLimit は 1000 までしか有効になりません。MSDN にも、

SizeLimit を、サーバーが決定する 1000 エントリの既定値よりも大きい値に設定した場合は、サーバーが決定する既定値が使用されます。

とあるので、その通りだと思うのですが、1000 件を超える場合で件数絞りたいときは困るなあと思ったり。内部でページングしてなければ何とかできそうではあるのですが。