2017-08-15 39 views
0

我有以下的基本威克斯产品:威克斯:写注册表每个MSI运行时

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" Name="TestWriteRegistry" Language="1033" Version="1.0.0.0" 
      Manufacturer="Granta Test" UpgradeCode="PUT-GUID-HERE"> 
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> 

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
    <MediaTemplate /> 

    <Feature Id="ProductFeature" Title="TestWriteRegistry" Level="1"> 
     <ComponentGroupRef Id="ProductComponents" /> 
    </Feature> 
    </Product> 

    <Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="INSTALLFOLDER" Name="TestWriteRegistry" /> 
     </Directory> 
    </Directory> 
    </Fragment> 

    <Fragment> 
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
      <Component Id="ProductComponent"> 
       <File Source ="TestFile.txt" /> 
      </Component> 
     <Component Id="CESLicenseRegistry" Guid="*" > 
      <RegistryKey Root="HKLM" Key="SOFTWARE\WOW6432Node\MySoftware\TestKeyRegistry"> 
       <RegistryValue Type="string" Name="ProductKey" Value="[PIDKEY]"/> 
      </RegistryKey> 
     </Component> 
    </ComponentGroup> 
    </Fragment> 
</Wix> 

我运行这个具有: MSIEXEC/I “TestWriteRegistry.msi” PIDKEY = “123”

我第一次运行它时,它正确地在注册表中添加了值。

我想得到,如果我用另一个键再次运行msi,这个更新到注册表中。目前使用不同的PIDKEY运行它不会写入注册表。我认为这是因为该组件的Guid相同,所以Windows Installer假定不需要进行任何更改。

任何人都可以帮助我实现我的预期行为吗?

+0

为什么您需要更改许可证密钥?通常,由于各种原因,许可在您的应用程序中处理得更好,[**请参阅此讨论**](https://stackoverflow.com/questions/24359248/installer-with-online-registration-for-windows-application/24360658#24360658)。 –

+0

@SteinÅsmul因为我希望安装程序在许可证更改时更新功能。感谢您的链接。 – Sergioet

回答

4

没有再次运行“相同”MSI这样的事情。系统上安装的MSI文件由其ProductCode(和PackageCode)定义,并且当您尝试再次安装时,Windows会发现它已经安装并进入维护模式,并且默认操作可能是修复。

所以你需要说一说重新运行MSI应该做的事情。目前尚不清楚您是否想要运行MSI(例如)20次并在系统上拥有20个产品副本,如果需要更改产品/包装代码并注意其中大部分会覆盖对方以奇怪的方式。如果你想要一个新产品密钥的产品升级版本,然后看看主要升级更多一点 - 你的majorupgrade元素是相当稀疏,你没有发布你的包或产品元素显示升级码等

+0

谢谢你的答案菲尔。我对维克斯相当陌生,所以如果问题没有提供所有必需的细节,请致歉。我对重播的意图是用新的注册表键更新产品,保持其他所有条件均等。正如你指出的那样,我将探索主要的升级途径。我应该为此定义一个自定义操作吗? – Sergioet

0

我认为你必须向我们提供你想要达到的更好的描述。这听起来不像你正在计划的那样非常“部署友好”。你想改变什么功能?你想要安装更多的文件,还是只使用新的密钥解锁更多的应用程序功能?或者两者兼得?您在安装修理/修改期间必须尝试输入新的密钥?要做到这一点,我会使用某种自定义操作来正确编写密钥(赋予您更多的控制权)。

请注意,编写包含组件注册表路径的许可证密钥似乎正在尝试,通常会导致人们在运行重大升级时或甚至在修补期间使用默认值覆盖或还原许可证数据。这是我推荐使用自定义操作进行灵活性和控制的少数案例之一 - 尽管如此,仍然需要谨慎使用。不管你做什么,都要确保测试你的设置升级场景,并且注意自定义操作的调节,以便它只在你想要的时候运行(例如不在卸载或修补时)。

我从来没有尝试过,但我认为你可以在任何时候让应用程序本身触发安装缺少的功能(默认设置为不安装)。你应该可以从任何能够进行Win32调用的“正常”语言中这样做。由于我从来没有尝试过,所以我处于不稳固的状态,但是您可以从MsiConfigureFeatureMsiConfigureProductEx开始(它看起来像后者允许传递命令行,因此您可以执行ADDLOCAL =要安装的FeatureName)。我在网上找不到任何示例代码。如果您使用C#,则可以使用DTF(WiX工具包的一部分)。它是Win32 Windows Installer API的.NET包装器。非常容易使用 - 不需要任何COM互操作或Win32操作,只需使用纯.NET类即可。


如果你问我的真实想法:

正如我作为一个评论,我想从你的设置中删除所有许可对话,并将它们添加到您的应用程序,而不是提供的链接表示。链接中解释的原因很多:Installer with Online Registration for Windows Application

保持你的牌出设置的主要缺点是,你将不能作为标准用户运行时(自动从应用程序中编写一键HKLM 除非更改写权限作为安装的一部分,以便常规用户可以在那里写入 - 然后他们都共享相同的密钥,这可能不是您想要的 - 并且任何用户也可以删除密钥,从而影响所有用户)。

我更喜欢保持许可每个用户为基础,并将许可证写入HKCU。然后,您可以允许用户随时在应用程序中随时更改许可证。尽管您安装的任何安装程序功能都适用于所有用户。