在c#应用程序中写入注册表

本文关键字:注册表 应用程序 | 更新日期: 2023-09-27 18:07:09

我正在尝试使用我的c#应用程序写入注册表。

我使用这里给出的答案:用c#

向注册表写入值

然而,由于某些原因,键没有添加到注册表中。

我使用下面的代码:

string Timestamp = DateTime.Now.ToString("dd-MM-yyyy");
string key = "HKEY_LOCAL_MACHINE''SOFTWARE''"+Application.ProductName+"''"+Application.ProductVersion;
string valueName = "Trial Period";
Microsoft.Win32.Registry.SetValue(key, valueName, Timestamp, Microsoft.Win32.RegistryValueKind.String);

Application.nameApplication.version文件夹不存在。

我必须先创建它们吗?

此外,我正在64b Win版本上测试它,所以我想如果我想检查注册表中添加的键,我必须特别检查32位注册表中的:C:'Windows'SysWOW64'regedit.exe不是吗?

在c#应用程序中写入注册表

首先,如果你想在LocalMachine下编辑密钥,你必须在admin权限下运行你的应用程序(最好使用CurrentUser,它更安全,或者在安装程序中创建密钥)。你也必须在编辑模式下打开key (OpenSubKey方法)来添加新的子键。我已经检查了代码,它可以工作。下面是代码。

RegistryKey key = Registry.LocalMachine.OpenSubKey("Software",true);
key.CreateSubKey("AppName");
key = key.OpenSubKey("AppName", true);

key.CreateSubKey("AppVersion");
key = key.OpenSubKey("AppVersion", true);
key.SetValue("yourkey", "yourvalue");

您可以使用以下代码创建并打开所需的注册表项。

RegistryKey SoftwareKey   = Registry.LocalMachine.OpenSubKey("Software",true);
RegistryKey AppNameKey    = SoftwareKey.CreateSubKey("AppName");
RegistryKey AppVersionKey = AppNameKey.CreateSubKey("AppVersion");
AppVersionKey.SetValue("yourkey", "yourvalue");

你基本上可以使用CreateSubKey所有的应用程序设置,因为它会打开键写访问,如果它已经存在,否则创建它。不需要先创建,然后再打开。当您绝对确定密钥已经存在时,OpenSubKey会派上用场,就像在这种情况下,"HKEY_LOCAL_MACHINE'SOFTWARE'"

还要检查您的注册表调用是否正在虚拟化。查看更多信息

如果您的应用程序不支持UAC,并且出于兼容性原因会发生这种情况。

Real path
HKEY_LOCAL_MACHINE'Software'FooKey
Virtual path
HKEY_USERS'<User SID>_Classes'VirtualStore'Machine'Software'FooKey

尝试先打开HKLM'Software。然后为您的程序创建密钥,然后为版本创建密钥。但是,您的密钥可以放置在HKLM'software'WOW6432Node。检查这个。

问题是您没有足够的权限。下面是my:

的一个方法
RegistryKey myKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
myKey = myKey.OpenSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
if (myKey != null)
{
    myKey.SetValue("DefaultPrinterId", ldiPrinters[e.RowIndex].id, RegistryValueKind.String);
    myKey.Close();
}
与RegistryKey

。OpenBaseKey你打开正确的注册表,因为当你没有权限的注册表,你写,它在另一个位置

默认情况下,您的更改将写入HKLM'SOFTWARE'WOW6432Node'…因为注册表重定向这可能很令人困惑。

为了给HKLM'SOFTWARE'…,您需要使用RegistryKey.OpenBaseKey打开64位注册表:

var path = @"SOFTWARE'...";
var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var key = baseKey.CreateSubKey(path, RegistryKeyPermissionCheck.ReadWriteSubTree);
key.SetValue(name, value, RegistryValueKind.String);

同时,您需要有权限写入指定的注册表项。

你可以通过为特定用户或服务帐户分配权限或通过在提升模式下运行应用程序来获得权限。