I\'ve a project using IIS, and I want to create an installer for it with Wix. I\'ve created the .msi installer for the app successfully, and I\'m creating a Bundle installer
Here is some WIX code for quick fix
run64.bat: I wonder why it requires both lines to trick the File System Redirector
set "SystemPath=%windir%\Sysnative"
CD "%windir%\Sysnative""
%*
InstallIIS.wxs: replace run.bat for platform specific batch
<?if $(var.Platform) = x86 ?>
<?define PlatformRunBatch = "run.bat" ?>
<?else?>
<?define PlatformRunBatch = "run64.bat" ?>
<?endif?>
<ExePackage Id="IIS_part0"
SourceFile="$(var.PlatformRunBatch)"
Based on Harbinder Singh's answer, here's my solution:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
<Bundle Name="Bootstrapper" Version="1.0.0.0" Manufacturer="VilmosNagy" UpgradeCode="844c755f-f02b-4dd3-8b9c-af2498f3128c">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<PackageGroupRef Id="InstallIIS"/>
</Chain>
</Bundle>
<Fragment>
<PackageGroup Id="InstallIIS">
<ExePackage
Id="IIS_part0"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-WebServerRole"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-WebServerRole"
>
</ExePackage>
<ExePackage
Id="IIS_part1"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-WebServer"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-WebServer"
>
</ExePackage>
<ExePackage
Id="IIS_part2"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-CommonHttpFeatures"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-CommonHttpFeatures"
>
</ExePackage>
<ExePackage
Id="IIS_part3"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-StaticContent"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-StaticContent"
>
</ExePackage>
<ExePackage
Id="IIS_part4"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-DefaultDocument"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-DefaultDocument"
>
</ExePackage>
<ExePackage
Id="IIS_part5"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-DirectoryBrowsing"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-DirectoryBrowsing"
>
</ExePackage>
<ExePackage
Id="IIS_part6"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-HttpErrors"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-HttpErrors"
>
</ExePackage>
<ExePackage
Id="IIS_part7"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-HttpRedirect"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-HttpRedirect"
>
</ExePackage>
<ExePackage
Id="IIS_part8"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-ApplicationDevelopment"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-ApplicationDevelopment"
>
</ExePackage>
<ExePackage
Id="IIS_part10"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-NetFxExtensibility"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-NetFxExtensibility"
>
</ExePackage>
<ExePackage
Id="IIS_part12"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-ISAPIExtensions"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-ISAPIExtensions"
>
</ExePackage>
<ExePackage
Id="IIS_part11"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-ASP"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-ASP"
>
</ExePackage>
<ExePackage
Id="IIS_part13"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-ISAPIFilter"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-ISAPIFilter"
>
</ExePackage>
<ExePackage
Id="IIS_part9"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-ASPNET"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-ASPNET"
>
</ExePackage>
<ExePackage
Id="IIS_part14"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-HealthAndDiagnostics"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-HealthAndDiagnostics"
>
</ExePackage>
<ExePackage
Id="IIS_part15"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-HttpLogging"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-HttpLogging"
>
</ExePackage>
<ExePackage
Id="IIS_part16"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-LoggingLibraries"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-LoggingLibraries"
>
</ExePackage>
<ExePackage
Id="IIS_part17"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-RequestMonitor"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-RequestMonitor"
>
</ExePackage>
<ExePackage
Id="IIS_part18"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-HttpTracing"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-HttpTracing"
>
</ExePackage>
<ExePackage
Id="IIS_part19"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-CustomLogging"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-CustomLogging"
>
</ExePackage>
<ExePackage
Id="IIS_part20"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-Security"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-Security"
>
</ExePackage>
<ExePackage
Id="IIS_part21"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-WindowsAuthentication"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-WindowsAuthentication"
>
</ExePackage>
<ExePackage
Id="IIS_part22"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-RequestFiltering"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-RequestFiltering"
>
</ExePackage>
<ExePackage
Id="IIS_part23"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-IPSecurity"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-IPSecurity"
>
</ExePackage>
<ExePackage
Id="IIS_part24"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-Performance"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-Performance"
>
</ExePackage>
<ExePackage
Id="IIS_part25"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-HttpCompressionStatic"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-HttpCompressionStatic"
>
</ExePackage>
<ExePackage
Id="IIS_part26"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-WebServerManagementTools"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-WebServerManagementTools"
>
</ExePackage>
<ExePackage
Id="IIS_part27"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-ManagementConsole"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-ManagementConsole"
>
</ExePackage>
<ExePackage
Id="IIS_part28"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-ManagementScriptingTools"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-ManagementScriptingTools"
>
</ExePackage>
<ExePackage
Id="IIS_part29"
SourceFile="run.bat"
DisplayName="Installing IIS: IIS-ManagementService"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:IIS-ManagementService"
>
</ExePackage>
<ExePackage
Id="IIS_part30"
SourceFile="run.bat"
DisplayName="Installing IIS: WAS-WindowsActivationService"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:WAS-WindowsActivationService"
>
</ExePackage>
<ExePackage
Id="IIS_part31"
SourceFile="run.bat"
DisplayName="Installing IIS: WAS-ProcessModel"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:WAS-ProcessModel"
>
</ExePackage>
<ExePackage
Id="IIS_part32"
SourceFile="run.bat"
DisplayName="Installing IIS: WAS-NetFxEnvironment"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:WAS-NetFxEnvironment"
>
</ExePackage>
<ExePackage
Id="IIS_part33"
SourceFile="run.bat"
DisplayName="Installing IIS: WAS-ConfigurationAPI"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:WAS-ConfigurationAPI"
>
</ExePackage>
<ExePackage
Id="IIS_part34"
SourceFile="run.bat"
DisplayName="Installing IIS: NetFx3"
InstallCommand="dism.exe /Online /Enable-Feature /FeatureName:NetFx3"
>
</ExePackage>
</PackageGroup>
</Fragment>
</Wix>
The run.bat
file is a simple text file, containing %*
.
This solution only works on Windows 7, or higher, 'cause the dism.exe
is not part of the Windows before version 7.
@Nagy Vilmos, your solution won't work on 64-bit OS. Burn is 32-bit program. It will launch the 32-bit "dism.exe", even if you want it to run the 64-bit dism by giving full path "C:\Windows\System32\dism.exe" on 64-bit OS. That is caused by "File System Redirector".
The dism's log will tell you it's 32-bit or 64-bit. Open file "C:\Windows\Logs\DISM\dism.log" you will find information like this:
Host machine information: OS Version=6.1.7600, Running architecture=x86
Or,
Host machine information: OS Version=6.1.7600, Running architecture=amd64
When you try to run the 32-bit dism on and 64-bit OS, you will get this error
Error: 11 You cannot service a running 64-bit operating system with a 32-bit version of DI SM. Please use the version of DISM that corresponds to your computer's architecture. The DISM log file can be found at C:\Windows\Logs\DISM\dism.log
My solution is creating another WiX installer project "InstallPrerequisites" and run the 64-bit dism with "QtExec64CmdLine" . Here is an example:
<!--1.You need to use the x64 version of quiet command line
2.[System64Folder] is also needed. If not, QtExec64CmdLine will find a 32-bit dism.exe to run.
-->
<Property Id="QtExec64CmdLine" Value='"[System64Folder]dism.exe" /Online /Apply-Unattend:[ProductTmpFolder]iis_unattend.xml'/>
<CustomAction Id="SilentLaunch" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="immediate" Return="check" />
I use answer file to include all the features, so we can enable them all at one time. And then chain the installer
<MsiPackage DisplayName="Install Prerequisites" SourceFile="$(var.InstallPrerequisites.TargetPath)" />
Update: By using "C:\windows\SysNative\dism.exe", I can now avoid a separate project for x64 platform. From the log, you can see the 32 bit process is now running 64-bit DISM.
2015-10-26 16:28:07, Info DISM DISM.EXE: <----- Starting Dism.exe session ----->
2015-10-26 16:28:07, Info DISM DISM.EXE:
2015-10-26 16:28:07, Info DISM DISM.EXE: Host machine information: OS Version=6.1.7601, Running architecture=amd64, Number of processors=4
2015-10-26 16:28:07, Info DISM DISM.EXE: Executing command line: C:\windows\SysNative\dism.exe
2015-10-26 16:28:07, Info DISM DISM Provider Store: PID=2000 Getting the collection of providers from a local provider store type. - CDISMProviderStore::GetProviderCollection
....
2015-10-26 16:28:09, Info DISM DISM.EXE: Image session has been closed. Reboot required=no.
2015-10-26 16:28:09, Info DISM DISM.EXE:
2015-10-26 16:28:09, Info DISM DISM.EXE: <----- Ending Dism.exe session ----->
IIS feature enabling works for me.
<!-- Put the following Code inside Product tag -->
<UI>
<UIRef Id="WixUI_HK" />
<ProgressText Action="InstallIIS">Enabling IIS Feature</ProgressText>
</UI>
<!-- Use DISM to setup IIS (see also http://support.microsoft.com/kb/2736284) -->
<!-- Build path to dism.exe (full path is important, just calling dism.exe without path will fail) -->
<CustomAction Id="InstallIISSetProperty" Property="InstallIIS" Execute="immediate"
Value=""[System64Folder]dism.exe" /Online /Enable-Feature /All /FeatureName:IIS-WebServerRole /FeatureName:IIS-WebServer /FeatureName:IIS-ManagementConsole " />
<!-- Call dism.exe quietly (without showing command prompt).
(see also http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html) -->
<CustomAction Id="InstallIIS" BinaryKey="WixCA" DllEntry="CAQuietExec64"
Execute="deferred" HideTarget="no" Return="ignore" Impersonate="no"/>
<InstallExecuteSequence>
<Custom Action="InstallIISSetProperty" After="CostFinalize">
<![CDATA[NOT Installed AND NOT IISMAJORVERSION]]>
</Custom>
<Custom Action="InstallIIS" Before="WriteRegistryValues">
<![CDATA[NOT Installed AND NOT IISMAJORVERSION]]>
</Custom>
</InstallExecuteSequence>
Reference Link
Try the following CustomAction Code:-
<Property Id="INSTALLIISPROP" Value="C:\Windows\System32\dism.exe" />
<CustomAction
Id="InstallIISCA"
Return="check"
Property="INSTALLIISPROP"
Execute="deferred"
HideTarget="yes"
Impersonate="yes"
ExeCommand="/Online /Enable-Feature /FeatureName:IIS-WebServerRole /FeatureName:IIS-WebServer /FeatureName:IIS-CommonHttpFeatures /FeatureName:IIS-StaticContent /FeatureName:IIS-DefaultDocument /FeatureName:IIS-DirectoryBrowsing /FeatureName:IIS-HttpErrors /FeatureName:IIS-HttpRedirect /FeatureName:IIS-ApplicationDevelopment /FeatureName:IIS-ASPNET /FeatureName:IIS-NetFxExtensibility /FeatureName:IIS-ASP /FeatureName:IIS-ISAPIExtensions /FeatureName:IIS-ISAPIFilter /FeatureName:IIS-HealthAndDiagnostics /FeatureName:IIS-HttpLogging /FeatureName:IIS-LoggingLibraries /FeatureName:IIS-RequestMonitor /FeatureName:IIS-HttpTracing /FeatureName:IIS-CustomLogging /FeatureName:IIS-Security /FeatureName:IIS-WindowsAuthentication /FeatureName:IIS-RequestFiltering /FeatureName:IIS-IPSecurity /FeatureName:IIS-Performance /FeatureName:IIS-HttpCompressionStatic /FeatureName:IIS-WebServerManagementTools /FeatureName:IIS-ManagementConsole /FeatureName:IIS-ManagementScriptingTools /FeatureName:IIS-ManagementService /FeatureName:WAS-WindowsActivationService /FeatureName:WAS-ProcessModel /FeatureName:WAS-NetFxEnvironment /FeatureName:WAS-ConfigurationAPI /FeatureName:NetFx3" />
<InstallExecuteSequence>
<Custom Action="InstallIISCA" Before="InstallFinalize">
<![CDATA[NOT Installed AND IISMAJORVERSION]]>
</Custom>
</InstallExecuteSequence>