繁体   English   中英

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

[英]How to monitor registry accessing? [C#]

我有一个以LocalSystem身份运行的C#服务(我们称其为Serv.exe),并且我需要此服务来监视所有注册表访问。

具体来说,每当它启动的任何进程对HKEY_CURRENT_USER \\ Software *。*进行调用时,我都需要捕获该调用(更改或只是访问),以便我可以相应地重定向它-我知道CHANGE事件,但是只是访问注册表以获得价值?

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

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

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

重定向很复杂; 您需要将API与Detours之类的库挂钩,但是在生产环境中使用它的许可很昂贵。 也就是说,Process Monitor对于确保您的API挂钩执行正确的操作仍然很有用。

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

如果您的需求较为简单(例如,运行粗心的应用程序而没有对HKLM的写访问权,则可以使用应用程序兼容性工具包)

不幸的是,安装是最讨厌的情况。 您可能需要采取笨拙的做法,即让您的服务将用户添加到Administrators组,使用CreateProcessAsUser启动安装程序,然后在启动过程后再次从Administrators组中删除用户,类似于Aaron Margosis的MakeMeAdmin脚本

如果安装程序的性能很差,则最好将所需的HKCU注册表设置(在安装前后使用Process Monitor或reg export HKCU并将它们进行差异化)收集到.reg文件中,并整理一些启动脚本,在登录时导入注册表项(并留下痕迹,这样就不会为同一用户重新运行并覆盖其设置)。 我将这种方法用于坚持将所有内容保留在HKCU中的特殊应用程序中。

如果您不介意深入研究未记录的深度,则以LocalSystem身份运行的服务可能会执行一些复杂的工作,涉及本质上未记录的API(例如ZwCreateToken从而在添加了本地Administrators组的用户会话中运行安装程序。 这也有一些限制-例如,创建没有密码的令牌将没有网络凭据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM