からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

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

前回の記事の続きです。

blog.karamem0.jp

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 件まで取得できないという制限があるからです。

gallery.technet.microsoft.com

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

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

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