注册表的访问似乎因来源不同而有所不同。

4

我正在尝试在我的C#代码中添加一个注册表键

HKEY_CLASSES_ROOT\*\shell\blabla

我希望用户能够将任何文件发送给我的应用程序,就像“使用UltraEdit打开”一样。 我没有管理员权限,用户也没有管理员特权。
  1. If I am doing that in my C# code as posted below, I get a

    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. If I run Regedit and attempt to do it manually myself, I get a similar error:

    Error! Key could not be created. Error when writing to the registry.

但是,如果我双击一个试图写入相同键的*.reg文件,一切都能正常工作!

那么为什么会这样呢?

我有机会通过代码完成这个任务吗?
还是我应该只是改变我的代码来运行那个*.reg文件?

更新:

实际上,*.reg文件没有像上面所述的那样写入相同的键,但是

HKEY_CURRENT_USER\Software\Classes\*\shell\blabla

我没有注意到这个问题。似乎在HKEY_CURRENT_USER\Software\Classes*\shell\blabla下添加的所有内容也会被添加到HKEY_CLASSES_ROOT\*\shell\blabla中。对于造成的困惑,我感到抱歉。


1
现在不要再使用HKEY_CLASSES_ROOT作为shell扩展了,因为实际上它是位于需要管理员特权的HKEY_LOCAL_MACHINE\Software\Classes中的,因为那里的所有更改都会影响到所有用户帐户。相反,应将shell扩展添加到HKEY_CURRENT_USER\Software\Classes中,该位置可在没有管理员权限的情况下进行修改。UltraEdit只为当前用户注册其shell扩展,因为每个使用计算机的用户都应该选择使用shell扩展或者不使用。 - Mofi
哇,那就是原因!.reg文件并没有尝试写入相同的键,而是尝试写入“HKEY_CURRENT_USER\Software\Classes*\shell\blabla”。我没有注意到这一点,因为在执行reg文件后,我检查了“HKEY_CLASSES_ROOT\*\shell\blabla”,发现它在那里!对于造成的混淆,我很抱歉。我会更新问题。 - user1595494
1个回答

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\Classes的默认设置的用户特定设置。对HKEY_CLASSES_ROOT的注册表写入始终会被重定向到HKLM\Software\Classes。对HKLM中任何键的写访问需要管理员权限,这就是错误消息的原因。

微软建议根据当前用户更改默认设置或有效文件关联,直接编写到HKLM\Software\ClassesHKCU\Software\Classes

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接