【问题标题】:Inno-Setup update HKCU of original user in Win7/VistaInno-Setup 更新 Win7/Vista 中原始用户的 HKCU
【发布时间】:2011-02-23 17:31:41
【问题描述】:

我正在尝试将我的应用程序路径添加为使用 Inno Setup 进行 MS Access 安装的受信任位置。我的脚本中有以下几行:

[Registry]
; Add the application folder as a trusted location for Access 2007
Root: HKCU; SubKey: Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}; ValueType: string; ValueName: Path; ValueData: {app}; Check: AccessVersion('2007');
Root: HKCU; SubKey: Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}; ValueType: string; ValueName: Description; ValueData: Grandjean and Braverman applications; Check: AccessVersion('2007');
Root: HKCU; SubKey: Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}; ValueType: dword; ValueName: AllowSubfolders; ValueData: 1; Check: AccessVersion('2007');

这在 Windows XP 和更早版本中运行良好,但在 Vista/Win7 中的用户帐户控制下通常会失败,因为运行安装的(提升的)用户可能与当前登录的用户不同。

我能想到的唯一解决方法是通过ShellExecAsOriginalUser 提取并运行一个 .reg 文件,但这似乎很老套。有没有更好的办法?

理想情况下,我希望为系统上的所有用户添加受信任的位置。

【问题讨论】:

    标签: ms-access-2007 inno-setup


    【解决方案1】:

    我使用command-line utility reg.exe 对原始用户的 HKCU 进行更新。 Reg.exe 至少从 Win XP 开始就随 Windows 一起提供。由于早期版本的 Windows 可能没有 reg.exe(或者可能由于其他原因无法访问),因此我保留了注册表部分行以提供冗余和回退。

    它仍然有点老套,但我认为它比任何其他替代品都要好。以下是使用这种方法的问题的线条:

    [Registry]
    ; Add the application folder as a trusted location for Access 2007 for the installing user (degrades gracefully for Windows 2000 and earlier)
    Root: HKCU; SubKey: Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}; ValueType: string; ValueName: Path; ValueData: {app}; Check: AccessVersion('2007');
    Root: HKCU; SubKey: Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}; ValueType: string; ValueName: Description; ValueData: Grandjean and Braverman applications; Check: AccessVersion('2007');
    Root: HKCU; SubKey: Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}; ValueType: dword; ValueName: AllowSubfolders; ValueData: 1; Check: AccessVersion('2007');
    
    [Run]
    ; Add the application folder as a trusted location for Access 2007 for the current user
    Filename: Reg.exe; Parameters: "add ""HKCU\Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}"" /v Path /t REG_SZ /d ""{app}"" /f"; Flags: runasoriginaluser; Check: AccessVersion('2007'); StatusMsg: Adding trusted location...
    Filename: Reg.exe; Parameters: "add ""HKCU\Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}"" /v Description /t REG_SZ /d ""Grandjean and Braverman applications"" /f"; Flags: runasoriginaluser; Check: AccessVersion('2007'); StatusMsg: Adding trusted location...
    Filename: Reg.exe; Parameters: "add ""HKCU\Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\{#DirName}"" /v AllowSubfolders /t REG_DWORD /d 1 /f"; Flags: runasoriginaluser; Check: AccessVersion('2007'); StatusMsg: Adding trusted location...
    

    请注意,这些行已从 [Registry] 部分复制并修改为 [Run] 部分,并设置了标志 runasoriginaluser

    【讨论】:

      【解决方案2】:

      针对您的特定情况的一个解决方案是创建不需要提升权限的第二个设置,仅用于更新注册表。

      您可以将第二个安装可执行文件包含在第一个可执行文件中,并使用已经提到的 ShellExecuteAsOriginalUser 使用 /verysilent 命令行参数调用它。

      对于您的第二个问题,您必须将其作为不同的问题发布,我不是访问专家,但也许您可以进行整机配置,将相同的值添加到 HKLM 注册表项。

      我的 5 美分。

      【讨论】:

      • 第二个安装程序的想法不错。至于做整台机器,我考虑过遍历 HKEY_USERS 配置单元并为每个用户添加行。我的安装程序中已经有很多 pascal 脚本,但我绝不是专家,所以我不确定这种方法是否可行。
      • @mwolfe02:AFAIK 枚举 HKEY_USERS 只会给你在那个确切时刻加载的用户配置单元。它不会让您访问当前未登录的用户“休眠”的配置单元。
      • @Oliver:很高兴知道。如果是这种情况,那么尝试枚举 HKU 蜂巢就没有多大意义了。无论如何,我对我目前的解决方法(使用reg.exerunasoriginaluser)相当满意,并且在可预见的未来可能会坚持下去。
      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      相关资源
      最近更新 更多