更有效地监视Active Directory中的组成员身份(C#.NET)
我有一个作为Windows服务编写的Active Directory同步工具(.NET 2.0 / C#),我已经使用了一段时间,最近又被赋予添加基于组成员身份更改驱动事件的功能。基本方案是用户与安全数据库同步,并且当组成员身份更改时,用户需要更改其访问权限(即,如果我现在是" IT人员"的成员,那么我应该自动获得对服务器机房,如果我被从该组中删除,那么我应该自动失去对服务器机房的访问权限)。
问题在于,对组执行DirectorySynchronization时,我们会收到添加/删除了成员的组,然后从那里获取成员列表时,我们将获得该组中当前所有成员的列表,而不仅是那些已添加或者删除。这导致我遇到一个效率问题,那就是为了知道是否已添加或者删除用户,我必须在本地保留每个组和所有成员的列表,并将其与当前列表进行比较以查看添加了谁(不在本地列表中)和已删除的人(在本地列表中,不在当前成员列表中)。
我正在讨论的只是将组成员资格详细信息存储在内存中的DataSet中,并在每次处理新的成员资格更改时将其写入磁盘。这样,如果服务停止/崩溃或者计算机重新启动,我仍然可以通过将磁盘上的最新信息与当前组成员列表中的信息进行比较,来获得安全性数据库中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
回答
我们知道有哪些产品可以进行目录同步和用户配置(使用Google的术语)?在这里和所有这些方面都没有被发明出来,我们可能必须在当前的气候下证明投资的合理性,但是,就长期而言,开发和维护已经有商业解决方案的代码并不是总能带来最高成本效益的方式跑。
并非所有支持事件/供应都支持,但它们确实支持跟踪更改并进行分发:在这些功能之上创建事件解决方案并不重要。
Microsoft具有Identity Integration Server(MISS),它将作为Identity Lifecycle Manager的一部分进行重新打包。它最初是基于更通用的元数据/主数据管理产品构建的,但是是可行的。 IBM具有Tivoli Directory Integrator(但是我们需要跟上每两年一次的名称更改!)。 Oracle有一个Oracle Identity Manager,Sun有一个Identity Manager。这些产品大多数都是主要参与者购买的领先产品,以填补其投资组合中的空白。
当然,这些是企业级产品,意味着体积庞大且价格昂贵,但总体而言,它们具有未来的安全性和可扩展性。如果我们不需要他们的全部力量(尚未!),则需要考虑为自己存储一份副本。在那种情况下,我们是否考虑过使用AD LDS(以前称为AD / AM)存储最后一个已知AD树的副本?它不是用于比较差异的最佳格式,但是目录数据库(即使是轻量级的数据库)也可以很好地扩展。