在我的一个应用程序中,我正在查询活动目录以获取给定用户下方所有用户的列表(使用“直接报告”功能)。所以基本上,给定人的名字,在AD中查找,然后读取直接报告。但是对于每个直接报告,该工具都需要检查直接报告的直接报告。或者,更抽象:工具将使用一个人作为树的根,然后沿着完整的树走下去获取所有叶子的名称(可以是几百个)
现在,我的担忧显然是表现,因为这需要做很多次。我的想法是手动缓存它(基本上只是将所有名称放在一个长字符串中并存储在某处并每天更新一次)。
但我只是想知道是否有一种更优雅的方式来首先获取信息然后缓存它,可能使用System.DirectoryServices命名空间中的某些东西?
答案 0 :(得分: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" });
答案 1 :(得分:2)
Active Directory在存储信息方面非常有效,并且检索不应该受到太大的性能影响。如果您真的想存储名称,您可能希望将它们存储在某种树状结构中,这样您就可以看到所有人的关系。根据人数的不同,您可以每天获取所需的所有信息,然后针对缓存副本查询所有请求。
答案 2 :(得分:2)
AD会为您执行此类缓存,因此除非性能成为问题,否则不要担心它。我有软件在企业内部网上整天运行这种事情,每小时点击数千次,并且从未调整过这方面的性能。
答案 3 :(得分:2)
取决于您希望信息的最新状态。如果必须报告中的最新数据,则直接从AD查询是合理的。我同意AD非常强大,典型的专用AD服务器实际上在日常运营中非常轻松地使用,但最好与您的IT部门/支持人员联系。
另一种方法是使用每日脚本将AD数据转储到CSV文件和/或将其导入SQL数据库。 (Oracle有一个SELECT CONNECT BY功能,可以在结果集中自动创建多级层次结构.MSSQL可以通过一些递归IIRC做类似的事情。)