表现:DirectorySearcher vs PrincipalSearcher vs ...?

时间:2013-12-05 14:36:03

标签: c# .net performance active-directory directoryservices

我不熟悉C#,但我很乐意写它。

我正在使用System.DirectoryServices.DirectorySearcherSystem.DirectoryServices.AccountManagement.PrincipalSearcher进行一些基本的ActiveDirectory查找。我正在尝试的练习是递归地将一组中的组,即:

static void Main(){
      DirectorySearcher ds = new DirectorySearcher(
         new DirectoryEntry("LDAP://region.company.com"));
      ds.Filter = "(&(objectCategory=group)(cn=" + myGroupName + "))";
      ds.PropertiesToLoad.Add("member");
      ds.PropertiesToLoad.Add("distinguishedname");
      SearchResult r = ds.FindOne();
      getNestedGroups(ref ds, r.Properties["member"]);
}

private void getNestedGroups(ref DirectorySearcher ds, ResultPropertyValueCollection member){
    foreach (string s in member) {
        ds.Filter = "(&(objectCategory=group)(distinguishedname=" + s + "))";
        SearchResult r = ds.FindOne();//if we find something, s is a group, so go inside it
        if (r != null) {
            Console.WriteLine(r.GetDirectoryEntry().Properties["distinguishedname"].ToString());
            getNestedGroups(ref ds, r.Properties["member"]);
        }

    }
}

我正在使用的示例是一个总共有大约6个嵌套组(3个深度)的组,我意识到代码正在考虑可能超过150个'成员'而不是组...这就是'的性质'成员的财产,但这是无法忍受的缓慢..大约20秒。这比使用VBA或VBScript(~1秒)中的ADO做同样的事情要慢得多

我意识到可能有更好的LDAP查询,但我想知道每个组的嵌套深度。

我也尝试使用PrincipalSearcher等效,但性能同样糟糕。

我甚至尝试在运行时确定DomainController并在连接时指定它(而不是在我的示例中指定无服务器连接)但是再次,性能是相同的。我也意识到我没有指定搜索根或类似的东西,但是我给它的信息与我给ADO完全相同。我还尝试了PageSizeCacheResults等无济于事......

我从基础COM对象中看到了一些例外..这些库只是在古代COM DLL之上的层吗?或者我在做一些愚蠢的事情?

0 个答案:

没有答案
相关问题