2017-08-15 68 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。然後,您可以允許用戶隨時在應用程序中隨時更改許可證。儘管您安裝的任何安裝程序功能都適用於所有用戶。