搜索 Active Directory 帐户时,System.Runtime.InteropServices.COMException:已超出此请求的时间限制

搜索 Active Directory 帐户时,System.Runtime.InteropServices.COMException:已超出此请求的时间限制

当我在 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

相关内容