4

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

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

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

有没有人处理过这种情况?有没有我没有找到只检索组成员增量的方法?在这种情况下,您会怎么做才能确保在尽可能减少性能损失的同时不会错过任何更改?

编辑: AD 可能包含 500 个用户,它可能包含 200,000 个用户 - 这取决于客户,最重要的是平均用户是多少个组的成员

4

3 回答 3

2

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

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

例如

        EventLog myLog = new EventLog("Security");

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

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

于 2008-09-17T18:26:27.107 回答
1

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

于 2008-09-17T18:06:13.740 回答
1

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

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

Microsoft 拥有Identity Integration Server (MISS),它被重新打包为Identity Lifecycle Manager的一部分。它最初是建立在一个更通用的元/主数据管理产品上的,但它是可行的。IBM 有Tivoli Directory Integrator(但您需要跟上两年一次的名称更改!)。Oracle 有一个Oracle 身份管理器,而 Sun 有一个身份管理器。其中大部分是主要参与者购买的领先产品,以填补​​其投资组合的空白。

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

于 2009-03-16T11:36:23.957 回答