C# - 文件关联拒绝访问注册表项“HKEY_CLASSES_ROOT”

时间:2011-01-05 19:48:20

标签: c# registry file-association

我目前有一个使用注册表设置文件关联的程序(注意,它是一个.NET 2.0,所以我必须通过注册表方法)。问题是,因为它试图写入HKCR,它可能会遇到管理问题(在其他机器上)。是否有更通用的方法来设置文件关联(对于.NET 2.0),例如使用HKCU或其他不需要管理权限的方法。

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);

2 个答案:

答案 0 :(得分:17)

HKEY_CLASSES_ROOT是另外两个位置的别名,合并:

  • HKEY_CURRENT_USER\Software\Classes
  • HKEY_LOCAL_MACHINE\Software\Classes

您必须确定注册文件的原因。文件注册是否应该适用于所有用户?如果是,则要注册与HKEY_CLASSES_ROOT的关联(将隐式将其写入HKEY_LOCAL_MACHINE

或者注册仅适用于当前用户?如果是,请在HKEY_CURRENT_USER中注册您的文件。

请记住,仅仅因为一个用户安装了您的程序并不意味着所有用户都希望拥有它;所以请考虑该计划的用途。

无论哪种方式,在使用MSI安装程序进行安装期间,注册文件关联的适当时间。 MSI安装程序知道如何在安装期间要求提升 - 如果需要的话。并非所有软件都必须进入Program Files,有些软件可以进入%APPDATA%(即Chrome),其中不需要管理员权限即可安装 - 并且只为一个用户安装。

答案 1 :(得分:5)

您可以在无法访问HKLM的情况下使用user-specific file associations

或者,您可以将您的应用程序显示为需要管理员权限。

通常情况下,在应用程序安装期间设置文件关联,其中管理员权限通常可用。