ABCD
ABCD

Reputation: 907

SetValue 64bit machine registry

I want to set a value for 'NoModify' in below registry path. "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\XXXX"

I am using below code and it works only for X86 machines. Can you see any reason why this is not working for x64 machines?

// This value is correct
RegistryView registryView = releaseFlags.Contains("PLATFORM_X86") ? RegistryView.Registry64 : RegistryView.Registry32;

    using (RegistryKey hkeyLocalMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
    {
        RegistryKey noModifyKey = hkeyLocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{xxxx}", true); //SL: Key Name

        if (noModifyKey != null)
        {
            noModifyKey.SetValue("NoModify", 0);
            noModifyKey.Flush();
        }
    }

Upvotes: 5

Views: 1558

Answers (4)

mehdi
mehdi

Reputation: 685

You should open base key in this way.
It works for me.

var rk = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
    if (Environment.Is64BitOperatingSystem) {
        rk = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
        var val = rk.OpenSubKey("SOFTWARE\\Pourab\\sanjande", true);
    
        val.SetValue("test", "testvalue");
    }

Upvotes: 2

ABCD
ABCD

Reputation: 907

It's my mistake in the code.

RegistryView registryView = releaseFlags.Contains("PLATFORM_X86") ? RegistryView.Registry64 : RegistryView.Registry32;

Should be as follows:

RegistryView registryView = releaseFlags.Contains("PLATFORM_X86") ? RegistryView.Registry32 : RegistryView.Registry64;

Upvotes: 1

Alvin Wong
Alvin Wong

Reputation: 12420

As far as you compiles your .NET program as x86 not AnyCPU, you will be using the "correct" registry keys meant for x86 in any circumstances because it will be running as x86.

If you compile it as x64 or AnyCPU, it could be quite tricky because it will probably run as x64 on an x64 machine and uses the "wrong" registry where HKLM\SOFTWARE for x86 programs is actually HKLM\SOFTWARE\WOW6432Node.

Upvotes: 1

tsells
tsells

Reputation: 2771

When you are on a 64 bit machine and your app is 32 bit - it should store these settings in the HKLM\Software\WOW6432Node instead of the HKLM\Software\ node.

Upvotes: 2

Related Questions