在我的一个应用程序中,我正在查询活动目录以获取给定用户下面的所有用户的列表(使用“直接报告”)。所以基本上,给出这个人的名字,在 AD 中查找,然后读取直接报告。但对于每个直接下属,该工具都需要检查直接下属的直接下属。或者,更抽象:该工具将使用一个人作为树的根,然后沿着完整的树走下去以获取所有叶子的名称(可以是数百个)

现在,我关心的显然是性能,因为这需要完成很多次。我的想法是手动缓存它(本质上只是将所有名称放在一个长字符串中并将其存储在某处并每天更新一次)。

但我只是想知道是否有一种更优雅的方法来首先获取信息然后缓存它,可能使用 System.DirectoryServices 命名空间中的某些东西?

有帮助吗?

解决方案

为了控制您想要缓存的属性,您可以调用“RefreshCache()”来传递您想要保留的属性:

System.DirectoryServices.DirectoryEntry entry = new System.DirectoryServices.DirectoryEntry();               

// Push the property values from AD back to cache.

entry.RefreshCache(new string[] {"cn", "www" });

其他提示

Active Directory 在存储信息方面非常高效,并且检索不会对性能造成太大影响。如果您确实想要存储姓名,您可能希望将它们存储在某种树结构中,这样您就可以看到所有人的关系。根据人数的多少,您不妨每天提取所需的所有信息,然后根据缓存的副本查询所有请求。

AD 会为您进行此类缓存,因此不必担心它,除非性能成为问题。我的软件整天在公司内部网上运行,执行此类操作,每小时需要数千次点击,并且从未需要调整该领域的性能。

取决于您希望信息的最新程度。如果你 一定有 报告中的最新数据然后直接从 AD 查询是合理的。我同意 AD 非常强大,典型的专用 AD 服务器实际上在正常的日常操作中很少使用 但最好咨询您的 IT 部门/支持人员。

另一种方法是使用每日脚本将 AD 数据转储到 CSV 文件中和/或将其导入到 SQL 数据库中。(Oracle 有一个 SELECT CONNECT BY 功能,可以在结果集中自动创建多级层次结构。MSSQL 可以通过一些递归来完成类似的事情 IIRC)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top