缓存Active Directory数据

时间:2020-03-05 18:44:38  来源:igfitidea点击:

在我的一个应用程序中,我要查询活动目录以获取给定用户以下所有用户的列表(使用"直接报告")。因此,基本上,在给定人员姓名的情况下,可以在AD中进行查询,然后读取直接报告。但是,对于每个直接报告,该工具都需要检查直接报告中的直接报告。或者更抽象的说:该工具将使用一个人作为树的根,然后沿着整棵树走下来以获取所有叶子的名称(可以是几百个)

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

但是我只是想知道是否有一种更优雅的方式来首先获取信息然后将其缓存(可能使用System.DirectoryServices命名空间中的某些内容)?

解决方案

回答

Active Directory在存储信息方面非常有效,并且检索不应该对性能造成太大影响。如果我们真的想存储名称,则可能需要将它们存储在某种树状结构中,以便可以看到所有人的关系。根据人数的多少,我们不妨提取每天所需的所有信息,然后针对缓存副本查询所有请求。

回答

AD为我们执行了这种缓存,因此除非性能成为问题,否则不要担心。我的软件全天都在公司的Intranet上运行,每小时可以产生数千次点击,而不必调整该领域的性能。

回答

为了控制我们要缓存的属性,我们可以调用" RefreshCache()",并传递要保留的属性:

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

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

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

回答

取决于所需信息的最新程度。如果报表中必须包含最新数据,则直接从AD查询是合理的。我同意AD的功能非常强大,通常在日常操作中很少使用典型的专用AD服务器,但最好与IT部门/支持人员联系。

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