我有一个控制台程序,可以读取HKCU下的注册表项:
OpenSubKey("Software\\Autodesk\\AutoCAD")
该程序运行良好,但当我尝试在安装项目中将其用作Custom Action
时,它返回null
值。
以下是一些建议:
答案 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" }')