我有一个 Active Directory 同步工具 (.NET 2.0 / C#),它是作为 Windows 服务编写的,我已经研究了一段时间,最近的任务是添加基于组成员身份更改来驱动事件的能力。基本场景是用户与安全数据库同步,并且当组成员更改时,用户需要更改其访问权限(即,如果我现在是“IT 员工”的成员,那么我应该自动获得对服务器机房,如果我从该组中删除,那么我应该自动失去对服务器机房的访问权限)。
问题是,在对组执行 DirectorySynchronization 时,您会收到已添加/删除成员的组,并且当您获取成员列表时,您会从那里获取该组中所有成员的列表,而不仅仅是那些已添加或删除。这给我带来了一个相当大的效率问题——为了知道用户是否被添加或删除,我必须在本地保留每个组和所有成员的列表,并将其与当前列表进行比较以查看谁被添加了添加(不在本地列表中),以及谁已被删除(在本地列表中,不在当前成员列表中)。
我正在讨论是否将组成员身份详细信息存储在内存中的 DataSet 中,并在每次处理新的成员身份更改时写入磁盘。这样,如果服务停止/崩溃或机器重新启动,我仍然可以通过将磁盘上的最后信息与当前组成员列表中的信息进行比较来了解安全数据库中 Active Directory 的当前状态。然而,这似乎非常低效 - 遍历组中的每个成员以与数据集中的内容进行比较,然后每次列表发生更改时将更改写入磁盘。
有没有人处理过这种情况?有没有我没有找到只检索组成员增量的方法?在这种情况下,您会怎么做才能确保在尽可能减少性能损失的同时不会错过任何更改?
编辑: AD 可能包含 500 个用户,它可能包含 200,000 个用户 - 这取决于客户,最重要的是平均用户是多少个组的成员