C# - File Assocation Access to the registry key 'HKEY_CLASSES_ROOT\' is denied
c#, file-association, registry
Solution
`HKEY_CLASSES_ROOT` is an alias, a merging, of two other locations:
- `HKEY_CURRENT_USER\Software\Classes`
- `HKEY_LOCAL_MACHINE\Software\Classes`
You have to decide why you're registering the file. Is the file registration supposed to be for all users? If so, you want to register the association with `HKEY_CLASSES_ROOT` (which will implicitly write it to `HKEY_LOCAL_MACHINE`.
Or is the registration meant for only the current user? If so, register your file in `HKEY_CURRENT_USER`.
Keep in mind that just because one user installs your program doesn't mean that all users want to have it; so consider what the program is for.
Either way, the proper time to register your file association was during installation with the MSI installer. MSI installers know how to ask for elevation during install - if it's required. Not all software has to go in `Program Files`, some can go in `%APPDATA%` (i.e. Chrome) where no admin privileges are required to install - and it's only installed for the one user.
Problem
I currently have a program that sets file association using the registry (Note, it's a .NET 2.0 so I have to go through the registry method). The problem is, since it's trying to write to HKCR, the possibility exists of it running into an administrative problem (on other machines). Is there a more universal way to set file association (for .NET 2.0) such as using HKCU or some other method that doesn't require administrative privileges. ``` string keyName = "Class"; string keyValue = "Class File"; string apppath = Application.ExecutablePath.ToLower() + " \"%1\""; RegistryKey key; key = Registry.ClassesRoot.CreateSubKey(keyName); key.SetValue("", keyValue); RegistryKey iconkey; key = Registry.ClassesRoot.CreateSubKey(keyName); iconkey = key.CreateSubKey("DefaultIcon"); iconkey.SetValue("", Environment.CurrentDirectory + "\\resources\\musicfile.ico"); key = key.CreateSubKey("shell"); key = key.CreateSubKey("open"); key = key.CreateSubKey("command"); key.SetValue("", apppath); ```