我有一个作为 Windows 服务编写的 Active Directory 同步工具 (.NET 2.0 / C#),我已经研究它一段时间了,最​​近的任务是添加根据组成员身份的更改驱动事件的功能。基本场景是用户与安全数据库同步,并且当组成员身份更改时,用户需要更改其访问权限(即如果我现在是“IT 员工”的成员,那么我应该自动获得对服务器机房的访问权限,如果我从该组中删除,那么我应该自动失去对服务器机房的访问权限)。

问题是,当对组进行 DirectorySynchronization 时,您会收到已添加/删除成员的组,并且当您获取成员列表时,您会收到当前该组中所有成员的列表,而不仅仅是当前已添加/删除的成员的列表。已添加或删除。这导致我遇到了一个相当大的效率问题 - 为了知道用户是否已被添加或删除,我必须在本地保留每个组和所有成员的列表,并将其与当前列表进行比较,以查看谁已被添加或删除。添加了哪些人(不在本地列表中),以及删除了哪些人(在本地列表中,不在当前成员列表中)。

我正在讨论仅将组成员身份详细信息存储在内存中的数据集中,并在每次处理新的成员身份更改时写入磁盘。这样,如果服务停止/崩溃或计算机重新启动,我仍然可以通过将磁盘上的最后信息与当前组成员身份列表中的信息进行比较来获取安全数据库中 Active Directory 的当前状态。然而,这看起来效率很低——遍历组中的每个成员来与数据集中的内容进行比较,然后每次列表发生更改时将更改写入磁盘。

以前有人处理过这种情况吗?我还没有找到某种方法来仅检索一组成员的增量吗?在这种情况下,您会采取什么措施来确保您不会错过任何更改,同时尽可能减少性能影响?

编辑: AD 可能包含 500 个用户,也可能包含 200,000 个用户 - 这取决于客户,以及平均用户所属的组数

有帮助吗?

解决方案

我想说这取决于您需要跟踪多少个活动目录对象。如果数量很少(少于 1000 个用户),您可能可以将状态数据序列化到磁盘,而不会造成明显的性能影响。如果您正在处理大量对象,那么在 SQL Express 等中创建一个简单的持久性模式并使用它可能会更有效。

其他提示

您可以在组策略编辑器中设置帐户修改是否成功的审核

然后,您可以监控安全日志中的条目并处理有关帐户修改的日志条目。

例如。

        EventLog myLog = new EventLog("Security");

        // set event handler
        myLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
        myLog.EnableRaisingEvents = true;

确保您有权访问安全事件日志http://support.microsoft.com/kb/323076

您知道有一些产品可以帮助您进行目录同步和用户配置(谷歌这些术语)?这些都不是在这里发明的,您可能必须证明在当前环境下的投资是合理的,但是从长远来看,开发和维护已经有商业解决方案的代码并不总是最具成本效益的方式跑步。

并非所有支持事件/配置,但它们确实支持跟踪更改并分发它们:在这些功能之上创建事件解决方案并不是什么大问题。

微软有 身份集成服务器 (MISS)正在被重新包装为一部分 身份生命周期管理器. 。它最初是建立在更通用的元/主数据管理产品之上的,但是是可行的。IBM 拥有 Tivoli 目录集成器 (但您需要跟上每两年一次的名称更改!)。甲骨文有一个 Oracle 身份管理器, 、孙安 身份管理器. 。其中大多数是主要参与者购买的主导产品,以填补​​其产品组合的空白。

当然,这些是企业级产品,意味着体积大且昂贵,但通常具有未来安全性和可扩展性。如果您不需要它们的全部功能(还!),您需要考虑为自己存储一份副本。在这种情况下,您是否考虑过使用以下方式存储最后已知的 AD 树的副本 AD LDS (以前的 AD/AM)?它不是比较差异的最佳格式,但目录数据库可以很好地扩展,即使是轻量级的数据库也是如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top