跟踪Windows注册表中的更改
有没有办法跟踪Windows注册表中的更改?我想看看在安装各种程序的过程中对注册表进行了哪些更改。
解决方案
使用进程监视器,我们可以监视各种进程的文件和注册表活动。
我同意Franci的观点,所有Sysinternals实用程序都值得一看(Autoruns也是必须的),而Process Monitor取代了旧的Filemon和Regmon是很宝贵的。
除了所需的用法,查看进程失败的原因(例如尝试访问不存在的文件或者注册表项)非常有用。
一种无需额外工具即可完成此操作的简单方法是,在安装之前将注册表导出到文本文件,然后在安装之后将其导出到另一个文件。然后,比较两个文件。
话虽如此,Sysinternals工具对此非常有用。
有几种不同的方法。如果我们想自己动手做,WMI可能是我们要走的路。 " RegistryKeyChangeEvent"及其亲属是值得一看的。也许还有一种方法可以通过__InstanceCreationEvent
,__InstanceDeletionEvent
和__InstanceModificationEvent
类进行监视。
http://msdn.microsoft.com/zh-CN/library/aa393040(VS.85).aspx
关于WMI和注册表:
有三个与注册表有关的WMI事件类:
- RegistryTreeChangeEvent
- RegistryKeyChangeEvent
- RegistryValueChangeEvent
注册表事件类
但是我们需要意识到以下限制:
- 使用RegistryTreeChangeEvent和RegistryKeyChangeEvent,无法直接告诉实际更改了哪些值或者键。为此,我们需要保存事件之前的注册表状态,并将其与事件之后的状态进行比较。
- 我们不能将这些类与HKEY_CLASSES_ROOT或者HKEY_CURRENT_USER配置单元一起使用。我们可以通过创建WMI类来表示要监视的注册表项来克服此问题:
使用限定符定义注册表类
并将其与__InstanceOperationEvent派生类一起使用。
因此,可以使用WMI监视注册表,但是还不够完善。优点是可以实时监控变化。另一个优点是WMI永久事件订阅:
随时接收事件
一种"始终"监视注册表的方法,即如果应用程序未运行,则为事件。
PhiLho曾经提到过AutoRuns,但我认为值得详细阐述。
它不扫描整个注册表,仅扫描包含对自动加载的内容(EXE,DLL,驱动程序等)的引用的部分,这可能是我们感兴趣的内容。它不会跟踪更改,但可以导出为文本文件,因此我们可以在安装之前和之后运行它并进行比较。