Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WIX enable Windows feature

I have to check if some windows features are enabled beore installing my software.

I can check it or install it using dism command line tool.

I create a custom action to do this, but is there a way to do it in a "WIX native way" ?

<Property Id="dism" Value="dism.exe" />
<CustomAction Id="InstallMSMQContainer" Property="dism" ExeCommand=" /online /enable-feature /featurename:MSMQ-Container /featurename:MSMQ-Server /featurename:MSMQ-ADIntegration" Return="check" Impersonate="yes"  Execute="oncePerProcess"/>

<InstallUISequence>
  <Custom Action="InstallMSMQContainer" After="CostFinalize" Overridable="yes">NOT Installed</Custom>
</InstallUISequence>

The problem is that command launch a command prompt, which is very ugly for end user. How can I make it nicer? I don't know if i need a bootstraper to do this (like installing the .NET Framework).

Is there any extention to manage that things ?

I'm now using WIX 3.7.

like image 481
Koektudis Avatar asked Jan 12 '23 16:01

Koektudis


1 Answers

David Gardiner's answer hinted at the correct solution in my case. Creating your own custom action is not necessary. Here is how to do it for a 64 bit installation of Windows:

First determine if MSMQ is installed:

<Property Id="MSMQINSTALLED">
  <RegistrySearch Id="MSMQVersion" Root="HKLM" Key="SOFTWARE\Microsoft\MSMQ\Parameters" Type="raw" Name="CurrentBuild" />
</Property>

Declare your custom actions. You need two. One to set a property to the path to dism, and another to execute it:

<CustomAction Id="InstallMsmq_Set" Property="InstallMsmq" Value="&quot;[System64Folder]dism.exe&quot; /online /enable-feature /featurename:msmq-server /all" Execute="immediate"/>
<CustomAction Id="InstallMsmq" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check"/>

Finally specify the custom actions in the install sequence:

<InstallExecuteSequence>
  <Custom Action="InstallMsmq_Set" After="CostFinalize"/>
  <Custom Action="InstallMsmq" After="InstallInitialize">NOT REMOVE AND NOT MSMQINSTALLED</Custom> 
</InstallExecuteSequence>

Because this can take a little bit of time I've added the following to update the installer status text:

<UI> 
  <ProgressText Action="InstallMsmq">Installing MSMQ</ProgressText> 
</UI> 

You can also specify a rollback action if you want to remove MSMQ on installation failure.

like image 52
Ananke Avatar answered Feb 09 '23 00:02

Ananke