如何推导注册表重定向键的真实可访问路径?
获取注册表重定向后的真实可访问路径
方案一:根据RegistryView手动拼接
当你用RegistryView.Registry32打开HKLM下的键时,直接在原路径的HKLM\Software\后面插入Wow6432Node\就能得到真实路径。举个例子:
- 代码里操作的路径是
HKLM\Software\MyApp,用Registry32打开时,真实路径就是HKLM\Software\Wow6432Node\MyApp - 如果是用默认视图(64位程序默认是
RegistryView.Registry64),路径直接用原样就行,不需要额外拼接。
方案二:通过Windows API直接查询真实路径
这是最稳妥的方法,不管注册表重定向规则怎么变,都能拿到准确路径。步骤和示例代码如下:
- 借助
RegGetKeyName这个Windows API,传入注册表键的原生句柄来获取完整路径 - C#示例代码:
using System; using System.Text; using Microsoft.Win32; using System.ComponentModel; using System.Runtime.InteropServices; public static class RegistryHelper { [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern int RegGetKeyName(IntPtr hKey, StringBuilder lpName, ref uint lpcbName); public static string GetRealRegistryPath(RegistryKey key) { uint bufferSize = 1024; var pathBuilder = new StringBuilder((int)bufferSize); // 第一次调用获取所需缓冲区大小 int result = RegGetKeyName(key.Handle, pathBuilder, ref bufferSize); if (result == 234) // 缓冲区不够,重新分配 { pathBuilder.Capacity = (int)bufferSize; result = RegGetKeyName(key.Handle, pathBuilder, ref bufferSize); } if (result != 0) { throw new Win32Exception(result); } return pathBuilder.ToString(); } }
使用的时候直接传入你的RegistryKey对象就行,比如:
var key32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32); var realPath = RegistryHelper.GetRealRegistryPath(key32); // 把realPath写入日志即可
方案三:结合程序位数和视图判断
- 32位程序跑在64位系统上,默认操作
HKLM\Software会自动重定向到Wow6432Node,除非你手动指定RegistryView.Registry64 - 64位程序用
RegistryView.Registry32打开键时,同样要在路径里加Wow6432Node;用默认视图则不需要。
内容的提问来源于stack exchange,提问作者Dialecticus
相关产品推荐
相关产品推荐

