C# 重命名注册表值错误"returned null"



因此,对于我的最终编程项目,我需要通过C#重命名Registry中的一个值,这是我迄今为止所写的:

public bool RenameSubKey(string parentKey, string subKeyName, string newSubKeyName)
{
if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
{
RegistryKey rk64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
rk64.OpenSubKey(parentKey);
//copy all the values
foreach (string valueName in rk64.OpenSubKey(subKeyName).GetValueNames())
{
object objValue = rk64.OpenSubKey(subKeyName).GetValue(valueName);
RegistryValueKind valKind = rk64.OpenSubKey(subKeyName).GetValueKind(valueName);
rk64.CreateSubKey(newSubKeyName).SetValue(valueName, objValue, valKind);
}
rk64.DeleteSubKeyTree(subKeyName); // Deletes old value
return true;
}
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(parentKey, false))
{
rk.OpenSubKey(parentKey);
//copy all the values
foreach (string valueName in rk.OpenSubKey(subKeyName).GetValueNames())
{
object objValue = rk.OpenSubKey(subKeyName).GetValue(valueName);
RegistryValueKind valKind = rk.OpenSubKey(subKeyName).GetValueKind(valueName);
rk.CreateSubKey(newSubKeyName).SetValue(valueName, objValue, valKind);
}
rk.DeleteSubKeyTree(subKeyName); // Deletes old value
return true;
}
}

它需要能够重命名32位注册表值和64位注册表值(应用程序是32位的(。重命名功能只是用新名称创建新值,将旧名称中的所有数据复制到新名称中,然后删除旧名称。

举个例子:有一个ListView显示了PC上所有安装的应用程序,我想将值UninstallString更改为!只需按下按钮即可卸载字符串,这样用户就无法在ListView中卸载选定的应用程序。该应用程序可能是64位的(意味着注册表值是64位,它需要一种稍微不同的方法(,也可能是32位的-因此出现了if(Environment.Is64BitOperatingSystem&&!Environment.Is64BitProcess(

因此,在示例中,我将SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip作为路径,并希望将值UninstallString重命名为!UninstallString,但它在foreach上退出,并返回一个错误:System.NullReferenceException:"对象引用未设置为对象的实例。"Microsoft.Win32.RegistryKey.OOpenSubKey(…(返回null

首先,让我说,这需要提升权限,这些更改是因为你想进入注册表并在其中写入,所以当你打开子项时,你需要实际告知。64位或32位。我不确定If,正如之前将军所指出的,但这将至少适用于32位路径

public static bool RenameSubKey(string parentKey, string key, string newValue)
{
if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
{
RegistryKey rk64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(parentKey, RegistryKeyPermissionCheck.ReadWriteSubTree);
rk64.SetValue(key, newValue);
return true;
}
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(parentKey, RegistryKeyPermissionCheck.ReadWriteSubTree))
{
rk.SetValue(key, newValue);
return true;
}
}

多亏了@nalnpir我修复了重命名注册表值函数

public static bool RenameSubKey(string path, string keyName, string newKeyName)
{
if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
{
RegistryKey rk64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(path, RegistryKeyPermissionCheck.ReadWriteSubTree);
object objValue = rk64.GetValue(keyName);
RegistryValueKind valKind = rk64.GetValueKind(keyName);
rk64.SetValue(newKeyName, objValue, valKind);
rk64.DeleteValue(keyName);
return true;
}
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(path, RegistryKeyPermissionCheck.ReadWriteSubTree))
{
object objValue = rk.GetValue(keyName);
RegistryValueKind valKind = rk.GetValueKind(keyName);
rk.SetValue(newKeyName, objValue, valKind);
rk.DeleteValue(keyName);
return true;
}
}

现在我发现我没有以正确的方式访问它(正如他启发我的那样(,这就是错误。

最新更新