🔍
DirectorySearcher の PageSize と SizeLimit をいじってみる
前回の記事の続きです。
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 件まで取得できないという制限があるからです。
これを解決するには PageSize
プロパティに 0 以上の値を設定します。これによって、内部的にページングが行われ、すべてのオブジェクトが返されます。また、指定した件数のみ取り出したい場合は、SizeLimit
プロパティを使います。ただし、SizeLimit
が有効になるのは、PageSize
が 0 または PageSize > SizeLimit
の場合で、SizeLimit
は 1,000 までしか有効になりません。Microsoft のドキュメントにも以下の記載があります。
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