【问题标题】:Change the value of a MSI property loaded from a DLL using a MSI transform使用 MSI 转换更改从 DLL 加载的 MSI 属性的值
【发布时间】:2019-02-19 07:49:55
【问题描述】:

我需要修改“IBM i Access for Windows”的 MSI 设置的安装行为。该设置是使用 InstallShield 创建的。在安装过程中,安装程序通过“链接”触发另外两个 MSI 安装。传递给 MSIEXEC.EXE 以执行这两个安装的参数由安装中包含的 DLL 中的自定义操作加载。参数最终位于 MSI 属性中。

我想更改该属性中的值以在启动链接安装之前操作命令行。这可能吗?如果是这样,怎么做?我创建一个读取和修改属性的外部 DLL 没有问题,但是我不知道如何将它与现有安装集成 - 我必须修改哪些表以及如何,我应该将 DLL 放在哪里, ...

编辑 1:澄清这一点:我想修改传递给链式 MSI 安装的参数。它们独立于我传递给主安装的参数,并从作为安装一部分的 DLL 加载。

EDIT 2:我已经上传了普通的MSI + 相关的log file。我使用“/qn”开始主安装以抑制所有消息。这没有问题,链式安装在没有可见提示的情况下执行。卸载软件时会出现问题(再次使用“/qn”)。远程自定义操作从 DLL 加载(第 6417 行):

MSI (s) (10:28) [09:00:45:643]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIA4BD.tmp, Entrypoint: ISChainPackages

从 DLL 加载的命令行指定使用参数“/qb”而不是“/qn”调用 MSIEXEC.EXE(第 6958 行):

MSI (s) (10!60) [09:00:46:033]: PROPERTY CHANGE: Adding IS_CHAINER_POST_COMMANDLINE property. Its value is '/l"c:\temp\IBM_iAccess_7.1_Uninstall.log" /qb /x{CCA40632-843E-48C6-B14F-E1070015D87C} ...

而且由于 MSI 安装程序锁定了一个文件,因此会弹出一个消息框,该消息框由链接的 MSI 的卸载触发(第 44046 行):

MSI (s) (10:C0) [09:01:05:553]: RESTART MANAGER: Did detect that the custom action server with process ID 2352 holds file[s] in use, so a reboot will be necessary.
MSI (s) (10:C0) [09:01:05:553]: Note: 1: 1610 
MSI (s) (10:C0) [09:01:11:224]: RESTART MANAGER: The user chose to go on with the installation, although a reboot will be required.
The setup must update files or services that cannot be updated while the system is running. If you choose to continue, a reboot will be required to complete the setup.

IBM website 上不再提供此软件 7.1 版的安装文件。只有当前的版本,我还没去查最新版本是否还有问题,因为业务部门要求我打包v7.1。

【问题讨论】:

  • 最初的印象是:确实非常复杂。在我多看这个之前,please check this itninja.com software entry 看看是不是同一个软件。我对这个特定的软件一无所知。请务必阅读底部评论。我肯定会检查是否有支持协议,并验证您是否可以使用最新的软件版本进行安装。这种笨重的东西可能已经修复了吗?谁知道呢。
  • 是语言属性的问题吗? (MRI2924 或类似的东西)或者你想通过其他设置?更多包数据库条目:itninja.com/question/…(参见 cmets 部分)和 itninja.com/question/…

标签: winapi windows-installer


【解决方案1】:

解决此问题的一种方法是创建一个新的自定义操作来执行存储在Binary 表中的 VBScript 代码,并将新的自定义操作放置在ISChainPackagePrepare 之后。 VBScript 代码将读取IS_CHAINER_POST_COMMANDLINE 的值并按照Replace() 函数中的指定替换它

VBScript 代码可能如下所示:

Option Explicit

Function ReplacePropVal()
    dim propvalue
    dim newvalue
    propvalue = Session.Property("IS_CHAINER_POST_COMMANDLINE")
    newvalue = Replace(propvalue,"/qb","/qn")
    Session.Property("IS_CHAINER_POST_COMMANDLINE") = newvalue
End Function

您希望为您的新自定义操作提供Type of 6,以表明您的自定义操作数据作为 VBScript 存储在Binary 表中。您的自定义操作Source 是对Binary 表中Name 的引用。您的自定义操作的 Target 值需要是 VBScript 函数的名称,在这种情况下为 ReplacePropVal

然后,您将新的自定义操作放入 InstallExecutionSequence 表中,并使用与 CustomAction 表中相同的名称。还要确保给它一个更高的Sequence 值作为ISChainPackagePrepare。我建议通过将ISChainPackagePrepareSequence 值增加1 来放置它。

更改表并生成新转换后,只需通过在 TRANSFORMS 公共属性中指定其路径来运行应用了新转换的包,您的属性值应该会更改。

【讨论】:

    【解决方案2】:

    我认为这里的理想方法是转换链式包定义。 UI 级别 (documentation) 存储在 ISChainPackage 表的 first two bits of the Options column 中,因此您的转换只需更改该值即可。特别是,您可以将这些位从 ecoUIBasic (0) 更改为 ecoUINone (1),这应该像在当前值上加 1 一样简单。 ecoUIReduced (2) 和 ecoUIFull (3) 也可用。

    如果 ISChainPackage.Options 更改正确,将为您生成所需的 IS_CHAINER_POST_COMMANDLINE,之后您无需添加辅助自定义操作将 /qb 更改为 /qn。 (感谢 sevi 提出的功能性解决方法。)

    【讨论】:

      【解决方案3】:

      如果这是Advanced or Suite UI Setup.exe,请检查 如何传递属性的链接。

      打包数据库条目(iAccess 和其他软件的软件重新打包提示):


      方法:这个 DLL 自定义操作有什么作用?它会创建许可证密钥吗?通常这些事情之前已经发现并解决了很多次。为了检查这一点,我通常使用这些方法来寻找解决方案:

      • 文件提取:尝试从设置中提取文件并查找描述正确部署的帮助文件。 “Large Scale Deployment.chm”、“Installation Command Line Parameters.chm”等...或现成的转换或命令行文件示例(Install.cmd)。
      • 部署站点:检查 https://www.itninja.com/company/browse/i(软件重新打包提示 - look at the IBM entries。几个条目看起来相关的,here is one)。
      • 论坛:检查他们的support forums or online support - 如果有的话。
      • 电话:与供应商通电话。有时很有帮助,但往往是浪费时间。请求支持发送的部署相关信息。如果您有支持协议,请执行此操作?

      请参阅下面的文件提取部分。

      Setup.exe 开关:我在这里有类似或相关的答案,其中我还提到了 setup.exe 命令行开关:Silent run installer (.exe) with parameters on Windows


      日志记录:如果自定义操作没有创建动态的东西(唯一许可证密钥、机器锁定身份等),那么您可以尝试查找由logging the setup 生成并查找日志文件中使用的命令行。样机样本:

      MSI (s) (AC:00) [00:00:00:00]: Command Line: TARGETDIR=C:\ SHORTCUTDIR=C:\Documents and Settings\All Users\Start Menu\Programs\Test ACTION=INSTALL 
      

      文件提取:这是一个Installshield Suite 项目吗?您是否先提取了嵌入文件和 MSI 文件?:Programmatically extract contents of InstallShield setup.exe

      Setup.exe 中有什么?:Installshield setup.exe 文件可以是很多不同的东西(解释不同的 setup.exe 风格):Regarding silent installation using Setup.exe generated using Installshield 2013 (.issuite) project file .


      链接

      【讨论】:

      • Stein Åsmul:这是关于我无法控制的链式 MSI 安装,无论我将什么传递给主安装。只是粘贴一些稍微修改过的样板文本作为几乎无法解决问题的答案有点蹩脚......
      • 难以置信...这不是样板文件,它实际上是我可以给你的最好的建议来帮助你自己 - 因为你没有提供任何调试的东西?
      • 我至少会检查一下部署站点。来自各地的应用程序打包者关于如何处理有问题的包的建议。
      • 从另一个 MSI 中的自定义操作运行的嵌入式 MSI 安装实际上是 deprecated feature (MSI API Documentation)。您能否指出安装媒体的下载源 URL? (需要实际看看发生了什么)。你能展示一下你现在在做什么吗?你使用变换吗?命令行? Some context(开始部分)。
      • Asmul:我添加了 MSI + 日志文件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      相关资源
      最近更新 更多