How to use RegistryKey.SetValue
Asked Answered
R

2

6

I'm trying to create a new registry key using following code and getting this error:

Cannot write to the registry key.

Where am I going wrong???

var rs = new RegistrySecurity();
string user = Environment.UserDomainName + "\\" + Environment.UserName;
rs.AddAccessRule(new RegistryAccessRule(user,
                                        RegistryRights.WriteKey | RegistryRights.SetValue,
                                        InheritanceFlags.None,
                                        PropagationFlags.None,
                                        AccessControlType.Allow));
RegistryKey key;
key = Registry.LocalMachine.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System", RegistryKeyPermissionCheck.ReadSubTree, rs);
key.SetValue("kashif", 1, RegistryValueKind.DWord);
key.Close();
Rotorua answered 25/1, 2013 at 22:10 Comment(1)
Yes I'm running with an administrator accountRotorua
P
8

You need to open the newly created key for read/write access:

key = Registry.LocalMachine.CreateSubKey(
    @"Software\Microsoft\Windows\CurrentVersion\Policies\System",
    RegistryKeyPermissionCheck.ReadWriteSubTree, // read-write access
    rs);
Puett answered 25/1, 2013 at 22:15 Comment(5)
@kashif: Is the application running with elevated privileges?Puett
I'm logged in with administrator privileges. when I'm building the application and right clicking the exe and then running it as administrator it runs fine that i don't want. that's why I am using registry security in it.Rotorua
@kashif: It doesn't work like that. You are setting the security for the new key, but to create the new key you need to have write permission for System first. And the only way to get that is to run elevated.Puett
@kashif: You cannot get administrative privileges "through coding". If you could, everyone else would do that as well and the UAC elevation prompt would have no reason to exist since everyone would be bypassing it.Puett
thanks. you solved my problem but having altered my coding the way you suggested created another problem that i solved by this link stackoverflow.com/questions/3446211Rotorua
T
1

You don't need the rs part unless you are trying to assign specific permissions to the key you are creating.

You need to:

  1. Open the key where you want to create your subkey and assign it to a RegistryKey variable. Add a true Boolean to mark it as writeable.
  2. Create your subkey using that variable, and assign that back to the same variable.
  3. Set the value using your RegistryKey variable.

Example:

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);
key = key.CreateSubKey("MyNewKey");
key.SetValue("kashif", 1, RegistryValueKind.DWord);

If you just want to edit an existing key, as System is, you don't use CreateSubKey, because the key already exists. That is only for creating new keys. You use OpenSubKey.

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);
key.SetValue("kashif", 1, RegistryValueKind.DWord);
Tunicle answered 23/2, 2017 at 15:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.