从虚拟化Windows注册表中读取密钥

时间:2013-10-18 14:44:52

标签: windows registry inno-setup

我的旧应用程序写入注册表(最终被虚拟化),现在我希望安装程序实际读取此数据,当我直接尝试从LOCAL_MACHINE(我不知道密钥是虚拟化的)我得到错误,然后当我决定尝试直接从虚拟化密钥中读取时,我也遇到了错误。

Windows 2008服务器64位,我的应用程序是32位,启用了UAC。

实际上是否可以直接从虚拟化Windows注册表中读取?

现在我需要阅读这些数据,但是。

这不起作用。

  if regkeyexists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Company\App') then
  begin
    msgBox('Exists', mbinformation, mb_ok);
  end else begin
    msgBox('Doesnt exists', mbinformation, mb_ok);
  end;

这也行不通。

  if regkeyexists(HKEY_CURRENT_USER, 'Software\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node\Company\App') then
  begin
    msgBox('Exists', mbinformation, mb_ok);
  end else begin
    msgBox('Doesnt exists', mbinformation, mb_ok);
  end;

它说Key不存在

所以现在我实际上无法读取数据? 我已经检查过,路径没问题。

2 个答案:

答案 0 :(得分:3)

虚拟化密钥是每用户数据;这意味着即使您能够从安装程序中成功读取一个用户,您也只能阅读一个用户的设置,而不是所有用户(并且您已经找到了,并且很有可能赢得了#&# 39;甚至可以阅读那个)。

通常情况下,您可以忽略虚拟化,直到升级应用程序并使用兼容性清单标记它,此时它会丢失虚拟化,您必须正确处理注册表。因此,我假设您已经找到了自己的情况。

在这种情况下,正确的解决方案不在安装程序中,而是在您的应用程序中。您的安装程序应该根本不写入注册表,或者应该在HKLM中存储只读默认值。在启动时,您的应用程序应首先尝试按此顺序从位置读取设置(如果在那里找不到值,则仅向下移动列表):

  1. HKCU \ SOFTWARE \ YourCompany \ YourApp \ SettingName
  2. 您之前错误使用的HKLM密钥的VirtualStore位置
  3. 可能由安装人员编写的HKLM密钥
  4. 一些内部默认值
  5. 当您的应用程序保存设置时,它必须只写#1,而不是其他任何地方。另请注意,您必须按照此列表查看每个设置 - 某些设置可能在HKCU中,有些设置是虚拟化的,有些设置仅在HKLM中。

答案 1 :(得分:2)

我可以使用一些解决方法来解决我的问题,所以只是为了让别人知道以防其他人需要它。

发生的事情是,即使是管理员用户,在启用了UAC的Windows 2008服务器中,我的应用程序(不是以管理员身份运行)用于在虚拟化密钥中记录其注册表,而Inno Setup中的安装可以写入真正的LOCAL_MACHINE,使应用程序的注册表对我的应用程序不可见,反之亦然。

当我发布一个新版本时,我必须确保应用程序注册表位于LOCAL_MACHINE中,我使用“ShellExecAsOriginalUser”运行一个单独的应用程序来实际将虚拟化密钥导出到文件,然后导回到LOCAL_MACHINE通过Inno Setup。

我很感谢这里的所有回答!

相关问题