1

I need to modify the installation behavior of a MSI setup for "IBM i Access for Windows". The setup was created using InstallShield. During the installation the setup triggers two other MSI installations through "chaining". The parameters passed to MSIEXEC.EXE to execute those two installations get loaded by a custom action from a DLL that is included with the installation. The parameters end up in a MSI property.

I want to change the value in that property to manipulate the command line before the chained installation gets launched. Is this possible? If so, how? I have no problem to create an external DLL that reads and modifies the property, but I am at a loss on how to integrate this with the existing installation -- which tables do I have to modify and how, where should I put the DLL, ...

EDIT 1: To clarify this: I want to modify the parameters passed to the chained MSI installations. They are independent from the parameters I pass to the main installation and are loaded from a DLL that is part of the installation.

EDIT 2: I have uploaded the plain MSI + the relevant log file. I start the main installation with "/qn" to suppress all messages. That works without problems, the chained installations get executed without visible prompts. The problem arises when uninstalling the software (again with "/qn"). The remote custom action gets loaded from a DLL (line 6417):

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

The command line loaded from the DLL specifies to call MSIEXEC.EXE with the parameter "/qb" instead of "/qn" (line 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} ...

And because the MSI installer has a lock on a file a messagebox pops up triggered by the uninstallation of the chained MSI (line 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.

The installation files for version 7.1 of this software are no longer available on the IBM website. Only the current version is, and I have not looked into whether the problem still exists with the latest version or not as I have been asked to package v7.1 by the business department.

Olaf Hess
  • 1,453
  • 11
  • 18
  • Initial impression is: high complexity indeed. Before I look at this more, [please check this itninja.com software entry](https://www.itninja.com/blog/view/ibm-iaccess-for-windows-7-1) to see if it is the same software. I know nothing about this particular software. And please do read the bottom comment. I would definitely check if there is a support agreement and verify if you can use the latest software version to install. Something this clunky might have been fixed? Who knows. – Stein Åsmul Feb 22 '19 at 15:51
  • Is the issue with the language property? (MRI2924 or something to that effect) Or are you trying to pass in other settings? A few more package database entries: https://www.itninja.com/question/how-to-perform-silent-upgrade-for-ibm-i-access-for-windows-7-1-using-kbox-for-multiple-pc (see comments section) and https://www.itninja.com/question/making-a-silent-package-for-ibm-i-access-for-windows-7-1-with-latest-patch. – Stein Åsmul Feb 22 '19 at 16:04

3 Answers3

2

One approach to this problem would be to create a new Custom Action that executes VBScript code stored in the Binary Table and place the new Custom Action right after ISChainPackagePrepare. The VBScript code will read the value of IS_CHAINER_POST_COMMANDLINE and replace it as specified in the Replace() function

The VBScript Code could look like this:

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

You want to give your new Custom Action a Type of 6 to indicate that your Custom Action data is stored as a VBScript in the Binary table. Your Custom Action Source is a reference to the Name in the Binary Table. The Target value of your Custom Action will need to be the name of the VBScript Function which is ReplacePropVal in this case

Afterwards, you place your new Custom Action in the InstallExecutionSequence table using the same name for it as in the CustomAction table. Also make sure to give it a higher Sequence value as ISChainPackagePrepare. I would recommend placing it right after by incrementing the Sequence value of ISChainPackagePrepare by 1.

After you've changed the tables and generated a new transform, just run the package with the new transform being applied by specifying its path in the TRANSFORMS public property and your property value should be changed.

sevi
  • 460
  • 5
  • 20
0

I think the ideal approach here would be to transform the chained package definition. The UI level (documentation) is stored in the first two bits of the Options column of the ISChainPackage table, so all your transform should have to do is alter that value. In particular, you can change those bits from ecoUIBasic (0) to ecoUINone (1), which should be as simple as adding 1 to the current value. Also available are ecoUIReduced (2) and ecoUIFull (3).

If ISChainPackage.Options is altered correctly, the desired IS_CHAINER_POST_COMMANDLINE will be generated for you, and you won't have to add a secondary custom action to alter the /qb to /qn afterward. (Kudos to sevi for suggesting that functional workaround.)

Michael Urman
  • 15,737
  • 2
  • 28
  • 44
-1

If this is an Advanced or Suite UI Setup.exe, please check that link for how to pass a property.

Package Database Entries (Software Re-Packaging tips for iAccess and other software):


Approaches: What does this DLL custom action do? Does it create a license key? Often these things have been found and solved many times before. To check for this, I usually use these approaches to find solutions:

  • File Extraction: try extracting files from the setup and look for help files that describe proper deployment. "Large Scale Deployment.chm", "Installation Command Line Parameters.chm", etc... or ready-made transforms or command line file samples (Install.cmd).
  • Deployment Sites: Check https://www.itninja.com/company/browse/i (Software Re-Packaging tips - look at the IBM entries. Several entries that look relevant, here is one).
  • Forums: inspect their support forums or online support - if available.
  • Phone: get on the phone with the vendor. Sometimes very helpful, often a waste of time. Ask for deployment relevant information sent from support. Do this if you have a support agreement?

See section on file extraction below.

Setup.exe Switches: I have a similar or related answer here, where I also mention setup.exe command line switches: Silent run installer (.exe) with parameters on Windows.


Logging: If the custom action does not create something dynamic (unique license key, machine locking identity, etc...), then you can try to find what was generated by logging the setup and looking for the command line used in the log file. Mock-up sample:

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 

File Extraction: Is this an Installshield Suite project? did you extract the embedded files and MSI files first?: Programmatically extract contents of InstallShield setup.exe.

What is in a Setup.exe?: Installshield setup.exe files can be lots of different things (explanation of different setup.exe flavors): Regarding silent installation using Setup.exe generated using Installshield 2013 (.issuite) project file.


Links:

Stein Åsmul
  • 39,960
  • 25
  • 91
  • 164
  • Stein Åsmul: This is about the chained MSI installation that I do not have control over, no matter what I pass to the main installation. Just pasting some slightly modified boilerplate text as an answer that hardly addresses the question is a bit lame ... – Olaf Hess Feb 20 '19 at 05:48
  • Unbelievable... This is no boilerplate, it is in fact a constellation of the best advice I can give you to help yourself - seeing as you haven't provided anything to debug with? – Stein Åsmul Feb 20 '19 at 12:00
  • I would check out the deployment site at the very least. Advice from application packagers everywhere for how to deal with problematic packages. – Stein Åsmul Feb 20 '19 at 12:07
  • Embedded MSI installations run from custom actions in another MSI is actually a [deprecated feature](https://helpnet.flexerasoftware.com/installshield21helplib/helplibrary/IHelpNestedInstallations.htm) ([MSI API Documentation](https://learn.microsoft.com/en-us/windows/desktop/Msi/concurrent-installations)). Can you point to a download source URL for the installation media? (need to actually see what is going on). Can you show what you do at the moment? Do you use transforms? Command line? [Some context](https://stackoverflow.com/a/1055861/129130) (beginning section). – Stein Åsmul Feb 20 '19 at 15:23
  • Asmul: I have added the MSI + log files – Olaf Hess Feb 22 '19 at 07:45
  • For the record: MSI 4.5 and above has the ability to support [multiple-package installations](https://docs.microsoft.com/en-us/windows/desktop/msi/multiple-package-installations). If you are developing your own setup: not a feature I would use to be honest. I would prefer a `setup.exe` launcher running installations in sequence. Simple, more reliable, easier to debug, etc... Also much easier for large scale deployment seeing as corporate deployment systems have better features to control installation order, settings, prerequisites and dependencies than this multi-package installation approach. – Stein Åsmul Feb 23 '19 at 12:11
  • @SteinÅsmul: I think it was pretty clear from the beginning that Olaf wanted to change a property inside of the MSI at runtime which holds the parameters for the chained msiexec calls. I don't see how your answer gives him any information at all to accomplish this. – sevi Feb 27 '19 at 16:34