首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# UnauthorizedAccessException on RegistryKey CreateSubKey

C# UnauthorizedAccessException on RegistryKey CreateSubKey
EN

Stack Overflow用户
提问于 2012-01-12 17:37:21
回答 3查看 4K关注 0票数 1

每当我试图在代码中调用UnauthorizedAccessException时,我都会得到一个CreateSubKey

代码语言:javascript
复制
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上找到了一个类似问题>> HERE <<的帖子,但是那里的解决方案(使用重载的OpenSubKey方法)只为我返回了一个空RegistryKey

这是针对Windows 5设备模拟器的。

,有人能看出我做错了什么吗?

当代码第一次到达不存在的键并试图创建它时,将引发错误。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-12 19:20:36

在WinMo 6仿真程序上,所有这三个都可以很好地工作。

创建一个根键:

代码语言:javascript
复制
using (var swKey = Registry.LocalMachine.CreateSubKey("foo"))
{
    using (var subkey = swKey.CreateSubKey("OpenNETCF"))
    {
    }
}

通过路径创建子键

代码语言:javascript
复制
using (var swKey = Registry.LocalMachine.CreateSubKey("software\\foo"))
{
    using (var subkey = swKey.CreateSubKey("OpenNETCF"))
    {
    }
}

直接创建子键:

代码语言:javascript
复制
using (var swKey = Registry.LocalMachine.OpenSubKey("software", true))
{
    using (var subkey = swKey.CreateSubKey("OpenNETCF"))
    {
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-03-05 16:58:48

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

因此,与其:

代码语言:javascript
复制
key2 = key.OpenSubKey(subKey);

用途:

代码语言:javascript
复制
key2 = key.OpenSubKey(subKey, writable: true);

CreateSubKey的调用可能也是如此。

最初的问题是在Windows的上下文中提出的。我没有使用Windows (这些天没有人使用),但我预计可写参数会出现在那里。

票数 1
EN

Stack Overflow用户

发布于 2012-01-12 18:16:04

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

代码语言:javascript
复制
[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);
    }
}

希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8839593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档