読者です 読者をやめる 読者になる 読者になる

からめもぶろぐ。

ワタシ SharePoint チョット デキル

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

C#

前回の記事の続きです。

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 件を超える場合で件数絞りたいときは困るなあと思ったり。内部でページングしてなければ何とかできそうではあるのですが。