如何从 LOCAL_MACHINE 下的注册表中读取
How to read from Registry under LOCAL_MACHINE
我正在准备一个 Windows 表单应用程序,它将显示当前安装的 office(2016) 的位数。我在我的表单中放置了一个 Button(ChkBtn) 和一个 Label(BitnessLbl),这将有助于完成我的任务。
问题是,即使我可以通过在注册表中搜索找到 'Bitness'(在我的例子中是 'x64')的值,程序也无法找到指定的注册表。我添加了一张图片,可以进一步解释我的问题。我使用的代码如下
using System;
using System.Windows.Forms;
using Microsoft.Win32;
namespace GetOfficeBitness
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ChkBtn_Click(object sender, EventArgs e)
{
var arg = @"SOFTWARE\Microsoft\Office.0\Outlook";
var key = Registry.LocalMachine.OpenSubKey(arg, false);//OpenSubKey(arg);
/*var p = Registry.LocalMachine.GetSubKeyNames();
var l = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Office.0\Common");
var n = l.GetSubKeyNames();*/
if (key != null)
{
if (key.GetValue("Bitness").ToString() == "x86" || key.GetValue("Bitness").ToString() == "X86")
BitnessLbl.Text = @"32 Bit Office";
//Environment.Exit(1);
}
else
{
//Environment.Exit(0);
BitnessLbl.Text = @"64 Bit Office";
}
}
}
}
图片 link 放在这里:-
https://i.stack.imgur.com/XUcuX.png
正如我在评论中指出的那样,当您的代码 运行 作为 32 位进程时,您会遇到 Registry Redirector.
的影响
当您的代码看起来正在访问 HKEY_LOCAL_MACHINE\Software
时,它实际上正在访问 HKEY_LOCAL_MACHINE\Software\Wow6432Node
。
为了抵消这种影响,请确保使用接受 RegistryView
and request the 64-bit view. E.g. you may need to use OpenBaseKey
的适当 method/overload 打开密钥,而不是使用内置的 LocalMachine
属性 作为你的起点。
所以,大致如下:
var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine
,RegistryView.Registry64).OpenSubKey(arg, false);
我正在准备一个 Windows 表单应用程序,它将显示当前安装的 office(2016) 的位数。我在我的表单中放置了一个 Button(ChkBtn) 和一个 Label(BitnessLbl),这将有助于完成我的任务。 问题是,即使我可以通过在注册表中搜索找到 'Bitness'(在我的例子中是 'x64')的值,程序也无法找到指定的注册表。我添加了一张图片,可以进一步解释我的问题。我使用的代码如下
using System;
using System.Windows.Forms;
using Microsoft.Win32;
namespace GetOfficeBitness
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ChkBtn_Click(object sender, EventArgs e)
{
var arg = @"SOFTWARE\Microsoft\Office.0\Outlook";
var key = Registry.LocalMachine.OpenSubKey(arg, false);//OpenSubKey(arg);
/*var p = Registry.LocalMachine.GetSubKeyNames();
var l = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Office.0\Common");
var n = l.GetSubKeyNames();*/
if (key != null)
{
if (key.GetValue("Bitness").ToString() == "x86" || key.GetValue("Bitness").ToString() == "X86")
BitnessLbl.Text = @"32 Bit Office";
//Environment.Exit(1);
}
else
{
//Environment.Exit(0);
BitnessLbl.Text = @"64 Bit Office";
}
}
}
}
图片 link 放在这里:- https://i.stack.imgur.com/XUcuX.png
正如我在评论中指出的那样,当您的代码 运行 作为 32 位进程时,您会遇到 Registry Redirector.
的影响当您的代码看起来正在访问 HKEY_LOCAL_MACHINE\Software
时,它实际上正在访问 HKEY_LOCAL_MACHINE\Software\Wow6432Node
。
为了抵消这种影响,请确保使用接受 RegistryView
and request the 64-bit view. E.g. you may need to use OpenBaseKey
的适当 method/overload 打开密钥,而不是使用内置的 LocalMachine
属性 作为你的起点。
所以,大致如下:
var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine
,RegistryView.Registry64).OpenSubKey(arg, false);