RegistryKey CreateSubKey上的C#UnauthorizedAccessException

时间:2012-01-12 17:37:21

标签: c# windows-mobile registry mobile-emulator

每当我尝试在代码中调用UnauthorizedAccessException时,我都会收到CreateSubKey

const string regKeyPath = @"Software\Apps\jp2code.net\FTMaint";

private void BuildRegistry() {
  string[] split = regKeyPath.Split('\\');
  keyMaker(Registry.LocalMachine, split, 0);
}

private static void keyMaker(RegistryKey key, string[] path, int index) {
  string keyValue = path[index++];
  RegistryKey key2;
  if (!String.IsNullOrEmpty(keyValue)) {
    string subKey = null;
    string[] subKeyNames = key.GetSubKeyNames();
    foreach (var item in subKeyNames) {
      if (keyValue == item) {
        subKey = item;
      }
    }
    if (String.IsNullOrEmpty(subKey)) {
      key2 = key.CreateSubKey(keyValue);
    } else {
      key2 = key.OpenSubKey(subKey);
    }
    //key2 = key.OpenSubKey(keyValue, String.IsNullOrEmpty(subKey));
  } else {
    key2 = key;
  }
  if (index < path.Length) {
    try {
      keyMaker(key2, path, index + 1);
    } finally {
      key2.Close();
    }
  }
}

我发现有人在MSDN Social上有类似问题>> HERE <<的帖子,但那里的解决方案(使用重载的OpenSubKey方法)只为我返回了一个NULL RegistryKey

这适用于Windows Mobile 5设备模拟器。

谁能看到我做错了什么?

第一次代码到达不存在的密钥时会抛出错误并尝试创建它。

谢谢!

screen shot

3 个答案:

答案 0 :(得分:2)

在WinMo 6仿真器上,所有这三个对我都很好。

创建根密钥:

using (var swKey = Registry.LocalMachine.CreateSubKey("foo"))
{
    using (var subkey = swKey.CreateSubKey("OpenNETCF"))
    {
    }
}

通过路径

创建子项
using (var swKey = Registry.LocalMachine.CreateSubKey("software\\foo"))
{
    using (var subkey = swKey.CreateSubKey("OpenNETCF"))
    {
    }
}

直接创建子项:

using (var swKey = Registry.LocalMachine.OpenSubKey("software", true))
{
    using (var subkey = swKey.CreateSubKey("OpenNETCF"))
    {
    }
}

答案 1 :(得分:0)

要在安装期间在LocalMachine中创建密钥,请执行以下操作:

[RunInstaller(true)]
public class InstallRegistry : Installer
{
    public override void Install(System.Collections.IDictionary stateSaver)
    {
        base.Install(stateSaver);

        using (RegistryKey key = Registry.LocalMachine.CreateSubKey(@"software\..."))
        {
            RegistrySecurity rs = new RegistrySecurity();
            rs.AddAccessRule(new RegistryAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), RegistryRights.FullControl, InheritanceFlags.None, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
            key.SetAccessControl(rs);
        }
    }
    public override void Rollback(System.Collections.IDictionary savedState)
    {
        base.Rollback(savedState);
    }
}

希望这会对你有所帮助。

答案 2 :(得分:0)

我在通过 RegistryKey 创建 Registry.CurrentUser.OpenSubKey 实例时发现它是只读的。所以我可以拨打GetValue,但是当我尝试拨打SetValue时,我得到了UnauthorizedAccessException。诀窍是调用 Registry.CurrentUser.OpenSubKey 将 writable 参数设置为 true,然后调用 SetValue 成功。

所以代替:

key2 = key.OpenSubKey(subKey);

使用:

key2 = key.OpenSubKey(subKey, writable: true);

这可能同样适用于对 CreateSubKey 的调用。

最初的问题是在 Windows Mobile 上下文中提出的。我没有使用过 Windows Mobile(现在不确定是否有人使用过),但我希望可写参数会在那里。