Не удается записать в раздел реестра
Я получаю ошибку, не могу записать в раздел реестра, когда пытаюсь сохранить ключи в реестре.
//Вот мой код.
Примечание. Я попытался запустить как Administartor, предполагая, что некоторые проблемы с разрешением все еще получают ту же ошибку....
private const string RegistryKeyName = "Skms";
private readonly RegistryKey SoftwareKey = Registry.LocalMachine.OpenSubKey("SOFTWARE");
public KeyManagementRegistryKeyChangeImpl(bool writeable)
{
this.writable = writeable;
RegistryKey skms;
if (Environment.Is64BitOperatingSystem == true)
{
skms = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(RegistryKeyName,true);
}
else
{
skms = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
}
if (null == skms)
{
skms = SoftwareKey.CreateSubKey(RegistryKeyName, RegistryKeyPermissionCheck.ReadWriteSubTree);
}
if(skms == null)
{
throw new System.ArgumentException(string.Format(CultureInfo.InvariantCulture,
@"Registry Key 'HKEY_LOCAL_MACHINE\SOFTWARE\{0}' not found or created",
RegistryKeyName));
}
Decryptor decryptor = Decryptor.Create();
Ответы
Ответ 1
if (null == skms)
{
skms = Registry.LocalMachine.OpenSubKey("SOFTWARE",true);
RegistryKey key = skms.CreateSubKey(
RegistryKeyName, RegistryKeyPermissionCheck.ReadWriteSubTree);
}
Это ответ на мой вопрос.
Ответ 2
Попробуйте следующее:
RegistryKey skms = SoftwareKey.OpenSubKey(RegistryKeyName, true);
Второй параметр должен быть установлен в true, если вам нужен доступ на запись к ключу.
-Edit -
В 64-битной системе вы можете попробовать это (если вы используете .Net 4):
private readonly RegistryKey SoftwareKey =
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).
OpenSubKey("SOFTWARE");
Ответ 3
Вероятно, вы ошибаетесь в перенаправлении реестра. Возможно, у вас есть 32-битный процесс в 64-битной системе и запись в HKLM\Software переадресовывается в HKLM\Software\Wow6432Node.
Вам нужно открыть 64-битный ключ напрямую или скомпилировать для AnyCPU.
Ответ 4
попробуйте это... кто-то может найти полезный....
using System.Security;
using System.Security.AccessControl;
using Microsoft.Win32;
string user = Environment.UserDomainName + "\\" + Environment.UserName;
RegistryKey rk =
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).
OpenSubKey("SOFTWARE",true);
RegistrySecurity rs = new RegistrySecurity();
rs.AddAccessRule(new RegistryAccessRule(user,
RegistryRights.WriteKey | RegistryRights.ReadKey | RegistryRights.Delete,
InheritanceFlags.None,
PropagationFlags.None,
AccessControlType.Allow));
rk = Registry.CurrentUser.CreateSubKey("RegistryRightsExample",
RegistryKeyPermissionCheck.Default, rs);