OpenSubKey在VB.NET中返回null

时间:2012-07-11 06:57:46

标签: vb.net console installer uac

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

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

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

以下是一些建议:

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

3 个答案:

答案 0 :(得分:2)

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

  

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

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

  

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

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


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

(MSI内部可能会有所不同,具体取决于您构建它的用途 - 如果您目前正在使用VS安装项目,那么您将非常有限)

答案 1 :(得分:1)

在HKLM下查找相同路径的注册表项,而不是HKCU配置单元。只有在已经为所有用户安装了AutoCAD的情况下它才会存在。与当前用户"相反,前者非常可能。

如果仅为特定用户安装AutoCAD,并且您要在同一用户下安装其他内容,请检查自定义操作的msidbCustomActionTypeNoImpersonate标志。默认值为false,它应该对您有用,但是如果您将该标志更改为true,则会在Damien_The_Unbeliever的姐妹答案中描述该问题。

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

答案 2 :(得分:0)

如果使用的是AutoCAD x64,则在从安装程序(默认为x86)中调用自定义生成exe / DLL时,需要显式请求x64注册表。 因此,尝试将其更改为以下内容:

awk '/size|repo-name|creationTime|ob-name|sha/ {
                 print
     }
     /creationTime/ {
                 split($0,map,"-");
                 dat=(map[2]/10000000)-11644473600;
                 print "creationTime="strftime("%c",dat)
     } $(find <fulldirectorypath> -name "*.bytes" -size="+$size" -type f -printf "%h/%f\n" | awk '{ split($0,map,".");print map[1]".properties" }')