🔍

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

2022/01/01に公開

前回の記事の続きです。

https://zenn.dev/karamem0/articles/2011_06_28_000000

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

https://docs.microsoft.com/ja-jp/dotnet/api/system.directoryservices.directorysearcher?WT.mc_id=M365-MVP-5002941

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

https://docs.microsoft.com/ja-jp/dotnet/api/system.directoryservices.directorysearcher.sizelimit?WT.mc_id=M365-MVP-5002941

If you set SizeLimit to a value that is larger than the server-determined default of 1000 entries, the server-determined default is used.

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

Discussion