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

如何推导注册表重定向键的真实可访问路径?

获取注册表重定向后的真实可访问路径

方案一:根据RegistryView手动拼接

当你用RegistryView.Registry32打开HKLM下的键时,直接在原路径的HKLM\Software\后面插入Wow6432Node\就能得到真实路径。举个例子:

  • 代码里操作的路径是HKLM\Software\MyApp,用Registry32打开时,真实路径就是HKLM\Software\Wow6432Node\MyApp
  • 如果是用默认视图(64位程序默认是RegistryView.Registry64),路径直接用原样就行,不需要额外拼接。

方案二:通过Windows API直接查询真实路径

这是最稳妥的方法,不管注册表重定向规则怎么变,都能拿到准确路径。步骤和示例代码如下:

  1. 借助RegGetKeyName这个Windows API,传入注册表键的原生句柄来获取完整路径
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:57:30