AD で LDAP ユーザーを検索するとエラーが発生します。DirectorySearcher.SizeLimit = 1 に制限すると、結果 (1 件の結果が返されます) が返されます。ただし、SizeLimit を 1 より大きくすると (SizeLimit = 2 も)、次のエラーが発生します。このリクエストの期限が過ぎました」というエラーです。このエラーをデバッグするにはどうしたらよいか、またこのエラーが発生する原因として考えられるシナリオを教えてください。
また、このエラーは、DirectorySearcher.Filter に ID、名前、メールが含まれている場合にのみ発生することに注意してください。名前または ID またはメールのみで個別に検索している場合は、タイムアウト エラーは発生せず、結果が得られます。
ID、名前、メール アドレスを使用して検索「a」をフィルターします (タイムアウト エラーが発生します)。
(|
(&(|(objectClass=person)(objectCategory=user))(!objectCategory=computer)((|(samAccountname=a*)(givenname=a*)(mail=a*))))
(&(|(objectCategory=group)(objectClass=groupOfUniqueNames)(objectClass=groupOfNames))(!objectCategory=computer)(cn=a*))
)
ID で「a」を検索するためのフィルター (これはうまく機能します):
(|
(&(|(objectClass=person)(objectCategory=user))(!objectCategory=computer)(samAccountname=a*))
(&(|(objectCategory=group)(objectClass=groupOfUniqueNames)(objectClass=groupOfNames))(!objectCategory=computer)(cn=a*))
)
ありがとう
答え1
このクエリは適切に形成されておらず、冗長で誤った情報が含まれています。
私は objectCategory=person を指定します。そうすると、objectClass=user は objectCategory=person に含まれるため、必要ありません。
これを試してみるとよいでしょう:
(|
(&(objectCategory=person)(|(samAccountname=a*)(givenname=a*)(mail=a*)))
(&(|(objectCategory=group)(objectClass=groupOfUniqueNames)(objectClass=groupOfNames))(cn=a*))
)
また、次の点にも注意してください:
「...objectCategory と objectClass のどちらかを選択できる場合は、objectCategory を使用することをお勧めします。これは、objectCategory が単一の値を持ち、インデックスが付けられているのに対し、objectClass は複数の値を持ち、インデックスが付けられていないためです (Windows Server 2008 以降を除く)。objectCategory を使用したフィルターを使用するクエリは、objectClass を使用した同様のフィルターよりも効率的です。Windows Server 2008 ドメイン コントローラー (およびそれ以降) には、objectClass 属性にインデックスを付ける特別な動作があります。すべてのドメイン コントローラーが Windows Server 2008 である場合、またはクエリで Windows Server 2008 ドメイン コントローラーを指定する場合は、これを利用できます。」
http://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms677612%28v=vs.85%29.aspx