我需要修改用于"IBM for Windows“的MSI安装程序的安装行为。安装程序是使用InstallShield创建的。在安装过程中,安装程序通过“链接”触发另外两个MSI安装。传递给MSIEXEC.EXE以执行这两个安装的参数由安装中包含的DLL中的自定义操作加载。这些参数以MSI属性结束。
在启动链接安装之前,我希望更改该属性中的值,以操作命令行。这个是可能的吗?如果是这样的话,是怎么做的?创建读取和修改属性的外部DLL没有问题,但我不知道如何将其与现有安装集成--我必须修改哪些表以及如何将DLL放在哪里,
编辑1:为了澄清这一点:我想修改传递给链式安装的参数。它们独立于我传递给主安装的参数,并从安装的一部分DLL加载。
编辑2:我已经上传了普通的MSI +相关的日志文件。我以"/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”调用/qn(第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.
此软件的7.1版本的安装文件在IBM网站上不再可用。只有目前的版本是,而且我还没有调查最新版本是否仍然存在问题,因为业务部门要求我打包v7.1。
发布于 2019-02-27 16:26:26
解决此问题的一种方法是创建一个新的自定义操作,它执行存储在VBScript表中的Binary
代码,并将新的自定义操作放在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
您希望给新的自定义操作一个6种类型,以指示自定义操作数据作为VBScript存储在Binary
表中。自定义操作Source
是对Binary
表中的Name
的引用。自定义操作的Target
值需要是VBScript函数的名称,在本例中是ReplacePropVal
之后,使用与InstallExecutionSequence
表相同的名称将新的自定义操作放置在CustomAction
表中。还要确保给它一个更高的Sequence
值作为ISChainPackagePrepare
。我建议将Sequence
的ISChainPackagePrepare
值增加1,将其放在紧接其后的位置。
更改表并生成新转换之后,只需运行包,并通过在TRANSFORMS
公共属性中指定其路径来应用新的转换,您的属性值就应该被更改。
发布于 2019-03-02 03:46:14
我认为这里最理想的方法是转换链式包定义。UI级别(文档)存储在ISChainPackage表的选项列的前两位中,所以您所要做的就是更改该值。特别是,您可以将这些位从ecoUIBasic (0)更改为ecoUINone (1),这应该与将1添加到当前值一样简单。还有ecoUIReduced (2)和ecoUIFull (3)。
如果ISChainPackage.Options被正确修改,所需的IS_CHAINER_POST_COMMANDLINE
将为您生成,您将不必添加辅助自定义操作来将/qb
更改为/qn
。(赞扬塞维提出的功能解决方案。)
发布于 2019-02-19 15:28:47
如果这是一个高级或高级UI Setup.exe,请检查该链接如何传递属性。 包数据库条目( iAccess和其他软件的软件重新打包技巧):
look at the IBM entries
https://www.itninja.com/company/browse/i
接近:这个DLL自定义操作是做什么的?它会创建许可证密钥吗?很多时候,这些事情已经被发现并解决了很多次。为了检查这一点,我通常使用以下方法来找到解决方案:
Large Scale Deployment.chm
","Installation Command Line Parameters.chm
",等..。或现成的转换或命令行文件示例(Install.cmd
).。look at the IBM entries
. 部署站点:检查https://www.itninja.com/company/browse/i (软件重新打包技巧-)几个看起来相关的条目,这里有一个)。请参阅下面关于文件解压缩的部分。
Setup.exe Switches:我这里有一个类似的或相关的答案,其中我还提到了setup.exe命令行开关:带参数的静默运行安装程序(.exe)。
Logging:如果自定义操作没有创建动态的东西(惟一的许可证密钥、机器锁定标识等),那么您可以尝试查找记录安装程序生成的内容,并查找日志文件中使用的命令行。模拟样本:
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文件吗?:以编程方式提取InstallShield setup.exe的内容。
Setup.exe?:Installshield setup.exe文件可以是很多不同的东西(解释不同的setup.exe风格):关于使用使用Installshield 2013 ( Setup.exe )项目文件生成的Setup.exe进行静默安装。
链接
https://stackoverflow.com/questions/54761131
复制相似问题