0

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

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

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

  1. 我已经看到此链接DirectorySearcher Filter并了解 DistinguishedName 不可用于 Searcher.Filter 属性中的通配符搜索(我已通过测试确认,我希望 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

为什么缓存没有提供任何改进?关于如何减少迭代所有这些我知道我不想要的组的惩罚的任何建议?

4

1 回答 1

0

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

您是正确的,您不能按部分过滤distinguishedName。但是,您可以通过修改SearchRoot传递给的 来仅在一个特定的 OU 中进行搜索DirectorySearcher。例如:

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

DirectoryEntry指向MyGroupsOU。所以如果你把它传递给DirectorySearcher,那么它只会在那个 OU 中搜索。

如果您不希望它搜索子 OU,也可以设置SearchScope为。是默认值,所以如果这是你想要的,你根本不需要设置它。OneLevelSubtree

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

于 2020-03-03T14:21:42.707 回答