Can Windows installer install two msi files at the same time? [duplicate] - wix

This question already has answers here:
Wix and .NET Framework (prerequisites)
(5 answers)
Closed last month.
I have a msi installation package made by WIX, which automatically installs IIS Express 10.0 after the installation.
<Binary Id="myCustomActionsDLL" SourceFile="$(var.CustomAction.TargetDir)CustomAction.CA.dll" />
<CustomAction Id="CheckIISExpressStatus" BinaryKey="myCustomActionsDLL" DllEntry="CheckIISExpressStatus" Execute="immediate" Return="check" Impersonate="yes"/>
<CustomAction Id="InstallIISExpress" BinaryKey="myCustomActionsDLL" DllEntry="InstallIISExpress" Execute="immediate" Return="ignore" Impersonate="yes" />
<InstallExecuteSequence>
<Custom Action="CheckIISExpressStatus" After="InstallFinalize" Overridable="yes">NOT Installed</Custom>
<Custom Action="InstallIISExpress" After="CheckIISExpressStatus" Overridable="yes">NOT Installed AND IS_INSTALL_IISEXPRESS="1"</Custom>
</InstallExecuteSequence>
In the InstallIISExpress action, I call bat to perform the installation.
msiexec /i iisexpress_amd64_en-US.msi /qb
But during execution, the Windows Installer prompts the error:
Other programs are being installed, please wait for the installation to complete, and then try again to install the software.
What parameters can I set to allow msi to install two msi at the same time?

You must not run other setups from a custom action within your main MSI. Instead you should run MSI files in sequence using a bootstrapper such as WiX's Burn feature.
It is late. I tried to write a proper explanation of this at one point, maybe see if it makes sense to you: Wix - How to run/install application without UI.
To summarize: running legacy setup.exe files from a custom action in your MSI will not be reliable, and running MSI files - whether directly or embedded in a setup.exe will positively not work because Windows Installer does not allow concurrent MSI installation sequences. A mutex is set when InstallExecuteSequence runs, and no other InstallExecuteSequence can be run while it is in effect. Concurrent MSI installations are forbidden and technically impossible.

Related

WiX Toolset - issues running cmd in Custom Action

I'm trying to add a custom action that will delete files from the installation folder using the following code:
<CustomAction Id="InstallService" Return="check" Impersonate="no" Execute="deferred" Directory="INSTALLFOLDER" ExeCommand='cmd.exe /C del /s /q "[INSTALLFOLDER]"'/>
<InstallExecuteSequence>
<Custom Action="InstallService" Before ="InstallFiles">NOT Installed AND NOT REMOVE</Custom>
</InstallExecuteSequence>
This works on some computers but fails on others showing a message
A program required for install to complete could not be run.
And in the installation logs I see
Error 1721. There is a problem with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package vendor
Any idea why this might happen or how to make it work?

how to integrate third party installation along with current installer in wix?

I am trying to install visual c++ 2013 along with my installer in wix.
for that i am using custom installation like
<Binary Id="vcredist_x862013.exe" SourceFile="D:\Projects\vcredist_x862013.exe"/>
<CustomAction Id="Launchvc2013" BinaryKey="vcredist_x862013.exe" ExeCommand="" Execute='deferred' Return='asyncNoWait' Impersonate='no'/>
<InstallExecuteSequence>
<Custom Action='Launchvc2013' Before='InstallFinalize'>NOT Installed AND NOT REMOVE</Custom>
</InstallExecuteSequence>
currently if the user installs or didnt install vc2013 as part of installation the setup will continue.
is it possible to make it like, the set up should fail if user cancel visual c++ installtion?
Yes it possible, you need to use bootstrapper for that.
Use this blog by Heath Stewart to get you started.

SCCM 2012 - Starting a program after MSI installation

I have an msi installer for my program that is made using WIX. One part of the installer runs my program after the installation is complete.
<CustomAction Id="Launch_MyProgram" FileKey="MyProgram" ExeCommand=""
Return="asyncNoWait" Impersonate="yes" Execute="immediate" />
<InstallExecuteSequence>
<Custom Action="Launch_MyProgram" After="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>
This works fine to start up the program when I run the installer on my own machine. However, we do our deployments using SCCM 2012 and when the installer runs through SCCM 2012 the program is not started after the install has completed. This is a problem for me because when I update the program during the day I would like it to start up again for the user when the new version is installed. Here are my SCCM deployment type settings:
Does anyone know how to do this through SCCM 2012?

Is there a way to run uninstallers from an installer in WiX?

I have a WiX based installer for a suite of applications. It replaces a bunch of old installers where each application in the suite had its own InstallShield based installer.
I would like the WiX installer to find any old InstallShield based installations and run their respective uninstallers. I have tried this:
<Property Id="OLD_APPLICATION_A_UNINSTALLSTRING">
<RegistrySearch Id="OldAppAUninstallString" Root="HKLM"
Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{$(var.OldAppAInstallerGUID)}"
Name="UninstallString" Type="raw"/>
</Property>
<InstallExecuteSequence>
<Custom Action="UninstallAppA" Before="InstallInitialize">
NOT Installed AND OLD_APPLICATION_A_UNINSTALLSTRING
</Custom>
</InstallExecuteSequence>
<CustomAction Id="UninstallAppA" Directory="System32"
ExeCommand="[OLD_APPLICATION_A_UNINSTALLSTRING] /qn" Execute="immediate" Return="check"/>
This results in a failed installation and error status 1618: "Another installation is already in progress. Complete that installation before proceeding with this install." Only one other installation is in progress, this installation...
Is there a way to run uninstallers from an installer in WiX?
I also have a bootstrapper and maybe I should run these uninstallations from there somehow. But I want to run them as late as possible in case the user cancels the installation. If that happens it doesn't look too good if the old application suite is gone...
In MSI there is a mutex that prevents two installation transactions (execute sequence) running at the same time hence your error.
You can use additional Upgrade elements to seek them out by UpgradeCode / Version / Lanugage and cause their removal during your installation transaction.

Burn - MsiPackage and Impersonation

I have an msi that allows the user to conditionally launch the installed application. The msi was created with Wix and includes the following xml statement:
<CustomAction Id='LaunchApplication' FileKey='foo.exe' ExeCommand='' Return="asyncNoWait" Impersonate="yes" />
The msi runs elevated, but the Impersonate option guarantees that the application is launched as the installing user.
The msi is included in my Burn package using the following statement:
<MsiPackage Id="FooMsi" SourceFile="$(var.Installer.TargetPath)" DisplayInternalUI="yes" Vital="yes" Permanent="no" />
However, Burn is elevated before the msi runs and therefore runs the application as Administrator.
Is there an impersonation option for Burn or do I have to launch the application from Burn instead?
Burn launches per-machine packages from an elevated helper process so MSI impersonates the elevated user. There's no way to tell MSI to impersonate another user and/or different permissions. You can use the LaunchTarget attribute of the WixStandardBootstrapperApplication element to launch a process from the unelevated Burn process.