我有一个Active Directory同步工具(.NET 2.0 / C#)编写为Windows服务,我已经工作了一段时间,并且最近的任务是添加基于更改的驱动事件的能力团体会员。基本方案是用户与安全数据库同步,当组成员身份发生变化时,用户需要更改其访问权限(即,如果我现在是“IT人员”的成员,那么我应该自动获得访问权限服务器机房,如果我从该组中删除,那么我应该自动失去对服务器机房的访问权限。)
问题在于,当您对组进行DirectorySynchronization时,您会收到已添加/删除成员的组,并且当您获取成员列表时,从那里获取当前不仅仅是该组中所有成员的列表已添加或删除的成员。这导致了一个非常高效的问题 - 为了知道用户是否已被添加或删除,我必须在本地保留每个组和所有成员的列表,并将其与当前列表进行比较,以查看是谁添加(不在本地列表中),以及谁已被删除(在本地列表中,而不是在当前成员列表中)。
我正在辩论只是将组成员资格详细信息存储在内存中的DataSet中,并在每次处理新的成员资格更改时写入磁盘。这样,如果服务停止/崩溃或机器重新启动,我仍然可以通过将磁盘上的最后信息与当前组成员列表中的最后信息进行比较,从而进入安全数据库中Active Directory的当前状态。但是,这看起来效率很低 - 运行组中的每个成员以与数据集中的内容进行比较,然后在每次更改列表时将更改写入磁盘。
之前有没有人处理过这种情况?是否有某种方法我没有找到只检索组成员的增量?在这种情况下你会做什么来确保你在不尽可能小的性能影响下永远不会错过任何变化?
修改:AD可能包含500个用户,可能包含200,000个用户 - 这取决于客户,以及普通用户所属的群组数量
答案 0 :(得分:2)
您可以在组策略编辑器中设置帐户修改成功的审核
然后,您可以监视安全日志中的条目,并处理有关帐户修改的日志条目。
E.g。
EventLog myLog = new EventLog("Security");
// set event handler
myLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
myLog.EnableRaisingEvents = true;
确保您有权访问安全事件日志 http://support.microsoft.com/kb/323076
答案 1 :(得分:1)
我想说这取决于你需要跟踪多少活动目录对象。如果它是一个较小的数字(少于1000个用户),您可以将状态数据序列化到磁盘,而几乎没有显着的性能损失。如果您正在处理大量对象,那么在SQL Express中创建一个简单的持久性模式并使用它可能会更有效。
答案 2 :(得分:1)
您知道有些产品可以帮助您进行目录同步和用户配置(谷歌这些条款)吗?这里没有发明,所有这些,你可能必须证明在当前的环境下投资是合理的,但是开发和维护已经存在商业解决方案的代码并不是,我们说,总是最经济有效的方式跑。
并非所有支持事件/配置,但它们确实支持跟踪更改并分发它们:在这些功能之上创建事件解决方案并不是一件大事。
Microsoft已将Identity Integration Server(MISS)作为Identity Lifecycle Manager的一部分重新打包。它最初建立在更通用的元/主数据管理产品上,但是可行。 IBM有Tivoli Directory Integrator(但你需要跟上名称的变化!)。 Oracle有Oracle Identity Manager,Sun有Identity Manager。其中大部分是主要参与者购买的主要产品,以填补其投资组合的空白。
当然,这些都是企业级产品,意味着大型产品。价格昂贵,但通常非常安全且可扩展。如果你不需要他们的全部力量(还是!),你需要考虑为自己存储一份副本。在这种情况下,您是否考虑过使用AD LDS(以前的AD / AM)存储上一个已知AD树的副本?它不是用于比较差异的最佳格式,但是目录数据库将相当好地扩展,甚至是轻量级。