使用MSI转换更改从DLL加载的MSI属性的值

问题描述 投票:1回答:3

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

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

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

编辑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”(第6958行)调用MSIEXEC.EXE:

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。

winapi windows-installer
3个回答
2
投票

解决此问题的一种方法是创建一个新的自定义操作,执行存储在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是对Name表中的Binary的引用。自定义操作的Target值需要是VBScript函数的名称,在这种情况下是ReplacePropVal

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

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


0
投票

我认为这里理想的方法是转换链式包定义。 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建议使用功能性解决方法。)


-1
投票

如果这是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


链接:

© www.soinside.com 2019 - 2024. All rights reserved.