我有一个运行为LocalSystem的C#服务(让我们称之为Serv.exe),我需要这个服务来监控所有注册表访问.
特别是每当它启动的任何进程调用HKEY_CURRENT_USER\Software*.*时,我需要捕获该调用(更改或只是访问),以便我可以相应地重定向它 - 我知道CHANGE事件但是什么关于只是访问注册表以获取值?
推理(因为有人有更好的建议 - 我会更欢迎) - 服务在LocalSystem下运行,它有自己的HKEY_CURRENT_USER但是这个服务用于在登录用户的后台安装软件 - 所以当这个软件安装它可能会试图影响USER本身的HKEY_CURRENT_USER(这很好) - 所以我需要确保这些更改反映到USER而不是LocalSystem帐户.
任何建议,帮助,建议将不胜感激.谢谢,
如果您只是想看看发生了什么,请使用Sysinternals Process Monitor.
重定向很复杂; 你需要将API与Detours这样的库挂钩,但在生产中使用它的许可证是$ ive.也就是说,Process Monitor对于确保您的API挂钩正在做正确的事情仍然很有用.
您的服务启动的流程是否需要继续作为LocalSystem运行?如果没有,请尝试CreateProcessAsUser以获取在相应帐户下创建的流程.
如果您的需求更简单,例如在没有对HKLM的写访问权的情况下运行不小心编写的应用程序,则应用程序兼容性工具包可能是故障单.
不幸的是,安装是最糟糕的情况.您可能需要采取笨拙的方法,让您的服务将用户添加到Administrators组,使用CreateProcessAsUser启动安装程序,然后在启动进程后再次从Administrators组中删除用户,类似于Aaron Margosis的MakeMeAdmin脚本.
如果安装程序那么糟糕,您可能会更好地收集必要的HKCU注册表设置(reg export在安装之前和之后使用Process Monitor或HKCU并将它们区分开来)到一个.reg文件中,然后搞砸某种导入注册表项的启动脚本登录时(并留下面包屑,因此它不会为同一用户重新运行并覆盖其设置).我已经将这种方法用于专业应用程序,坚持将所有内容保存在HKCU中.
如果您不介意深入研究未记录的深度,那么作为LocalSystem运行的服务可以执行一些复杂的hocus-pocus,其中涉及基本上未记录的API,例如ZwCreateToken在添加了本地Administrators组的用户会话中运行安装程序.这也有一些限制 - 例如,没有密码创建的令牌将不具有网络凭据.