我不熟悉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(~1秒)中的ADO做同样的事情要慢得多
我意识到可能有更好的LDAP查询,但我想知道每个组的嵌套深度。
我也尝试使用PrincipalSearcher
等效,但性能同样糟糕。
我甚至尝试在运行时确定DomainController
并在连接时指定它(而不是在我的示例中指定无服务器连接)但是再次,性能是相同的。我也意识到我没有指定搜索根或类似的东西,但是我给它的信息与我给ADO完全相同。我还尝试了PageSize
和CacheResults
等无济于事......
我从基础COM对象中看到了一些例外..这些库只是在古代COM DLL之上的层吗?或者我在做一些愚蠢的事情?