我有一个用作Windows服务的Active Directory同步工具(.NET 2.0 / C#),最近我被要求添加根据组成员变化驱动事件的功能。基本情况是用户与安全数据库同步,当组成员身份发生变化时,用户需要更改访问权限(即,如果我现在是“IT人员”的成员,则应自动获得进入服务器房间的权限,如果我被从该组中删除,则应自动失去进入服务器房间的权限)。
问题在于,在对组执行DirectorySynchronization时,您会收到已添加/删除成员的组,并且从那里获取成员列表时,您会返回当前所有成员而不仅仅是已添加或删除的成员。这导致了相当大的效率问题 - 为了知道是否已添加或删除用户,我将不得不在本地保留每个组和所有成员的列表,并将其与当前列表进行比较,以查看谁已添加(不在本地列表中)以及谁已删除(在本地列表中,但不在当前成员列表中)。
我正在考虑将组成员资料存储在内存中的DataSet中,并在处理新成员资格变更时每次写入磁盘。这样,如果服务停止/崩溃或机器重新启动,我仍然可以通过将磁盘上的最后信息与当前组成员列表中的信息进行比较来访问Active Directory中的当前状态。但是,这似乎非常低效 - 每次有列表更改时都要运行每个组中的每个成员以与数据集中的内容进行比较,然后将更改写入磁盘。
有人遇到过这种情况吗?是否有一些我没有找到的检索仅组成员差异的方法?在这种情况下,您会采取什么措施以确保您永远不会错过任何更改,同时尽可能减少性能损失?
编辑:AD可能包含500个用户,也可能包含200,000个用户 - 这取决于客户以及平均用户是多少个组的成员。
问题在于,在对组执行DirectorySynchronization时,您会收到已添加/删除成员的组,并且从那里获取成员列表时,您会返回当前所有成员而不仅仅是已添加或删除的成员。这导致了相当大的效率问题 - 为了知道是否已添加或删除用户,我将不得不在本地保留每个组和所有成员的列表,并将其与当前列表进行比较,以查看谁已添加(不在本地列表中)以及谁已删除(在本地列表中,但不在当前成员列表中)。
我正在考虑将组成员资料存储在内存中的DataSet中,并在处理新成员资格变更时每次写入磁盘。这样,如果服务停止/崩溃或机器重新启动,我仍然可以通过将磁盘上的最后信息与当前组成员列表中的信息进行比较来访问Active Directory中的当前状态。但是,这似乎非常低效 - 每次有列表更改时都要运行每个组中的每个成员以与数据集中的内容进行比较,然后将更改写入磁盘。
有人遇到过这种情况吗?是否有一些我没有找到的检索仅组成员差异的方法?在这种情况下,您会采取什么措施以确保您永远不会错过任何更改,同时尽可能减少性能损失?
编辑:AD可能包含500个用户,也可能包含200,000个用户 - 这取决于客户以及平均用户是多少个组的成员。