c# - DirectoryServices.Protocols.SearchRequest 返回 GUID 的多个结果

标签 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=*)", ...

在我们的测试环境中,这行得通并且执行速度似乎更快,但我们的最终用户一直在报告问题。我已经从日志文件中获得了足够的诊断信息,可以确定问题是新查询返回了多个条目结果,而软件只需要一个条目结果,而这就是我目前要做的全部工作。

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

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

Example

解决方案是添加一个搜索过滤器,如

(&(objectClass=person))

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

关于c# - DirectoryServices.Protocols.SearchRequest 返回 GUID 的多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40793097/

相关文章:

c# - 如何使用 C# 在 Excel 中为标签提供自定义角度

c# - 如何在 Visual C# 中使用来自 mysql 的数据填充组合框

c# - 需要一种更好的方法将前导数字添加到 int 并返回数字数组

active-directory - Ldap 查询仅返回 1000 个用户...是的,我正在使用分页

c# - 如何在控制台应用程序中使用 UnityResolver?

c# - 使用 System.IO.Delete 从目录中删除某些文件?

c# - System.Numerics 是一个单独的程序集的原因

c# - 如何通过 Entity Framework 搜索对象及其子项?

java - 通过 LdapExtLoginModule 针对 Active Directory 林 (LDAP_REFERRAL) 进行身份验证

c# - 通过LDAP登录认证