4

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

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

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

4

4 回答 4

3

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

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

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

entry.RefreshCache(new string[] {"cn", "www" });
于 2008-09-02T09:26:14.133 回答
2

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

于 2008-08-28T20:23:47.303 回答
2

AD 会为您进行这种缓存,因此除非性能成为问题,否则不要担心。我有软件整天在公司 Intranet 上运行,每小时需要数千次点击,并且从未需要调整这方面的性能。

于 2008-08-31T09:46:56.720 回答
2

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

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

于 2008-09-02T09:35:08.153 回答