🔍
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