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

C#中ProcessStartInfo执行REG SAVE生成注册表文件大小异常问题

解决C#调用REG SAVE导出HKLM\SOFTWARE数据缺失的问题

我之前也踩过一模一样的坑!这问题的核心原因是32位程序在64位系统上的注册表重定向机制:

  • 当你在64位系统的CMD里直接执行REG SAVE HKLM\SOFTWARE C:\TEST时,CMD默认是64位进程,它访问的是真实的HKLM\SOFTWARE分支——这个分支包含所有64位程序的注册表项,所以导出文件有90MB左右。
  • 但如果你的C#程序是编译为x86(32位)的,在64位系统上运行时,Windows会自动把HKLM\SOFTWARE的访问请求重定向到HKLM\SOFTWARE\Wow6432Node,这个分支只存储32位程序的注册表数据,内容少很多,所以导出的文件只有8MB。

解决方案

方案1:修改程序编译目标平台(最简单)

直接把你的C#项目的目标平台改成x64或者Any CPU(同时取消勾选“首选32位”选项):

  • 右键项目 → 属性 → 生成
  • 在“平台目标”下拉框选择x64,或者选Any CPU并取消“首选32位”的勾选
  • 重新编译运行后,程序会以64位进程运行,不会触发注册表重定向,执行REG命令就能导出完整的HKLM\SOFTWARE数据。

方案2:保持32位程序,调用64位的reg.exe

如果因为业务限制必须保持程序为32位,可以直接调用系统的64位reg.exe(绕过重定向):
64位的reg.exe路径是C:\Windows\System32\reg.exe,但32位程序访问System32会被重定向到SysWOW64,所以需要通过C:\Windows\Sysnative\reg.exe来访问真实的64位reg.exe。

对应的C#代码示例:

ProcessStartInfo start = new ProcessStartInfo(@"C:\Windows\Sysnative\reg.exe", "SAVE HKLM\\SOFTWARE C:\\TEST")
{
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    CreateNoWindow = true,
    // 必须以管理员权限运行,否则可能因权限不足导出失败
    Verb = "runas"
};

using (Process process = Process.Start(start))
{
    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();
    process.WaitForExit();
    
    // 可根据需求处理输出和错误信息
    Console.WriteLine("命令输出:" + output);
    if (!string.IsNullOrEmpty(error))
    {
        Console.WriteLine("错误信息:" + error);
    }
}

额外注意事项

不管用哪种方案,你的程序都需要以管理员权限运行,否则REG SAVE命令可能因为权限不足,无法读取部分注册表项,导致导出的数据不完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:25:35