【发布时间】:2016-11-24 19:01:26
【问题描述】:
我正在编写与 Microsoft Active Directory 集成的软件。以前,我们使用以下查询搜索具有 DirectoryServices.Protocols.SearchRequest 的特定用户:
var request = new SearchRequest("DC=corp,DC=spring,DC=lan", "(objectGUID=\71\ad\7d\cc\6e\fa\cc\4e\87\c5\b7\a8\5b\85\e7\36)", ...
但是我们发现它可能会很慢,具体取决于树中对象的数量,因此我们切换到:
var request = new SearchRequest("<GUID=cc7dad71-fa6e-4ecc-87c5-b7a85b85e736>", "(objectCategory=*)", ...
在我们的测试环境中,这很有效,而且执行速度似乎更快,但我们的最终用户一直在报告问题。我从日志文件中获得了足够的诊断信息,以确定问题是新查询返回了多个条目结果,而软件只需要一个条目结果,而这就是我目前要做的全部工作。
有谁知道额外结果的来源可能是什么?我的理解是 objectGUID 在 Active Directory 环境中应该是唯一的。
更新 - 实际代码:
SearchResultEntryCollection results = null;
try
{
var request = new SearchRequest("<GUID=cc7dad71-fa6e-4ecc-87c5-b7a85b85e736>", "(objectCategory=*)",
SearchScope.Subtree, new[] { "sAMAccountName", "objectGUID", "cn", "mail", "telephoneNumber" } );
var response = this._connection.SendRequest(request) as SearchResponse;
if (response != null && response.ResultCode == ResultCode.Success && response.Entries != null)
{
results = response.Entries;
return results;
}
errorMessage = response != null && !string.IsNullOrWhiteSpace(response.ErrorMessage)
? response.ErrorMessage
: "Unknown Error"
}
catch (DirectoryException e)
{
errorMessage = e.Message;
}
//other error handling
【问题讨论】:
-
Guid 绑定应该只返回一个结果,因为 guid 是唯一的。这是绝对正确的。你能提供你用来查找用户的代码 sn-p 吗?此外,一种方法是跟踪/记录属性以确定您获得的用户。我自己使用与 searchrequest 类的 guid 绑定作为用户搜索的最快方式,并且以前从未遇到过类似的问题。无论如何,请提供您的研究结果。
-
唯一合法的方法是,如果对象太大,将对象属性分为两个条目。使用 dirsync 控件时遇到类似的情况。所以第一个条目将包含对象属性的前半部分,第二个条目 - 对应的后半部分。您是查询整个对象及其所有属性,还是限制属性范围?
-
@oldovets 我只是在找一些属性,即:sAMAccountName、objectGUID、cn、mail、telephoneNumber
-
@bootsman
searching for specific users- 如果您只想获取用户对象,搜索每个 objectCategory 可能效率很低。我似乎也无法理解您在提供的两个示例之间的整个 Base DN/Filter 情况。你期望找到什么,你最终会得到什么? -
在我的代码中,我还将 ProtocolVersion 设置为 3(位于 LdapConnecton.SearchOptions),并将带有 SearchOption.DomainScope 标志的 SearchOptionControl 添加到搜索请求中。我的代码也依赖于 PageResultRequestControl。也许这会有所帮助
标签: c# .net active-directory directoryservices