【问题标题】:Read / Process large number of data using DirectorySearcher API使用 DirectorySearcher API 读取/处理大量数据
【发布时间】:2016-12-16 11:18:33
【问题描述】:

上下文

  • 一个 OU 中有 20 万用户的 Active Directory 实例

  • 在我们的域中增长到 1 M 的潜力

不是这方面的专家。我正在尝试为需要轮询 AD 和

的场景提出解决方案设计
  • 检查 PwdLastSet 和 LastLogonDate 属性

  • 根据每个用户的价值(锁定帐户、发送电子邮件等)做出 6 种不同的决定(策略)

理想情况下,如果是数据库,我可以选择

  • 打开连接
  • 读取一小页数据
  • 关闭连接
  • 通过应用程序在内存中处理它们
  • 重复

(因此将其留给连接池来处理事情并允许其他人做他们的事情)。

我真的很想知道在这种情况下可扩展的最佳实践/方法。我只需要为所有用户获取这 2 个属性(当然我们有过滤器 - 例如删除不活动的)

就我个人而言,我想知道我是否应该这样做

  • 使用我们的自定义调度程序服务来运行 Powershell(或 .NET)、使用 DirectorySearcher、打开连接 (ssl)、使用分页一次读取 100 / 1000 个用户并在内存中处理它们。与 AD 的连接保持打开状态

  • 打开与 AD 的连接,在 CSV(分页)中获取所有用户的转储,关闭连接,将其写入数据库以供其他任务处理。但是,这必须是一项夜间工作,具有数据库的潜在批量权限。

  • 在数据库表中复制这两个属性,并在它们通过我们的应用程序在 AD 中更改时保持同步。使用此处的数据。

等等。

建议?

【问题讨论】:

    标签: c# .net powershell active-directory directorysearcher


    【解决方案1】:

    尽可能从源头过滤。尽可能返回最少的属性集。

    您可以利用DirectorySynchronization,但我想说这样做只有在您需要进行大量客户端计算时才有价值。我用这个技术来管理广告中的照片。我有一个离线同步集,其中包含照片作为哈希,可用于确保我只在需要的地方更新,并且当我更新时,我只从上次执行以来从目录中提取更改。

    对于基于 pwdLastSet 或 lastLogonTimeStamp 的操作,我将始终生成 (LDAP) 过滤器,允许我向 AD 询问最小的结果集。我将始终要求我实际需要使用的最少数量的属性。

    【讨论】:

    • 感谢您的评论。我唯一担心的是,即使是最小的过滤器后应用程序也可能最终达到 100k / 200k+ 记录或更多。真的很想知道什么是最好的做法吗?保持与 AD 的连接,直到它们都从 AD 中读取?这可行吗?可以与 AD 建立 SSL 连接并使用搜索器一次性读取这两个属性,例如 80 万用户吗?
    • @MSI 是的,这是可行的。假设您只检索最少数量的属性,那么 200k+ 个对象并不是一个疯狂的数量
    • AD 应该完全有能力为 80 万用户返回它,但是我会非常认真地考虑抛出 ADSI(由 DirectorySearcher 使用)并直接使用 System.DirectoryServices.Protocols。它更快、更高效、更新,并且您拥有更大程度的控制权。
    • 需要注意“它更快”。客户端方面的改进,AD 本身并不知道,因为 S.DS.P 和 S.DS (ADSI) 在堆栈底部与 LDAP 一起使用。这里有一个很好的图表:msdn.microsoft.com/en-us/library/bb332056.aspx
    • 谢谢大家,所以我们是说在单个打开的连接下对这样的卷进行分页阅读完全没问题吗?我仍在挖掘网络以更好地了解 PrincipalContext、DirtoryContext 连接与 DB 连接的行为方式:)
    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多