32位应用通过WMI远程查询注册表:如何关闭重定向?
解决32位应用通过WMI StdRegProv访问64位注册表并避免重复数据的问题
绕过WMI注册表重定向的核心思路
32位程序默认会被系统注册表重定向机制导向Wow6432Node分支,要访问原生64位注册表,需要在WMI调用中明确指定注册表视图或强制使用64位提供者。
方法1:调用StdRegProv方法时指定64位访问标志
使用StdRegProv的各类方法(如EnumKey、GetStringValue)时,传入KEY_WOW64_64KEY标志(十六进制值0x0100),就能绕过重定向直接访问64位注册表分支。
实际调用的参数示例:
- 根键使用
HKEY_LOCAL_MACHINE(值0x80000002) - 目标路径传入
SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall - 访问权限参数中加入
0x0100
通过这个方式,你可以分别获取64位原生分支和32位Wow6432Node分支的数据。
方法2:建立WMI连接时强制使用64位提供者
在创建WMI连接的配置中,添加__ProviderArchitecture和__RequiredArchitecture上下文属性,强制WMI使用64位的注册表提供者,这样32位程序访问HKLM:\SOFTWARE\...时会直接指向64位分支。
以C#代码为例:
ConnectionOptions options = new ConnectionOptions(); options.AdditionalContext["__ProviderArchitecture"] = 64; options.AdditionalContext["__RequiredArchitecture"] = true; // 后续用这个options建立WMI连接
解决数据重复的建议
获取两个分支的数据后,用软件的唯一标识(比如ProductCode、DisplayName+DisplayVersion组合)做去重判断,剔除重复记录——部分软件会同时在64位和32位注册表分支留下记录,但实际是同一个安装实例。
内容的提问来源于stack exchange,提问作者lijevosmetalo
相关产品推荐
相关产品推荐

