首页 > 解决方案 > C# 在 HKEY_LOCAL_MACHINE 中读取或编辑 Windows 注册表值问题

问题描述

我是 C# 的新手,我想制作一个程序来更改 HKEY_LOCAL_MACHINE 中的一些注册表项,更具体地说是 Windows 版本(出于兼容性原因),为此有两个地方需要更改:1- HKEY_LOCAL_MACHINE\ SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion 2- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

我设法对第一个进行了读取和写入..但是每当我尝试对第二个进行读取或写入时,它都不会读取。我将附上问题所在的图片:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion工作正常

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion无法读取或写入

这是代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using Microsoft.Win32;
    
    namespace Registry_Modifier_alpha
    {
        public partial class Form1 : Form
        {
    
            static RegistryKey BaseFolderPath = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion");
            static RegistryKey FolderPath2 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
    
            public Form1()
            {
                InitializeComponent();
    
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                textBox1.Text = BaseFolderPath.GetValue("CompositionEditionID").ToString();
                textBox2.Text = BaseFolderPath.GetValue("ProductName").ToString();
                textBox3.Text = BaseFolderPath.GetValue("EditionID").ToString();
                textBox4.Text = FolderPath2.GetValue("CompositionEditionID").ToString();
                textBox5.Text = FolderPath2.GetValue("ProductName").ToString();
                textBox6.Text = FolderPath2.GetValue("EditionID").ToString();
            }
    
            private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
            {
                System.Diagnostics.Process.Start("mailto:mail@mail.com");
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                RegistryKey BaseFolderPath = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion", true);
                BaseFolderPath.SetValue("ProductName", "Windows 10 Pro");
                BaseFolderPath.SetValue("CompositionEditionID", "Pro");
                BaseFolderPath.SetValue("EditionID", "Pro");
                BaseFolderPath.Close();
RegistryKey FolderPath2 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", true);
                FolderPath2.SetValue("ProductName", "Windows 10 Pro");
                FolderPath2.SetValue("CompositionEditionID", "Pro");
                FolderPath2.SetValue("EditionID", "Pro");
                FolderPath2.Close();

    
    
            }
    
            private void label2_Click(object sender, EventArgs e)
            {
    
            }
    
            private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
            {
    
            }
    
            private void toolTip1_Popup(object sender, PopupEventArgs e)
            {
    
            }
    
            private void textBox3_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void toolTip2_Popup(object sender, PopupEventArgs e)
            {
    
            }
    
            private void textBox5_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void textBox6_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void textBox4_TextChanged(object sender, EventArgs e)
            {
    
            }
        }
    }

我不知道为什么它没有读取 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

谢谢你

标签: c#registry

解决方案


只需根据不同的注册表视图打开BaseKey:

var registryView32 = RegistryView.Registry32;
var registryView64 = RegistryView.Registry64;

var key32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView32);
var key64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView64);

var folder32 = key32.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
var folder64 = key64.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");

更新:

根据您的评论,您可以将其添加到代码中:
static RegistryKey BaseFolderPath;
static RegistryKey FolderPath2;

public Form1()
{
    InitializeComponent();

    var registryView32 = RegistryView.Registry32;
    var registryView64 = RegistryView.Registry64;

    var key32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView32);
    var key64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView64);

    BaseFolderPath = key32.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
    FolderPath2 = key64.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
}

推荐阅读