更高效地监视Active Directory中的组成员身份(C#.NET)
我有一个Active Directory同步工具(.NET 2.0/C#),它是作为Windows服务编写的,我已经使用了一段时间,最近的任务是添加基于组成员身份更改驱动事件的功能。基本情况是,用户与安全数据库同步,当组成员身份发生变化时,用户需要更改其访问权限(即,如果我现在是“IT人员”的成员)然后我将自动获得对服务器机房的访问权限,如果我被从该组中删除,则我将自动失去对服务器机房的访问权限) 问题是,在对组执行DirectorySynchronization时,您会收到已添加/删除成员的组,从中获取成员列表时,您会收到该组中当前所有成员的列表,而不仅仅是已添加或删除的成员的列表。这导致了一个相当大的效率问题——为了知道用户是否被添加或删除,我必须在本地保留每个组和所有成员的列表,并将其与当前列表进行比较,以查看谁被添加(不在本地列表中),谁被删除(在本地列表中,不在当前成员列表中) 我正在讨论的只是将组成员详细信息存储在内存中的数据集中,并在每次处理新成员更改时写入磁盘。这样,如果服务停止/崩溃或机器重新启动,我仍然可以通过比较磁盘上的最后一个信息和当前组成员列表中的信息来获得安全数据库中Active Directory的当前状态。然而,这似乎效率极低—运行组中的每个成员以与数据集中的内容进行比较,然后在每次列表发生更改时将更改写入磁盘 以前有人处理过这种情况吗?有没有什么方法我没有找到,只检索组成员的增量?在这种情况下,您将如何确保在尽可能降低性能影响的同时不会错过任何更改更高效地监视Active Directory中的组成员身份(C#.NET),c#,.net,active-directory,C#,.net,Active Directory,我有一个Active Directory同步工具(.NET 2.0/C#),它是作为Windows服务编写的,我已经使用了一段时间,最近的任务是添加基于组成员身份更改驱动事件的功能。基本情况是,用户与安全数据库同步,当组成员身份发生变化时,用户需要更改其访问权限(即,如果我现在是“IT人员”的成员)然后我将自动获得对服务器机房的访问权限,如果我被从该组中删除,则我将自动失去对服务器机房的访问权限) 问题是,在对组执行DirectorySynchronization时,您会收到已添加/删除成员的组
编辑:该广告可能包含500个用户,也可能包含200000个用户-这取决于客户,除此之外,平均用户是多少组的成员我认为这取决于您需要跟踪多少active directory对象。如果是一个小数目(少于1000个用户),您可能可以将状态数据序列化到磁盘,而不会造成明显的性能影响。如果您正在处理大量对象,那么在SQL Express之类的工具中创建一个简单的持久性架构并使用它可能会更有效。您可以在组策略编辑器中设置帐户修改成功的审核 然后,您可以监视安全日志中的条目,并在修改帐户时处理日志条目 例如 确保您具有访问安全事件日志的权限
你知道有一些产品可以帮助你进行目录同步和用户设置(谷歌这些术语)?这些都不是在这里发明的,您可能需要证明在当前环境下的投资是合理的,但是从长远来看,开发和维护已经有商业解决方案的代码并不总是最具成本效益的方法 并非所有的事件/资源调配都支持,但它们确实支持跟踪和分发更改:在这些功能的基础上创建事件解决方案并不是什么大问题 Microsoft有(MISS),它正在作为的一部分重新打包。它最初是建立在一个更通用的元数据/主数据管理产品上的,但它是可行的。IBM拥有最新的名称(但您需要跟上每两年一次的名称更改!)。甲骨文有一个,孙安。其中大多数是主要参与者购买的领先产品,以填补其投资组合中的空白
当然,这些都是企业级的产品,这意味着大型且昂贵,但通常是非常安全且可扩展的。如果你还不需要他们的全力支持,你需要考虑为自己保存一份副本。在这种情况下,您是否考虑过使用(以前的AD/AM)存储上一个已知广告树的副本?它不是比较差异的最佳格式,但目录数据库可以很好地扩展,即使是轻量级的 您是否获得了有效访问广告的最佳模式和实践?
EventLog myLog = new EventLog("Security");
// set event handler
myLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
myLog.EnableRaisingEvents = true;