【问题标题】:Recursive MSI Chaining递归 MSI 链接
【发布时间】:2023-03-28 16:49:01
【问题描述】:

我正在使用 InstallShield 2015 编写基本 MSI 类型的安装程序。我有一个服务器安装、一个工作站安装和一个第三方 (Microsoft) 安装程序,用于支持通过 COM 互操作 (Microsoft.InteropformsRedist.msi) 访问 .NET 表单。工作站需要安装 Microsoft.InteropformsRedist.msi。服务器需要安装工作站。这些配对单独工作,但是当服务器尝试安装工作站时,工作站又想安装 InteropformsRedist,似乎没有安装 InteropformsRedist。我在 MSI 日志中看到了它的提及,但没有明确表明它实际上没有安装。我刚刚在安装后遇到错误,通过手动运行 InteropformRedist.msi 解决了这些错误。

日志中第一次提到 InteropformsRedist 看起来像:

InstallShield 12:11:11: Extracting temp files for chained package Pkg1 to 'C:\Users\bmarty\AppData\Local\Temp\{88EF0570-B960-4DD7-BF2F-F942CE0C9EEE}'
MSI (s) (70!C0) [12:11:24:671]: PROPERTY CHANGE: Adding IS_CHAINER_POST_COMMANDLINE property. Its value is '/l"C:\Users\bmarty\AppData\Local\Temp\MSI7fa2d.LOG" /qb /iC:\Users\bmarty\AppData\Local\Temp\{88EF0570-B960-4DD7-BF2F-F942CE0C9EEE}\Microsoft.InteropformsRedist.msi'.
MSI (s) (70!C0) [12:11:24:671]: PROPERTY CHANGE: Adding ISChainPackageCommit property. Its value is 'C:\Users\bmarty\AppData\Local\Temp\{88EF0570-B960-4DD7-BF2F-F942CE0C9EEE}'.
MSI (s) (70!C0) [12:11:24:671]: PROPERTY CHANGE: Adding ISChainPackageRollback property. Its value is 'C:\Users\bmarty\AppData\Local\Temp\{88EF0570-B960-4DD7-BF2F-F942CE0C9EEE}'.
InstallShield 12:11:11: Extracting file 'C:\Users\bmarty\AppData\Local\Temp\{88EF0570-B960-4DD7-BF2F-F942CE0C9EEE}\Microsoft.InteropformsRedist.msi' for chained package Pkg1
MSI (s) (70:EC) [12:11:24:672]: Doing action: InstallInitialize
Action ended 12:11:24: ISChainPackagePrepare. Return value 1.
MSI (s) (70:EC) [12:11:24:673]: Machine policy value 'AlwaysInstallElevated' is 0
MSI (s) (70:EC) [12:11:24:673]: User policy value 'AlwaysInstallElevated' is 0
MSI (s) (70:EC) [12:11:24:673]: BeginTransaction: Locking Server
MSI (s) (70:EC) [12:11:24:674]: Server not locked: locking for product {11FD6005-8100-4B5C-85E6-C26BAD6C8696}
Action start 12:11:24: InstallInitialize.
MSI (s) (70:EC) [12:11:26:245]: Doing action: ISChainPackageRollback
Action ended 12:11:26: InstallInitialize. Return value 1.
MSI (s) (70:EC) [12:11:26:246]: Note: 1: 2205 2:  3: MsiPatchCertificate 
MSI (s) (70:EC) [12:11:26:246]: LUA patching is disabled: missing MsiPatchCertificate table
Action start 12:11:26: ISChainPackageRollback.
MSI (s) (70:EC) [12:11:26:249]: Doing action: ISChainPackageCommit
Action ended 12:11:26: ISChainPackageRollback. Return value 1.
Action start 12:11:26: ISChainPackageCommit.
MSI (s) (70:EC) [12:11:26:250]: Doing action: AllocateRegistrySpace
Action ended 12:11:26: ISChainPackageCommit. Return value 1.
Action start 12:11:26: AllocateRegistrySpace.
MSI (s) (70:EC) [12:11:26:251]: Doing action: ProcessComponents
Action ended 12:11:26: AllocateRegistrySpace. Return value 1.
Action start 12:11:26: ProcessComponents.
MSI (s) (70:EC) [12:11:26:253]: Doing action: UnpublishComponents
Action ended 12:11:26: ProcessComponents. Return value 1.

那里是否有任何迹象表明它为什么没有实际安装?有什么技巧可以让这项工作发挥作用吗?

【问题讨论】:

  • 链接的 msi 应该有自己的日志(假设您已打开 msi 日志记录),您可能会在那里找到原因。

标签: windows-installer installshield


【解决方案1】:

如果您正在使用发布视图的“链式 MSI 包”区域,则您正在通过 MsiEmbeddedChainer table 使用嵌入式链。我还没有找到关于它的限制的明确文档,但它有几个。您看到的相关问题是它不会从另一个链接器中启动嵌入式链接器。这可能是因为如果外链器有后续包,它不知道收回事务的所有权,并且在内链器释放(或提交)事务之前无法这样做;根据MsiJoinTransactionphChangeOfOwnerEvent 的评论,这将导致回滚。

我们从经验中了解到,外部或引导链接器的奇怪行为较少,因此我会推荐它们而不是嵌入式链接器。如果您想通过 InstallShield 执行此操作,则需要 Premier 版的 Suite/Advanced UI 项目类型。 (如果除了一个包之外的所有包都可以被视为依赖项,并且您从 prq 文件中导入它们,它们将符合专业版中高级 UI 项目的限制。)

【讨论】:

  • 在不切换项目类型的情况下,有没有办法启动另一个可执行文件(setup.exe),类似于在安装结束时启动自述文件的方式?这会引入任何新的怪癖吗?
  • 自述方式仅从 ui 序列启动,因此不支持静默安装。这不太可能对依赖项有好处,并且在运行时可能会导致额外的提升 uac 提示。总而言之,体验更差。
  • 如果我创建了一个类似于 ShowReadme 的自定义操作,该操作在系统上下文中延迟运行并执行其他 setup.exe,该怎么办?仅当 REMOVE"ALL". 时,它才会包含在 Exec 序列的末尾附近
  • 那是要求一个竞争条件。如果当前执行序列在新的执行序列开始之前没有结束,则新的执行序列将无法获取互斥体。
  • 我当前的解决方案是将最嵌套的安装程序复制为顶级安装程序中的链接 MSI,顺便说一句。这不是一个很好的解决方案,但它很有效,而且还不错,因为它相对较小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
相关资源
最近更新 更多