wixwix-iisextension

Can I allow a user to choose either applicationPoolIdentity or specify a user using WiX-IIS extension?


My web application typically will be installed to use applicationPoolIdentity:

<iis:WebAppPool Id="MyAppPool" Identity="applicationPoolIdentity" Name="MyAppPool"/>

but I have a class of users that will want to use a specific domain user instead, which I would typically author like this:

<util:User Id="MyUser" Name="[MY_USER]" Domain="[MY_DOMAIN]" Password="[MY_PASSWORD]" CreateUser="no"/>
<iis:WebAppPool Id="MyAppPool" Identity="other" User="MyUser" Name="MyAppPool" />

Making the user interface for this is simple enough, but is there a way to conditionally switch between Identity="applicationPoolIdentity" and Identity="other" without writing a custom action?


Solution

  • Yes, it is possible but you will need to create a component group with two components that have conditionals. As this solution is a bit verbose, I recommend having it in a separate file.

    Here is an example, based on https://www.codeproject.com/Articles/115036/Creating-WIX-Installer-for-ASP-NET-Web-Application.

    <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
         xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension"
         xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
        <Fragment>
            <Property Id="IIS_WEBSITE" Value="root"/>
            <Property Id="VIRTUAL_DIR_VAL" Value="myappdir" />
    
            <!-- +++++++++++++++++++ web app name properties initialize ++++++++++++++++++++ -->
            <Property Id="WEB_APP_NAME" Value="myapp" />
            <Property Id="WEB_APP_USE_CUSTOM_APP_POOL_IDENTITY" Value="1" />
    
            <!-- +++++++++++++++++++ app pool identity properties initialize +++++++++++++++ -->
            <Property Id="WEB_APP_POOL_IDENTITY_DOMAIN" Value="domain" />
            <Property Id="WEB_APP_POOL_IDENTITY_NAME" Value="user" />
            <Property Id="WEB_APP_POOL_IDENTITY_PWD" Hidden="yes" />
    
            <!-- Reference to IIS Website to install to, but not create -->
            <iis:WebSite Id='rootwebsite'
                     Description='[IIS_WEBSITE]'
                     Directory='INSTALLFOLDER'>
              <!-- This element has to be here or WiX does not compile. It’s ignored 
                   in this case. -->
              <iis:WebAddress Id="AllUnassignedHTTP" Port="80" />
              <iis:WebAddress Id="AllUnassignedHTTPS" Port="443" />
            </iis:WebSite>
    
            <DirectoryRef Id="INSTALLFOLDER">
    
              <Component Id="InstallWebsiteCustomUser" Guid="[guid]" KeyPath="yes" Win64="yes">
                <Condition><![CDATA[WEB_APP_USE_CUSTOM_APP_POOL_IDENTITY = 1]]></Condition>
                <util:User Id="WebAppPoolUser"
                           CreateUser="no"
                           Name="[WEB_APP_POOL_IDENTITY_NAME]"
                           Password="[WEB_APP_POOL_IDENTITY_PWD]"
                           Domain="[WEB_APP_POOL_IDENTITY_DOMAIN]" />
                <iis:WebAppPool Id="WebAppPoolCustom"
                                Name="[WEB_APP_NAME]"
                                Identity="other"
                                User="WebAppPoolUser"
                                ManagedPipelineMode="Integrated"
                                ManagedRuntimeVersion="v4.0"
                                RecycleMinutes="200" />
                <iis:WebVirtualDir Id="WebVirtualDirCustom"
                                   Alias="[VIRTUAL_DIR_VAL]"
                                   Directory="INSTALLFOLDER"
                                   WebSite="rootwebsite">
                  <!-- Turn the Virtual Directory into a web application. -->
                  <iis:WebApplication Id="WebApplicationCustom"
                                      Name="[WEB_APP_NAME]"
                                      WebAppPool="WebAppPoolCustom" />
                </iis:WebVirtualDir>
              </Component>
    
              <Component Id="InstallWebsite" Guid="[guid]" KeyPath="yes" Win64="yes">
                <Condition><![CDATA[WEB_APP_USE_CUSTOM_APP_POOL_IDENTITY <> 1]]></Condition>
                <iis:WebAppPool Id="WebAppPool"
                                Name="[WEB_APP_NAME]"
                                Identity="applicationPoolIdentity"
                                ManagedPipelineMode="Integrated"
                                ManagedRuntimeVersion="v4.0"
                                RecycleMinutes="200"/>
                <iis:WebVirtualDir Id="WebVirtualDir"
                                   Alias="[VIRTUAL_DIR_VAL]"
                                   Directory="INSTALLFOLDER"
                                   WebSite="rootwebsite">
                  <!-- Turn the Virtual Directory into a web application. -->
                  <iis:WebApplication Id="WebApplication"
                                      Name="[WEB_APP_NAME]"
                                      WebAppPool="WebAppPool" />
                </iis:WebVirtualDir>
              </Component>
            </DirectoryRef>
    
            <ComponentGroup Id="IisConfiguration">
              <ComponentRef Id="InstallWebsiteCustomUser" />
              <ComponentRef Id="InstallWebsite" />
            </ComponentGroup>
        </Fragment>
    </Wix>