wix
  • windows-installer
  • exe
  • 2016-04-21 28 views 0 likes 
    0

    我有一個Bundle安裝程序,它安裝了一個約4 msis的組合,如MSI_1 - > MSI_2 - > MSI_3 - > MSI_4。根據是否禁用Windows服務來安裝MSI

    我希望僅當特定的Windows服務未禁用時才安裝MSI_4,即,如果禁用了Windows服務(如ABC),請勿安裝。我大概可以使用CustomAction並運行命令

    "Get-WMIObject win32_service -filter "name='ABC'" -computer "." | select -expand state" 
    

    檢查狀態。但是,如何使用它(我可以使用它?)來確定是否執行安裝程序。請注意,所有4個MSI都有他們自己的項目,它們被合併在一個VS解決方案的保護下。我不必去CustomAction路線,所以如果你還有其他的想法,我也樂於嘗試。

    感謝您的時間和事先的幫助。如果有什麼不清楚,請告訴我。

    +0

    你能否給出downvote的理由? – randomuser15995183

    回答

    2

    因爲我找到了解決方案,在這裏會回答我自己的問題。我不知道的是服務列表在註冊表設置中也可用,並且可以在我們正在執行鏈接元素的wxs中使用Util:RegistrySearch元素。可以將服務的狀態從「正在運行」更改爲「已禁用」,以觀察值的更改並可以相應地設置InstallCondition。

    <util:RegistrySearch Root="HKLM" 
            Key="System\CurrentControlSet\Services\ABC" 
            Win64="yes" 
            Value="Start" 
            Variable="State" /> 
    

    和鏈條元素將是這樣的:

    <MsiPackage Id="package" 
           Cache="no" Vital="yes" 
           DisplayInternalUI="no" 
           ForcePerMachine="yes" 
           SourceFile="package.msi" 
           InstallCondition="(State = <condition>)" /> 
    

    希望這有助於。

    +0

    另一種方法是在您的BootstrapperApplication的「OnPlanPackageBegin」傳遞代表您的第四個msi的程序包ID時,以編程方式確定服務的狀態,然後您的引導程序應用程序可以將請求的狀態重寫爲Present或Absent。 –

    相關問題