Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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# 来自LDAP请求的SearchResultCollection的性能问题_C#_Ldap_Directoryservices_Directorysearcher - Fatal编程技术网

C# 来自LDAP请求的SearchResultCollection的性能问题

C# 来自LDAP请求的SearchResultCollection的性能问题,c#,ldap,directoryservices,directorysearcher,C#,Ldap,Directoryservices,Directorysearcher,我在自己创建的一个小型activedirectory搜索工具中遇到了一些性能问题 这个问题与其中一个非常相似,本质上我是通过以下代码从AD检索用户列表: DirectoryEntry dEntry = new DirectoryEntry("LDAP://ldappath"); DirectorySearcher searchdirectory = new DirectorySearcher(directory); searchdirectory.Filter = "(&(object

我在自己创建的一个小型
activedirectory
搜索工具中遇到了一些性能问题

这个问题与其中一个非常相似,本质上我是通过以下代码从AD检索用户列表:

DirectoryEntry dEntry = new DirectoryEntry("LDAP://ldappath");
DirectorySearcher searchdirectory = new DirectorySearcher(directory);

searchdirectory.Filter = "(&(objectClass=user)(objectcategory=person)(|(name=" + searchString + "*)(givenname=" + searchString + "*)(sn=" + searchString + "*)(mail=" + searchString + "*)(telephonenumber=" + searchString + "*)(samaccountname=" + searchString + "*)))";
searchdirectory.Sort.PropertyName = "name"; // Optional sorting by attribute
searchdirectory.SizeLimit = 100; // Sets the search limit
searchdirectory.PageSize = 1000; // Sets the results per returned page

SearchResultCollection collectionResults = searchdirectory.FindAll();

directory.Dispose();
searchdirectory.Dispose();

List<SearchResult> results = new List<SearchResult>();

for (int i = 0; collectionResults.Count > i; i++)
{
    results.Add(collectionResults[i]);
}

return results;
DirectoryEntry dEntry=newdirectoryEntry(“LDAP://ldappath”);
DirectorySearcher searchdirectory=新的DirectorySearcher(目录);
searchdirectory.Filter=“(&(objectClass=user)(objectcategory=person)(|(name=“+searchString+”*)(givenname=“+searchString+”*)(sn=“+searchString+”*)(mail=“+searchString+”*)(电话号码=“+searchString+”*)(samaccountname=“+searchString+”*));
searchdirectory.Sort.PropertyName=“name”;//按属性进行可选排序
searchdirectory.SizeLimit=100;//设置搜索限制
searchdirectory.PageSize=1000;//设置每个返回页面的结果
SearchResultCollection collectionResults=searchdirectory.FindAll();
Dispose()目录;
Dispose();
列表结果=新列表();
对于(int i=0;collectionResults.Count>i;i++)
{
结果。添加(收集结果[i]);
}
返回结果;
无论结果的数量(服务器是一个拥有大量资源的2012-R2虚拟机)或返回的属性是多少,上述操作都会立即返回
SearchResultCollection
,包括
SearchResultCollection.Count

对于所有属性的10个结果以及
searchString
为空,大约需要65毫秒,100个结果需要240毫秒,1000个结果需要1950毫秒。无论结果或搜索字符串是什么,搜索实际字符串似乎都会给任意数量的结果增加约350毫秒。搜索“a”似乎比搜索“*a”慢

这通常是非常好的,但在速度较慢的PC上,这可能需要30秒以上的时间才能得到50个结果

速度受
SearchResultCollection
中的内容影响,例如,如果我添加
searchdirectory.PropertiesToLoad.add(“cn”)
,则所需时间将减少一部分(1/10或更低)。因此,我假设问题源于
SearchResultCollection
中的数据量,以及将其缓存/移动到内存或类似位置所需的时间(编程方面仍然有点新)。 如果我更改搜索所用的字段,这也会产生很大的差异,但这不会造成差异,因为时间问题是在访问
SearchResultCollection
时,而不是在调用
FindAll()

我想知道并澄清的是,为什么在访问
SearchResultCollection
时需要时间,而在实际执行搜索时需要时间,据我所知,调用
FindAll()
时应该从LDAP检索所有结果

如果有人能以任何方式(通过示例或指向学习资源)帮助代码更高效地运行,而不会严重影响返回的属性或搜索参数,那也将是一件好事


我知道Powershell几乎可以立即检索这些详细信息,因此我认为一定有更好的方法来解决这个问题。

在.NET中,各种类型的列表在您实际访问列表之前不完全可用是很常见的。所以这一部分并不奇怪

此外,如果未设置
PropertiesToLoad
,则返回结果中每个帐户的所有具有值的属性。因此,最好只将
PropertiesToLoad
设置为所需的属性

是的,查询会影响性能。这取决于要搜索的属性。在这种情况下,
telephoneNumber
没有索引。这意味着它必须查看每个帐户以检查电话号码。我怀疑,如果您只是删除该条件,那么您的查询将更快

这可能对你有帮助,也可能没有帮助,但你可以看看。您可以在LDAP查询
(anr=“+searchString+”)
中使用它,AD将根据各种属性(在文档中列出)进行搜索

正如Ericlawault提到的,您应该处理结果。从:

由于实现限制,SearchResultCollection类 当其为垃圾时,无法释放所有非托管资源 要防止内存泄漏,必须调用Dispose方法 不再需要SearchResultCollection对象时


我认为这与此问题无关,但您应该明确释放SearchResultCollection对象用于防止内存泄漏的资源->
collectionResults.dispose()