我是一名开发人员,正在寻找从域控制器检索Active Directory数据的最高性能方法。在过去,我曾经尝试过CSVDE,我还使用过.NET和LDIFDE命令行工具。
有没有一种更高效、更高性能的编程方式?如果有必要,我甚至愿意使用C++进行系统级编程。
我问这个问题的原因是,我正在构建一个应用程序,用于查找并报告客户端Windows网络上的潜在安全问题。
发布于 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
。要保持性能,需要记住以下几点:
DirectorySearcher
时,请始终向PropertiesToLoad
添加一些内容。如果您不请求任何内容,它将返回所有具有使用属性缓存的value.DirectoryEntry
的属性。如果您访问DirectoryEntry.Properties
,它将检查其缓存中是否已有该属性。如果不是,它将向AD请求每个具有值的属性。要避免这种情况,可以使用DirectoryEntry.RefreshCache()
使用特定属性填充缓存,如下所示:de.RefreshCache(new[] {"company", "sAMAccountName"});
var company = de.Properties["company"]?.Value as string;
var username = de.Properties["sAMAccountName"].Value as string;
Properties
而使用SearchResult.GetDirectoryEntry()
。否则,您最终将返回AD来获取在搜索过程中可能获得的属性。DirectoryEntry
对象(手动创建,或将它们放入using
语句中)。否则您的程序将消耗大量内存(这就发生在我身上)。DirectorySearcher.FindAll()
时,请确保处理结果(同样,通过调用.Dispose()
或将其放在using
语句中)。文档说,如果不这样做,最终将导致内存泄漏。可能有更多的东西可以说,但这取决于你到底在做什么。
https://stackoverflow.com/questions/53639302
复制相似问题