2016-11-24 39 views
2

我正在编写与Microsoft Active Directory集成的软件。以前,我们用DirectoryServices.Protocols.SearchRequest使用类似的查询搜索特定的用户:DirectoryServices.Protocols.SearchRequest为GUID返回多个结果

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 
+0

guid绑定shuld只返回一个结果,因为guid是唯一的。这是绝对正确的。你能提供你用来查找用户的代码片段吗?另外,一种方法是跟踪/记录属性以确定你得到的用户。我自己使用guid绑定searchrequest类作为用户搜索的最快方式,并且从未遇到类似的问题。无论如何,请提供您的研究结果。 – oldovets

+0

唯一合法的方法是,如何将对象属性分成两个条目,如果对象太大。在使用目录同步控制时遇到类似的情况。所以第一个条目将包含前半部分的对象属性,第二个条目 - 后半部分相应地包含。你是用整个属性查询整个对象还是限制属性范围? – oldovets

+0

@oldovets我只是在寻找一些属性,即:sAMAccountName,objectGUID,cn,mail,telephoneNumber – bootsman

回答

0

你有没有考虑使用DirectoryEntry类做一个GUID LDAP绑定?

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

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

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

例如Exchange的Active-同步设备(SCCM/Intune的设备关联):

Example

的解决方案是增加一个搜索过滤器像

(&(objectClass=person)) 

,然后你会只获取您正在搜索的用户帐户。