首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >以编程方式检索Active Directory数据的速度比CSVDE或.NET更快

以编程方式检索Active Directory数据的速度比CSVDE或.NET更快
EN

Stack Overflow用户
提问于 2018-12-06 03:18:44
回答 1查看 283关注 0票数 -1

我是一名开发人员,正在寻找从域控制器检索Active Directory数据的最高性能方法。在过去,我曾经尝试过CSVDE,我还使用过.NET和LDIFDE命令行工具。

有没有一种更高效、更高性能的编程方式?如果有必要,我甚至愿意使用C++进行系统级编程。

我问这个问题的原因是,我正在构建一个应用程序,用于查找并报告客户端Windows网络上的潜在安全问题。

EN

回答 1

Stack Overflow用户

发布于 2018-12-06 04:38:46

.NET的System.DirectoryServices命名空间(例如DirectoryEntry/DirectorySearcher)是本机Windows Active Directory服务接口(ADSI)上的包装器。唯一的性能问题是它是一个包装器(在本机C++之上的.NET组件)。

但这并不是性能瓶颈所在。当您从AD执行报告时,最大的性能影响来自网络请求,因此性能的关键是将网络请求保持在最小和/或运行报告尽可能靠近域控制器,以最大限度地减少往返时间。

System.DirectoryServices.AccountManagement命名空间(例如UserPrincipal)是System.DirectoryServices之上的包装器,根据我的经验,它非常慢,因为您无法控制有多少请求发送到AD (例如,它通常会获取AD对象的所有属性,即使您从未使用它们)。

如果您想要性能,请使用System.DirectoryServices。要保持性能,需要记住以下几点:

  1. 在使用DirectorySearcher时,请始终向PropertiesToLoad添加一些内容。如果您不请求任何内容,它将返回所有具有使用属性缓存的value.
  2. DirectoryEntry的属性。如果您访问DirectoryEntry.Properties,它将检查其缓存中是否已有该属性。如果不是,它将向AD请求每个具有值的属性。要避免这种情况,可以使用DirectoryEntry.RefreshCache()使用特定属性填充缓存,如下所示:

代码语言:javascript
复制
de.RefreshCache(new[] {"company", "sAMAccountName"});
var company = de.Properties["company"]?.Value as string;
var username = de.Properties["sAMAccountName"].Value as string;

  1. 由于1& 2的原因,在浏览搜索结果时,不要仅仅为了阅读Properties而使用SearchResult.GetDirectoryEntry()。否则,您最终将返回AD来获取在搜索过程中可能获得的属性。
  2. 如果你在做一份报告,你可能会遍历许多账户,这是一个很大的处理过程。这意味着在循环结束之前,.NET的垃圾回收器没有时间运行。因此,在转到下一个帐户之前,请确保清除您创建的DirectoryEntry对象(手动创建,或将它们放入using语句中)。否则您的程序将消耗大量内存(这就发生在我身上)。
  3. 当使用DirectorySearcher.FindAll()时,请确保处理结果(同样,通过调用.Dispose()或将其放在using语句中)。文档说,如果不这样做,最终将导致内存泄漏。

可能有更多的东西可以说,但这取决于你到底在做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53639302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档