如何监控注册表访问? [C#]

时间:2009-09-14 20:21:56

标签: c#

我有一个运行为LocalSystem的C#服务(让我们称之为Serv.exe),我需要这项服务来监控所有注册表访问。

特别是每次调用HKEY_CURRENT_USER \ Software *。*时,我都需要捕获该调用(更改或只是访问),以便我可以相应地重定向 - 我知道CHANGE事件,但只是访问注册表获取值?

推理(请某人提出更好的建议 - 我会更欢迎) - 服务在LocalSystem下运行,LocalSystem有自己的HKEY_CURRENT_USER,但此服务用于在登录用户的后台安装软件 - 因此,当安装此软件时,它可能会尝试影响USER本身的HKEY_CURRENT_USER(这很好) - 所以我需要确保这些更改反映到USER而不是LocalSystem帐户。

任何建议,帮助和建议都将不胜感激。 谢谢,

2 个答案:

答案 0 :(得分:5)

如果您只是想看看发生了什么,请使用Sysinternals Process Monitor

重定向很复杂;您需要将API与Detours这样的库挂钩,但在生产中使用它的许可证是$ ive。也就是说,Process Monitor对于确保您的API挂钩正在做正确的事情仍然很有用。

您的服务启动的流程是否需要继续作为LocalSystem运行?如果没有,请尝试CreateProcessAsUser以获取在相应帐户下创建的流程。

如果您的需求更简单,例如在没有HKLM写入权限的情况下运行不小心编写的应用程序,则Application Compatibility Toolkit可能是故障单。

不幸的是,安装是最糟糕的情况。您可能需要采取笨拙的方法,让您的服务将用户添加到Administrators组,使用CreateProcessAsUser启动安装程序,然后在启动进程后再次从Administrators组中删除用户,类似于Aaron Margosis的{{3} }。

如果安装程序那么糟糕,您可能会更好地收集必要的HKCU注册表设置(在安装之前和之后使用Process Monitor或reg export HKCU并将它们区分开来)到.reg文件中,并且搞砸某种启动脚本,该脚本在登录时导入注册表项(并留下面包屑,因此它不会为同一用户重新运行并覆盖其设置)。我已经将这种方法用于专业应用,坚持将所有内容保存在HKCU中。

如果您不介意深入挖掘未记录的深度,那么作为LocalSystem运行的服务可以MakeMeAdmin script在用户会话中运行安装程序并添加本地Administrators组。这也有一些限制 - 例如,没有密码创建的令牌将不具有网络凭据。

答案 1 :(得分:2)

您可以使用WMI次查询。 Here就是一个例子。