Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DirectoryServices.Protocols.SearchRequest返回GUID的多个结果_C#_.net_Active Directory_Directoryservices - Fatal编程技术网

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

C# DirectoryServices.Protocols.SearchRequest返回GUID的多个结果,c#,.net,active-directory,directoryservices,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)", ... 但是,我们发现根据树中对象的数量,速度可

我正在编写与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=*)", ...
var request=newsearchrequest(“,”(objectCategory=*)”。。。
在我们的测试环境中,这起作用并且似乎执行得更快,但我们的最终用户一直在报告问题。我从日志文件中获得了足够的诊断信息,以确定问题在于新查询返回的输入结果不止一个,而软件只希望返回一个,这就是我在e时刻

有人知道额外结果的来源吗?我的理解是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
SearchResultEntryCollection结果=null;
尝试
{
var request=newsearchrequest(“,”(objectCategory=*)”,
SearchScope.Subtree,新[]{“sAMAccountName”、“objectGUID”、“cn”、“mail”、“telephoneNumber”});
var response=此._connection.SendRequest(请求)作为SearchResponse;
if(response!=null&&response.ResultCode==ResultCode.Success&&response.Entries!=null)
{
结果=响应。条目;
返回结果;
}
errorMessage=response!=null&&!string.IsNullOrWhiteSpace(response.errorMessage)
?response.ErrorMessage
:“未知错误”
}
捕获(目录异常e)
{
errorMessage=e.消息;
}
//其他错误处理

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

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

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

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

例如,Exchange活动同步设备(SCCM/InTune设备关联):

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

(&(objectClass=person))

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

Guid绑定应该只返回一个结果,因为Guid是唯一的。这是绝对正确的。您可以提供用于查找用户的代码段吗?另外,一种方法是跟踪/记录属性以确定您获得的用户。我自己将Guid绑定与searchrequest类一起使用作为一种最快的用户搜索方式,以前从未遇到过类似的问题。无论如何,请提供您的研究结果。唯一合法的方法是,如果对象太大,将对象属性分为两个条目。在使用dirsync控件时遇到过类似的情况。因此,第一个条目将包含前半部分对象属性的第二个条目-对应的第二个条目。是否查询整个对象及其所有属性,或限制属性范围?@oldovets我只查找一些属性,即:sAMAccountName、objectGUID、cn、mail、,telephoneNumber@bootsman
搜索特定用户
-可能是qui如果您只想获取用户对象,则搜索每个objectCategory的效率很低。我似乎无法理解您在提供的两个示例之间的整个基本DN/筛选器情况。您希望找到什么以及最终得到什么?在我的代码中,我还将ProtocolVersion设置为3(位于LdapConnecton.SearchOptions)并添加了带有SearchOption.DomainScope标志的SearchOptionControl来搜索请求。另外,我的代码依赖于PageResultRequestControl。这可能会有所帮助