更高效地监控Active Directory中的组成员(C# .NET)

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

你是否掌握了最佳的模式和实践,以实现对AD的高效访问? - Kiquenet
3个回答

2

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

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

例如:

        EventLog myLog = new EventLog("Security");

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

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

1
我认为这取决于您需要跟踪多少个活动目录对象。如果数量很少(少于1000个用户),您可以将状态数据序列化到磁盘上,几乎不会影响性能。如果您处理的对象数量非常大,则在类似SQL Express的东西中创建一个简单的持久性模式可能更有效。

1

你知道有一些产品可以帮助你进行目录同步和用户配置(搜索一下这些术语)吗?虽然这不是自己发明的,你可能需要在当前环境下证明投资的必要性,但是为已经存在商业解决方案编写和维护代码并不总是最具成本效益的方式。

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

微软拥有身份集成服务器(MISS),它正在作为身份生命周期管理器的一部分重新打包。它最初是建立在一个更通用的元/主数据管理产品上的,但是它是可行的。IBM拥有Tivoli目录集成器(但你需要跟上每两年一次的名称更改!)。Oracle拥有Oracle身份管理器,Sun拥有身份管理器。这些大多数都是领先的产品,被主要玩家购买来填补他们组合中的空白。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接