2009-09-14 71 views
2

我有一个C#服务作为LocalSystem运行(我们称之为Serv.exe),我需要这个服务来监视所有的注册表访问。如何监视注册表访问? [C#]

特别是每当一个对HKEY_CURRENT_USER \ Software *。*的调用由它启动的任何进程完成时,我需要捕获该调用(无论是更改还是简单访问),以便我可以相应地重定向它 - 我知道更改事件,但只是访问注册表来获取价值?

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

任何意见,帮助,建议将不胜感激。 谢谢,

+1

一旦解决方案对您有好处,请不要忘记接受答案。我看到你有9个问题没有任何可接受的答案。 – 2009-09-14 20:33:58

回答

5

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

重定向很复杂;您需要使用像Detours这样的库来挂接API,但在生产中使用它的许可证是昂贵的。也就是说,Process Monitor仍然有助于确保你的API钩子做正确的事情。

服务启动的进程是否需要继续作为LocalSystem运行?如果没有,请尝试CreateProcessAsUser以使用适当的帐户创建流程。

如果您的需求比较简单,比如让一个不小心书写的应用程序在没有对HKLM的写入权限的情况下运行,则Application Compatibility Toolkit可能就是票证。

不幸的是,安装是所有的最麻烦的情况。您可能需要采取笨拙的手段,让您的服务将用户添加到管理员组,使用CreateProcessAsUser启动安装程序,然后在启动进程后再次将该用户从管理员组中删除,类似于Aaron Margosis的MakeMeAdmin script

如果安装程序不好,你可能会有更好的运气来收集必要的HKCU注册表设置(使用Process Monitor或reg export HKCU在安装前后进行比较)并将其存入.reg文件中,然后修补某种启动在登录时导入注册表项的脚本(并留下痕迹导致它不会重新为同一用户运行并覆盖其设置)。我已经将这种方法用于坚持将所有内容都保存在HKCU中的专业应用程序。

如果您不介意深入挖掘未记录的深度,则作为LocalSystem运行的服务可以执行some complicated hocus-pocus involving essentially undocumented APIs like ZwCreateToken以在添加了本地管理员组的用户会话中运行安装程序。这也有一些限制 - 例如,没有密码创建的令牌将不具有网络凭证。

+0

SysInternals进程监视器没有API(我知道) - 所以不知道它如何可以帮助我的服务。至于其他2 - 我会做一些阅读和看 - 以前从来没有听说过他们(谢谢)。 – Shaitan00 2009-09-14 20:36:24

+0

问题是 - 我无法模仿 - 在安装服务后,我没有任何帐户的用户名或密码...这是我作为LocalSystem Service进行安装的主要原因。 – Shaitan00 2009-09-14 20:43:39

+0

我认为如果用户会话中的进程将它传递给您,您可以使用已通过的令牌进行模仿(而不是使用LogonUser自己创建它)。 – 2009-09-14 21:11:39

2

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

+1

但是,这不只适用于更改注册表?我需要处理访问它也。 – Shaitan00 2009-09-15 13:59:22