System.DirectoryServices.DirectorySearcher缓存改进或FindAll()过滤

问题描述 投票:0回答:1

我正在尝试提高对活动目录层次结构组结构的searcher.FindAll()调用的性能。

该代码获取所有用户组的SearchResultCollection,然后过滤搜索字符串上的组。 SearchResultCollection集合中有大约400个组,过滤下来的版本通常为40个。在迭代调用期间,我看不到内置缓存没有任何好处(DirectorySearcher.CacheResults = True)。

例如,如果我连续20次调用以下代码,则执行时间几乎相同。

  1. [我已经看到了此链接DirectorySearcher Filter,并且了解到在Searcher.Filter属性中通配符搜索无法使用DistinguishedName(我已经通过测试确认,我希望DirectorySearcher来处理过滤)
  2. 默认情况下,DirectorySearcher对象已启用缓存,但是在这里似乎根本没有帮助(无论如何我将其设置为True)
  3. 文档指出,如果结果很大,DirectorySearcher将决定不缓存,知道这个阈值是多少?

下面的代码每次执行时,对SearchResult的所有400次迭代都会受到相同的惩罚。

 string groupFilter = "ExampleFilter";
 DirectoryEntry root = GetRootDirectoryEntry();
 string userPath = GetUserPath(username, root);
 var searcher = new DirectorySearcher(root)
 {
    SearchScope = SearchScope.Subtree,
    Filter =  string.Format("(member:XXXX:={0})", userPath) + ""
    //Any wildcard based search for distinguishedname like below returns no results, which is incorrect        
    //Filter =  string.Format("(& (member:XXXX:={0}) (distinguishedname=*{1}) )", userPath, groupFilter)  
 };

 searcher.PropertiesToLoad.Add("Name");
 searcher.PropertiesToLoad.Add("distinguishedname");   
 var groupResults = searcher.FindAll();

 var allFilteredGroups = new HashSet<string>();

 foreach (SearchResult gr in groupResults) //approx 400 in the groupResults, same time penalty for every iteration, every time
 {
      var isRelevant = gr.Path.Contains(groupFilter);
      if (isRelevant)
      {
          //Do Stuff
          allFilteredGroups.Add(value); 
      }
  }

  return allFilteredGroups.ToList(); //approx 40

为什么缓存不提供任何改进?关于如何减少我不希望重复的所有这些组的任何建议?

c# active-directory ldap directoryservices directorysearcher
1个回答
0
投票

我假设您正在尝试仅包括来自特定OU的组?

您是正确的,不能使用部分distinguishedName进行过滤。但是,通过修改传递给SearchRootDirectorySearcher,只能在一个特定的OU中搜索。例如:

DirectoryEntry root = new DirectoryEntry("LDAP://OU=MyGroups,DC=example,DC=com");

DirectoryEntry指向MyGroups OU。因此,如果将其传递给DirectorySearcher,则它将仅在该OU中搜索。

如果您不希望它搜索子OU,也可以将SearchScope设置为OneLevelSubtree是默认设置,因此,如果您要这样做,则完全不需要设置。

即使您想在多个OU中查找组,最好还是对每个所需的OU重复搜索,而不是要求所有内容并丢弃大部分结果。

© www.soinside.com 2019 - 2024. All rights reserved.