I use property PORTS to pass some http ports to my installation.
Then these ports will be stored into init file and used by the application.
I need to add these ports to FirewallException?
But following code does not work:
<Component Id="fwException" Guid="MyGUID">
<Condition>Privileged</Condition>
<RegistryKey Root="HKCU" Key="Software\Company\[ProductName]">
<RegistryValue Name="fwException" Value="1" KeyPath="yes" Type="integer" />
</RegistryKey>
<fire:FirewallException Id="My_Ports" Name="My Node.exe" Profile="domain" Port="[PORTS]" Protocol="tcp" Scope="localSubnet"/>
</Component>
How to add several ports to FirewallException?
Summary
In WIX 3.9 (and earlier), the FirewallExtension only supports a single integer for the Port attribute. The Port attribute supports Formatted values, but the result of the formatting must still be a single integer. In your case [PORTS] must evaluate to a single integer.
If the Port attribute is set to 'Not a number', you would typically see this error in the installation log:
SchedFirewallException: Error 0x80070057: failed to parse record field: 3 as number: Not a number
From #Sean's comment, multiple ports should work in WIX 3.10. See http://wixtoolset.org/issues/4206/ for details of the feature request.
Workaround for WIX 3.9 and Earlier
It is possible to work around this restriction by using FirewallExtension delcarations:
<Component Id="fwException" Guid="-- YOUR GUID --">
<Condition>Privileged</Condition>
<RegistryKey Root="HKCU" Key="Software\Company\[ProductName]">
<RegistryValue Name="fwException" Value="1" KeyPath="yes" Type="integer" />
</RegistryKey>
<fire:FirewallException Id="My_Port1" Name="My Node.exe" Profile="domain" Port="[PORT1]" Protocol="tcp" Scope="localSubnet"/>
<fire:FirewallException Id="My_Port2" Name="My Node.exe" Profile="domain" Port="[PORT2]" Protocol="tcp" Scope="localSubnet"/>
</Component>
If you need a variable number of ports (up to a pre-defined maximum limit) you could try 1 firewall extension per component with a condition on each component:
<Component Id="fwException1" Guid="-- YOUR GUID --">
<Condition>Privileged AND PORT1</Condition>
<RegistryKey Root="HKCU" Key="Software\Company\[ProductName]">
<RegistryValue Name="fwException1" Value="1" KeyPath="yes" Type="integer" />
</RegistryKey>
<fire:FirewallException Id="My_Port1" Name="My Node.exe" Profile="domain" Port="[PORT1]" Protocol="tcp" Scope="localSubnet"/>
</Component>
<Component Id="fwException2" Guid="-- YOUR GUID --">
<Condition>Privileged AND PORT2</Condition>
<RegistryKey Root="HKCU" Key="Software\Company\[ProductName]">
<RegistryValue Name="fwException2" Value="1" KeyPath="yes" Type="integer" />
</RegistryKey>
<fire:FirewallException Id="My_Port2" Name="My Node.exe" Profile="domain" Port="[PORT2]" Protocol="tcp" Scope="localSubnet"/>
</Component>
From the command line you would specify multiple ports as: PORT1=7071, PORT2=7072, and so on. How suitable this is depends on the maximum number of ports you need to specify.
Related
I was looking for solution for some time but without success. I must admitt that I am begginer with wix. I have got one project (WPF + caliburn, using Visual Studio 2015) beeing compiled separately for x86 and x64. I use x64 machine to create both MSIs. Unfortunately during installation the setup always writes to 64bit registers which causes problems for the application.
I have created following components, trying to fix it using Win64="no" entry, unfortunately with no success. Can somone please advice correct component configuration?
<DirectoryRef Id="TARGETDIR">
<?if $(var.Platform)="x64"?>
<Component Id="Registry_DefaultStoragePath" Guid="123-456-789" Win64="yes">
<RegistryKey Root="HKLM"
Key="Software\KeyName" Action="createAndRemoveOnUninstall">
<RegistryValue Type="string" Name="DefaultStorageLocation" Value="[DEFAULTSTORAGE]" KeyPath="yes"/>
</RegistryKey>
</Component>
<Component Id="Registry_InstallType" Guid="123-456-789" Win64="yes">
<RegistryKey Root="HKLM"
Key="Software\KeyName" Action="createAndRemoveOnUninstall" >
<RegistryValue Type="string" Name="InstallType" Value="[INSTALLTYPE]" KeyPath="yes"/>
</RegistryKey>
</Component>
<?endif?>
<?if $(var.Platform)="x86"?>
<Component Id="Registry_DefaultStoragePath" Guid="132-456-789" Win64="no">
<RegistryKey Root="HKLM"
Key="Software\KeyName" Action="createAndRemoveOnUninstall">
<RegistryValue Type="string" Name="DefaultStorageLocation" Value="[DEFAULTSTORAGE]" KeyPath="yes"/>
</RegistryKey>
</Component>
<Component Id="Registry_InstallType" Guid="123-456-789" Win64="no">
<RegistryKey Root="HKLM"
Key="Software\KeyName" Action="createAndRemoveOnUninstall" >
<RegistryValue Type="string" Name="InstallType" Value="[INSTALLTYPE]" KeyPath="yes"/>
</RegistryKey>
</Component>
<?endif?>
The main problem is that <?if $(var.Platform)="x64"?> is handled by the preprocessor, so it is evaluated at compile-time, not runtime.
In order to handle x86/x64 runtime you can do this:
<component ....>
<condition>NOT VersionNT64</condition>
<!-- 32 bit component -->
<!-- Add component content here -->
</component>
<component ....>
<condition>VersionNT64</condition>
<!-- 64 bit component -->
<!-- Add component content here -->
</component>
I wrote an Installer with Wix. Everything works but I can't delete Registry Keys on Uninstall; the log says
Disallowing uninstallation of component: {...} since another client
exists
. The code is
<ComponentGroup Id="RegistryGroup">
<Component Id="_FB6B829B_467B_4EB8_B90C_9FF64097AD38" Guid="3FBC3951-B566-4EB9-842C-9FB70A8ECDE6" Transitive="no" Directory="TARGETDIR">
<RegistryKey Root="HKCU" Key="Software" ForceCreateOnInstall="no" ForceDeleteOnUninstall="no" />
</Component>
<Component Id="_F47C127C_2EAC_4F0C_B742_03FFBCABE8AE" Guid="A5D5FF6A-1EEA-4941-9DC5-573FDCB595A5" Transitive="no" Directory="TARGETDIR">
<RegistryKey Root="HKCU" Key="Software\[Manufacturer]" ForceCreateOnInstall="no" ForceDeleteOnUninstall="yes" />
</Component>
<Component Id="_684BCAC8_3162_4C7C_93A3_908CA1485F5C" Guid="92BF7699-68B1-44EE-BDE8-AF7E7CEB0EB0" Transitive="no" Directory="TARGETDIR">
<RegistryKey Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" ForceCreateOnInstall="no" ForceDeleteOnUninstall="yes" />
</Component>
<Component Id="_FC3941D7_6617_4313_8257_5C3DE03A9838" Guid="7DCD2392-AC9A-4690-BC99-FEACAA774B08" Transitive="no" Directory="TARGETDIR">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Name="ProductName" Value="[ProductName]" />
</Component>
<Component Id="_B86DABB3_7467_428B_9ECF_A6F59DB594E4" Guid="7A61E342-9764-4AA4-86A9-87C7A9C1DB09" Transitive="no" Directory="TARGETDIR">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Name="ProductCode" Value="[ProductCode]" />
</Component>
<Component Id="_201EDD75_B6C7_4873_8AF9_06230F421B4F" Guid="52AE095B-FDEE-4923-B78A-F314BC26C6B6" Transitive="no" Directory="TARGETDIR">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Name="Company" Value="[Manufacturer]" />
</Component>
<Component Id="_B76910AF_8752_45C2_98BF_80724406E3F9" Guid="81B183E7-67CA-4EF6-848E-55F8299B0A5C" Transitive="no" Directory="TARGETDIR">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Name="ProductVersion" Value="[ProductVersion]" />
</Component>
<Component Id="_9BF1C162_A7A6_4B43_9D7C_6BD85C6C4F27" Guid="A571BA72-2216-49F0-AC28-E72C0866E9A3" Transitive="no" Directory="TARGETDIR">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Name="Location" Value="[TARGETDIR]" />
</Component>
<Component Id="_B140E686_B49A_4BE4_93B3_DEEB07E5218E" Guid="F8996C3A-48EA-40DD-818B-5DC095B5F46F" Transitive="no" Directory="TARGETDIR">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Name="Author" Value="[ARPCONTACT]" />
</Component>
<Component Id="_801F11AF_23B6_4C63_AEE7_05EB877E6543" Guid="0EC7189F-95BE-411E-BE48-A469032923F4" Transitive="no" Directory="TARGETDIR">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Name="Website" Value="[ARPHELPLINK]" />
</Component>
</ComponentGroup>
What's wrong?
You have two or more installs with components that share the same GUIDs. You probably have authored upgrades of your install incorrectly in some way so every time you tested your installation you were adding more references to the GUIDs tied to these registry keys. You may also have more than one installation on your machine of your product.
You should have a bunch of registry entries under HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\S-1-5-18\Components{GUID} Note that the GUID is going to be a different format due to endianness (I think) May help
I would suggest testing your installer in a clean environment preferably on a VM with a clean snapshot you can revert to in case you author a broken installer and are unable to install/uninstall/upgrade the installer and get your machine into a bad state.
I created shortcut in the Startup folder. Is it possible to add "Run as administrator" property for my shortcut by wix? here my code:
<Component Id="AutostartService" Guid="GUID">
<Condition>AUTOSTART="1"</Condition>
<RegistryKey Action="createAndRemoveOnUninstall" Root="HKCU"
Key="Software\$(var.Manufacturer)\$(var.ProductName)\$(var.ApplicationName)">
<RegistryValue Name="ShortcutAutostart"
Type="integer" Value="1"
KeyPath="yes">
</RegistryValue>
</RegistryKey>
<Shortcut Advertise="no" Directory="StartupFolder"
Name="Service"
Target="[INSTALLLOCATION]Service.exe"
Id="SHORTCUT_auto"
WorkingDirectory="INSTALLLOCATION" >
</Shortcut>
<RemoveFile Id="remove_autostart" Name="Service" On="uninstall"/>
</Component>
No, it's not supported, because it's "the wrong thing to do."
I am using the following code to install a web application. It creates the virtual directory just fine, but doesn't convert the virtual directory in application. I am running IIS 7
I have searched a lot but couldn't find anything different in order to make an application of virtual directory. Can someone point what's wrong with the following code?
<Component Id="WebAppVDirComponent"
Guid="C7A4B0E8-2389-4A2A-B285-96960BEE1C51"
KeyPath="yes">
<iis:WebVirtualDir Id="VDir"
Alias="[WEB_APP_NAME]"
Directory="INSTALLDIR"
WebSite="TheWebSite" >
<!-- Turn the Virtual Directory into a web application. -->
<iis:WebApplication Id="WebApplication"
Name="[WEB_APP_NAME])"
WebAppPool="TheAppPool"/>
</iis:WebVirtualDir>
<CreateFolder/>
</Component>
Try this out. This is working perfectly fine for me.
<Component Id="VDProductCenter" Guid="493E3487-AA4C-4476-8CC0-4B1C763AF6F7" Permanent="no">
<File Id="Dummy" KeyPath="yes" Name="Dummy.txt" Source="Files/dummy.txt"></File>
<iis:WebVirtualDir Id="PCVDir" Alias="[VDNAME]" Directory="dir_Application_0" WebSite="PCWebSelectedWebSite">
<iis:WebApplication Id="PCWebApp" Name="[VDNAME]" />
</iis:WebVirtualDir>
<RegistryKey Root="HKLM" Action="createAndRemoveOnUninstall" Key="SOFTWARE\CompanyName\[ProductCode]\VirtualDirectory">
<RegistryValue Name="VDName" Type="string" Value="[VDNAME]"/>
</RegistryKey>
</Component>
<Component Id="PersistWebSiteValues" Guid="C3DAE2E2-FB49-48ba-ACB0-B2B5B726AE65" Permanent="no">
<File Id="Dummy1" KeyPath="yes" Name="Dummy1.txt" Source="Files/dummy.txt"></File>
<RegistryKey Root="HKLM" Action="createAndRemoveOnUninstall" Key="SOFTWARE\CompanyName\[ProductCode]\WebSiteValues">
<RegistryValue Name="WebSiteDescription" Type="string" Value="[WEB_WEBSITE_DESCRIPTION]"/>
<RegistryValue Name="WebSitePort" Type="string" Value="[WEB_WEBSITE_PORT]"/>
<RegistryValue Name="WebSiteIP" Type="string" Value="[WEB_WEBSITE_IP]"/>
<RegistryValue Name="WebSiteHeader" Type="string" Value="[WEB_WEBSITE_HEADER]"/>
</RegistryKey>
</Component>
<iis:WebSite Id="PCWebSelectedWebSite" Description="[PCWEB_WEBSITE_DESCRIPTION]">
<iis:WebAddress Id="AllUnassigned1" Port="[WEB_WEBSITE_PORT]" IP="[WEB_WEBSITE_IP]" Header="[WEB_WEBSITE_HEADER]" />
</iis:WebSite>
It is a sort of bug (i think). I found out at WIX newsgroup
http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Problem-creating-web-application-sometimes-td6653518.html
I would like to add a shortcut on the desktop which points to a virtual drive mounted under "Computer". This drive doesn't have a letter associated with it. I've successfully added a link to an executable, but all tries with Explorer has failed. When I add this shortcut manually it gets the following shortcut (in properties): Computer\MyProduct
I've tried the following:
<Component Id="DesktopShortcut" Guid="8EF63340-10D5-4583-9E28-F2EFFA666761">
<CreateFolder />
<RegistryKey Root="HKCU" Key="Software\MyProduct\Install" Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<Shortcut Id="DesktopShortcut" Directory="DesktopFolder" Name="My Product" Icon="yoobitsIcon" Target="Computer\MyProduct" />
</Component>
Any ideas?
One possible solution is to add the shortcut in as a .lnk file and include as a regular file into the Desktop folder during install.
<Directory Id="DesktopFolder" Name="Desktop">
<Component Id="MyProductDesktopShortcut" Guid="A47E6BEB-C7D6-4725-A94F-C6C52A55F31C">
<RegistryKey Root="HKCU" Key="Software\MyProduct\DesktopShortcut" Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<File Id="MyProductDesktopShortcutFile" Name="MyProduct.lnk" Source="MyProduct.lnk" DiskId="1" />
</Component>
</Directory>
Drawback:
The icon registered in the .lnk file will not be correct if the application gets installed in a different directory than what is expected. In this scenario this will result in a default folder icon and the adjust to the correct icon once you navigate to that virtual drive.