【问题标题】:OpenSubKey returns null in VB.NETOpenSubKey 在 VB.NET 中返回 null
【发布时间】:2012-07-10 17:57:06
【问题描述】:

我有一个控制台程序可以读取 HKCU 下的注册表项:

OpenSubKey("Software\\Autodesk\\AutoCAD")

该程序运行良好,但是当我尝试在安装项目中将其用作Custom Action 时,它返回了null 值。

以下是一些建议:

  1. 关闭UAC(用户帐户控制)即可解决问题。
  2. 如果我可以通过双击运行此控制台,即使 UAC 已打开,它也能正常工作。

【问题讨论】:

    标签: vb.net console installation uac


    【解决方案1】:

    如果它返回 null 而不是抛出异常,那么这不是权限问题 - 密钥不存在。 OpenSubKey:

    如果找不到指定的子键,则返回null。

    (并且,请注意上面列出的例外情况):

    SecurityException用户没有读取注册表项所需的权限。

    因此,可能的问题是您的操作在安装过程中被调用,当它由 Windows Installer 服务运行时 - 该服务在本地系统帐户下运行,而不是在登录用户的帐户下运行。


    不知道你想用这个键实现什么,我不确定建议什么解决方法。可能您可以使用 MSI 系统中的标准内置设施来实现您的目标 - 或者您可能希望将此操作推迟到您的程序第一次实际运行时。

    (MSI 中可能的内容可能会因您用于构建它的内容而异 - 如果您当前使用的是 VS Setup 项目,您将受到很大限制)

    【讨论】:

    • 此服务在本地系统帐户下运行,而不是在登录用户的帐户下。 我认为这是关键解决方案,因为我注意到如果用户选择 以管理员身份运行它会正常工作我想知道为什么当Windows通过安装询问权限时它不起作用?
    【解决方案2】:

    在 HKLM 下查找相同路径的注册表项,而不是 HKCU hive。只有在“为所有用户”而不是“为当前用户”安装 AutoCAD 时才会存在,但前者很有可能。

    如果仅为特定用户安装了 AutoCAD,并且您在同一用户下安装了其他软件,请检查自定义操作的 msidbCustomActionTypeNoImpersonate 标志。默认值为 false 应该适合您,但如果您已将该标志更改为 true,您将遇到 Damien_The_Unbeliever 的姐妹回答中已经描述的问题。

    如果 AutoCAD 仅针对特定用户安装,而您要在 不同 用户(例如管理员)下安装其他内容,则请注意您的要求中的逻辑漏洞。 HKCU 配置单元不是一个系统范围的配置单元,但每个登录用户的内容都不同。 可能有多个具有不同注册表内容的并行 AutoCAD 安装,您需要明确您真正想要对它们中的每一个做什么;或者通过一些不同的方法达到你的最终目标。

    【讨论】:

      【解决方案3】:

      如果您使用的是 AutoCAD x64,则需要在从设置调用自定义构建 exe/DLL 时明确请求 x64 注册表(默认为 x86)。 所以尝试将其更改为以下内容:

      RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("Software\\Autodesk\\AutoCAD")
      
             
      

      【讨论】:

        猜你喜欢
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 2016-11-07
        相关资源
        最近更新 更多