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

时间:2019-02-19 07:49:55

标签: winapi windows-installer

我需要修改“ IBM i Access 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”来调用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,所以我没有调查问题是否仍然存在于最新版本中。

3 个答案:

答案 0 :(得分: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为单位。我建议将Sequence的{​​{1}}值加1后立即放置。

更改表并生成新转换后,只需在ISChainPackagePrepare公共属性中指定其路径,然后运行应用了新转换的包,然后更改属性值即可。

答案 1 :(得分:0)

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

如果正确更改了ISChainPackage.Options,将为您生成所需的<div class="wrapper"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <div>6</div> </div>,并且您无需添加辅助自定义操作即可将IS_CHAINER_POST_COMMANDLINE更改为/qb之后。 (对于建议该功能的变通办法,sevi表示感谢。)

答案 2 :(得分:-1)

  

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

     

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

     

方法 :此DLL自定义操作有什么作用?它会创建许可证密钥吗?通常,这些事情以前已经被发现并解决过很多次。为了对此进行检查,我通常使用以下方法来找到解决方案:

  • 文件提取 :尝试从安装程序中提取文件,并查找描述正确部署的帮助文件。 “ Large Scale Deployment.chm ”,“ Installation Command Line Parameters.chm ”等...或现成的转换或命令行文件示例( {{ 1}} )。
  • 部署站点 :检查 https://www.itninja.com/company/browse/i (软件重新打包提示- Install.cmd 。一些看起来相关的条目,here is one)。
  • 论坛 :检查其support forums or online support-如果可用。
  • 电话 :与供应商通电话。有时非常有帮助,经常浪费时间。要求支持人员发送与部署相关的信息。如果您有支持协议,是否这样做?
  

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

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


记录 :如果自定义操作未创建动态内容(唯一的许可证密钥,计算机锁定身份等),则可以尝试查找什么是由logging the setup生成的,并在日志文件中查找使用的命令行。模拟样例:

look at the IBM entries

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

Setup.exe中的什么? :Installshield setup.exe文件可以有很多不同的东西(解释不同的setup.exe口味):{{3 }}。


链接