【问题标题】:DirectoryServices.Protocols.SearchRequest returns multiple results for GUIDDirectoryServices.Protocols.SearchRequest 为 GUID 返回多个结果
【发布时间】: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


【解决方案1】:

问题在于您正在搜索的用户帐户下可能还有其他一些子对象。这些子对象可以没有 GUID,因此父对象的 GUID 会被继承。

例如 Exchange-Active-Sync-Devices(SCCM/InTune 设备关联):

解决方法是添加一个搜索过滤器

(&(objectClass=person))

然后您将只获得您正在搜索的用户帐户。

【讨论】:

    【解决方案2】:

    您是否考虑过使用 DirectoryEntry 类进行 GUID LDAP 绑定?

    如果代码只应在 AD 中找到单个条目,则使用该 GUID 进行绑定可能会更好。尽管您随后必须检索所有对象数据。

    DirectoryEntry entry = new DirectoryEntry("LDAP://<GUID=cc7dad71-fa6e-4ecc-87c5-b7a85b85e736>");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多