In WiX how can I select an IIS website by name?

Dan picture Dan · Aug 28, 2009 · Viewed 11k times · Source

What I would like to do is show the installer user a list of the websites on their server and allow them to choose one (using the method described here: http://www.cmcrossroads.com/content/view/13160/120/, which now seems broken see here for the core code). The installer would then create a virtual directory in the chosen website.

However, my searching seems to have revealed that the only way to specify a website in WiX is by IP, Port, and Header. Asking for these is not very user friendly, so I'm left with the idea of writing a second custom action to get those details from a website name.

Is there a better way?

BTW This needs to work in both IIS6 and IIS7 in case that affects the answer.

Answer

Dan picture Dan · Sep 2, 2009

OK it is possible (in IIS6 or IIS7 with Metabase compatibility), thanks to this post to the mailing list explaining the slightly bizarre way the iis:Website element works. The useful part is:

Using a fragment like this and test with v3.0.5120.0:*

  <iis:WebSite Id="WebSite" Description="Default Web Site" SiteId="*">
    <iis:WebAddress Id="TestWebSite" Port="1" />
  </iis:WebSite>

The following work:

1. If WebSite/@SiteId="*" then a case sensitive match on WebSite/@Description happens.
2. If WebSite/@SiteId matches the site id than WebSite/@Description is ignored and a match on site id happens.
3. If WebSite/@SiteId has any value WebAddress/@Port is ignored (although the syntax requires it and it can't be 0).
4. If WebSite/@SiteId is missing WebAddress/@Port is used and WebSite/@Description is ignored.
5. Once a website is created and gets site id, you can rename it (therefore its site id is not the hash of its name), the WebSite/@SiteId="*" syntax will match on the WebSite/@Description.

So my WiX code ends up looking like:

<DirectoryRef Id="TARGETDIR">
  <Component Id="IisSetup" Guid="YOUR-GUID-HERE">
    <iis:WebVirtualDir Id="IisVirtualDir" Alias="[IIS_VIRTUALDIRNAME]" Directory="INSTALLLOCATION" WebSite="IisWebsite">
      <iis:WebApplication Id="IisWebApplication" Name="[IIS_VIRTUALDIRNAME]" WebAppPool="IisAppPool" Isolation="high"/>
    </iis:WebVirtualDir>
    <iis:WebAppPool Id="IisAppPool" Name="[IIS_APPPOOLNAME]" Identity="networkService"/>
  </Component>
</DirectoryRef>

<!-- Note that this entry should not be put under a component. If it is WiX
     will update the website on install and remove it on uninstall -->
<iis:WebSite Id="IisWebsite" Description="[IIS_WEBSITENAME]" SiteId="*">
  <iis:WebAddress Id="IisWebAddress" Port="80" />
</iis:WebSite>

The iis:WebAddress element should never be used but is necessary for the project to compile.