1

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

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

该程序工作得很好,但是当我尝试将它用作Custom Action安装项目时,它返回了一个null值。

以下是一些建议:

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

3 回答 3

2

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

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

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

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

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


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

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

于 2012-07-11T07:15:49.520 回答
1

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

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

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

于 2012-07-11T08:27:25.377 回答
0

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

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

       
于 2020-12-02T17:14:14.927 回答