Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 性能:DirectorySearcher vs.PrincipalSearcher vs。。。?_C#_.net_Performance_Active Directory_Directoryservices - Fatal编程技术网

C# 性能:DirectorySearcher vs.PrincipalSearcher vs。。。?

C# 性能:DirectorySearcher vs.PrincipalSearcher vs。。。?,c#,.net,performance,active-directory,directoryservices,C#,.net,Performance,Active Directory,Directoryservices,我对C#没有那么丰富的经验,但我写起来很舒服 我正在使用System.DirectoryServices.DirectorySearcher和System.DirectoryServices.AccountManagement.PrincipalSearcher进行一些基本的ActiveDirectory查找。我尝试的练习是递归地获取给定组中的组,即: static void Main(){ DirectorySearcher ds = new DirectorySearcher(

我对C#没有那么丰富的经验,但我写起来很舒服

我正在使用
System.DirectoryServices.DirectorySearcher
System.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中使用ADO执行相同的操作要慢得多(约1秒)

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

我还使用
PrincipalSearcher
尝试了类似的方法,但性能同样糟糕

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

我看到了一些来自底层COM对象的异常。。这些库只是古代COM DLL之上的层吗?还是我在做傻事