You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET服务与控制台应用注册表监控差异问题排查求助

Windows服务无法检测注册表程序安装变化的排查与解决

1. 检查注册表重定向(32位/64位差异)

Windows服务默认若以32位编译,会被系统重定向到HKLM\SOFTWARE\Wow6432Node\下的分支,而控制台程序可能以64位运行,读取的是原生64位注册表路径。新安装的64位程序不会出现在32位重定向的路径中,导致服务无法检测到变化。

  • 解决方法:
    • 右键服务项目 → 属性 → 生成 → 将目标平台改为x64。
    • 或在读取注册表时显式指定访问64位视图:
      using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
      using (var uninstallKey = baseKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
      {
          // 遍历子键并填充HashSet的逻辑
      }
      

2. 确认注册表对象是否每次重新创建

如果代码中复用了第一次打开的RegistryKey实例,该对象不会自动刷新注册表内容,后续读取的始终是首次加载的数据。

  • 检查InstalledApps.cs中的GetInstalledApps方法,确保每次检测时都重新调用OpenSubKey获取最新的注册表键,不要缓存该对象。

3. 验证定时任务的集合更新逻辑

确保每次定时检测时,都重新创建HashSet并填充最新数据,同时正确更新用于比对的旧集合:

// 每次检测的逻辑
var currentInstalledApps = GetInstalledApps();
// 比对currentInstalledApps与_oldInstalledApps的差异
_oldInstalledApps = new HashSet<string>(currentInstalledApps); // 更新旧集合,确保下次比对用最新基准

避免只在服务启动时初始化一次_oldInstalledApps,后续未重新赋值的情况。

4. 排查程序安装的注册表写入位置

部分程序可能安装时会写入用户特定的注册表分支(HKCU),而Windows服务默认运行在LocalSystem账户下,访问的是系统级的HKLM分支。如果新安装的程序仅写入当前用户的注册表,服务自然无法检测到。

内容的提问来源于stack exchange,提问作者TartCart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:10:07