我正在尝试在
下的C#代码中添加一个注册表项HKEY_CLASSES_ROOT\*\shell\blabla
我希望用户能够将任何文件发送到我的应用程序,有点像Open with UltraEdit
左右。
我没有管理员权限,用户也没有管理员权限。
如果我在下面发布的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\"");
如果我运行 Regedit 并尝试自己手动执行,我会收到类似的错误:
错误!无法创建密钥。写入注册表时出错。
但是,如果我双击试图编写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 。对不起,感到困惑。
答案 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类注册信息的当前有效设置,而不能用于添加或更改它们。