2012-07-11 76 views
1

返回null我有读HKCU下的注册表键值控制台程序:OpenSubKey在VB.NET

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

程序工作很细,但是当我试图在使用它作为一个Custom Action的安装项目它返回了一个null值。

以下是一些建议:

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

回答

2

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

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

(而且,请注意上面有列出的例外):

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

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


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

(什么是可能的MSI内部可能取决于你使用建立它有什么不同 - 如果您目前使用VS安装项目,你会相当有限)

+0

_this服务在本地系统帐户下运行,而不是在登录用户的account._ 我认为这是解决问题的关键,因为我发现,如果用户选择_run作为administrator_它会正常工作 我不知道为什么当Windows通过安装询问权限是否无效? – 2012-07-11 23:46:06

1

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

如果AutoCAD仅为特定用户安装,并且您在同一用户下安装其他东西,请检查自定义操作的msidbCustomActionTypeNoImpersonate标志。默认值为false,应该适用于您,但是如果您已将该标志更改为true,则会在Damien_The_Unbeliever的姐姐回答中说明问题。

如果AutoCAD仅为特定用户安装,并且您正在安装不同的用户(如管理员),请注意您的需求中的某处存在逻辑间隙。 HKCU配置单元不是一个系统范围的配置单元,但其每个登录用户的内容都不相同。 可能会有几个并行的AutoCAD安装具有不同的注册表内容,您需要清楚自己真正想要对它们做什么;或通过一些不同的方法达到你的最终目标。