访问注册表似乎与不同来源不同

时间:2014-08-29 07:01:47

标签: c# registry

我正在尝试在

下的C#代码中添加一个注册表项
HKEY_CLASSES_ROOT\*\shell\blabla

我希望用户能够将任何文件发送到我的应用程序,有点像Open with UltraEdit左右。

我没有管理员权限,用户也没有管理员权限。

  1. 如果我在下面发布的C#代码中这样做,我会得到一个

      

    System.UnauthorizedAccessException的

    Registry.SetValue("HKEY_CLASSES_ROOT\\*\\shell\\blabla", null, "FastSearch");
    string path = Application.ExecutablePath;
    Registry.SetValue("HKEY_CLASSES_ROOT\\*\\shell\\blabla" + "\\Command", null, path + " \"%1\"");
    
  2. 如果我运行 Regedit 并尝试自己手动执行,我会收到类似的错误:

      

    错误!无法创建密钥。写入注册表时出错。

  3. 但是,如果我双击试图编写SAME KEY的* .reg文件,一切正常!

    那为什么呢?

    我是否有机会通过代码完成这项工作? 或者我应该只是更改我的代码来运行* .reg文件?

    更新:

    实际上* .reg文件没有按上述说明编写SAME KEY,但是

    HKEY_CURRENT_USER\Software\Classes\*\shell\blabla
    

    我没有注意到这一点。似乎在 HKEY_CURRENT_USER \ Software \ Classes * \ shell \ blabla 下添加的任何内容也会添加到 HKEY_CLASSES_ROOT \ * \ shell \ blabla 。对不起,感到困惑。

1 个答案:

答案 0 :(得分:3)

虽然问题已经解决,但与C#代码相比,同时也找到了成功导入* .reg文件的原因,这里是这个问题的完整答案。

Microsoft所描述的

HKEY_CLASSES_ROOT Key(简称 HKCR )显示了对当前用户有效的文件扩展名关联和COM类注册信息。

这些键的注册表中的真实位置是:

  • HKEY_LOCAL_MACHINE \ Software \ Classes (简短 HKLM \ Software \ Classes )包含使用计算机的所有用户的默认值

  • HKEY_CURRENT_USER \ Software \ Classes (简短 HKCU \ Software \ Classes ),其中包含覆盖 HKLM \ Software默认设置的用户特定设置\类

HKEY_CLASSES_ROOT 的注册表写入始终会重定向到 HKLM \ Software \ Classes 。对 HKLM 中任何键的写访问权限都需要管理权限,这是错误消息的原因。

Microsoft建议直接写入 HKLM \ Software \ Classes HKCU \ Software \ Classes ,具体取决于更改当前用户的默认值或有效文件关联

将操作写入 HKCU 下的键不需要管理员权限。

HKCR 只能用于读取文件扩展名关联和COM类注册信息的当前有效设置,而不能用于添加或更改它们。