DirectoryServices.Protocols.SearchRequest为GUID返回多个结果

时间:2016-11-24 19:01:27

标签: c# .net active-directory directoryservices

我正在编写与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=*)", ...

在我们的测试环境中,这种工作似乎更快,但我们的最终用户一直在报告问题。我从日志文件中获取了足够的诊断信息,以确定问题是新查询返回多个Entry结果,其中软件只期望一个,这就是我现在必须处理的全部内容。

有谁知道额外结果的来源是什么?我的理解是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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

问题是您正在搜索的用户帐户下面可能存在其他一些子对象。

这些子对象没有GUID,因此父对象的GUID被继承。

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

Example

解决方案是添加类似

的搜索过滤器
(&(objectClass=person))

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