🔍

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

に公開

前回の記事の続きです。

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