簡體   English   中英

Wix MSI包:用於Windows服務

[英]Wix MSI package : for Windows service

錯誤:使用WiX工具集為Windows服務創建新的安裝程序。 無法安裝該服務。 得到一個錯誤
錯誤截圖

環境

  • 微軟視覺工作室2017
  • Windows 7的
  • WiX工具集v3:MSI的安裝項目

問題/目標

我想創建一個安裝Windows服務的MSI。

安裝時:

Windows服務已在services.msc中安裝並可見

在UnInstall上:

停止並刪除該服務。

我的Windows服務有很多依賴項,在運行服務時使用。

我已將所有文件添加為組件,並為每個組件ID添加了ServiceDependency ,但仍無法解決錯誤。 事件查看器中的錯誤也與上面的屏幕截圖相同。

任何指針都是最受歡迎的。

我的守則

    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

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

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

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

<Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">

  <Component Id="PlcmLayoutSwitcherWinSvc.exe" Guid="PUT_GUID_HERE" KeyPath="yes">
            <File Id="LayoutSwitcherWinSvc.exe" 
 Name="LayoutSwitcherWinSvc.exe" Source="$(var.LayoutSwitcherWinSvc_TargetDir)LayoutSwitcherWinSvc.exe" />

    <CreateFolder />
    <ServiceInstall Id="LayoutSwitcher" Type="ownProcess" Vital="yes" 
                    Name="LayoutSwitcher" DisplayName="LayoutSwitcher" 
                    Description="LayoutSwitcher" Start="auto" Account="NT AUTHORITY\LocalSystem" 
                    ErrorControl="ignore" Interactive="no">
   <ServiceControl Id="StartService" Start="install" Stop="both" 
    Remove="uninstall" Name="LayoutSwitcher" Wait="yes" />
  </Component>
    <Component Id="logoicon.ico" Guid="PUT_GUID_HERE">
        <File Id="logoicon.ico" Name="logoicon.ico" Source="$(var.LayoutSwitcherWinSvc_ProjectDir)logoicon.ico" />
     </Component>
     <Component Id="LayoutSwitcherWinSvc.exe.config" Guid="PUT_GUID_HERE">
     <File Id="LayoutSwitcherWinSvc.exe.config" Name="LayoutSwitcherWinSvc.exe.config" Source="$(var.LayoutSwitcherWinSvc_TargetDir)LayoutSwitcherWinSvc.exe.config" />
  </Component>
  <Component Id="Transactions.dll" Guid="PUT_GUID_HERE">
    <File Id="Transactions.dll" Name="Transactions.dll" Source="$(var.LayoutSwitcherWinSvc_TargetDir)Transactions.dll" />
  </Component>
  <Component Id="Transactions.Cfg.dll" Guid="PUT_GUID_HERE">
    <File Id=" Transactions.Cfg.dll" Name="Transactions.Cfg.dll" Source="$(var.LayoutSwitcherWinSvc_TargetDir) Transactions.Cfg.dll" />
  </Component>

編輯:1

刪除服務依賴項后更新了源代碼,但仍然收到相同的錯誤。

編輯:2

刪除了空格,但仍然得到相同的錯誤。

編輯:3

附加了詳細日志。 請從以下鏈接下載。
http://www.yourfilelink.com/get.php?fid=1432133

您的ServiceDepenency元素似乎列出了服務可執行文件所依賴的dll和其他文件。 這不是ServiceDependency元素的用意。 它應該列出必須在此服務之前啟動的其他服務。 您收到的錯誤可能是由於LayoutSwitcherWinSvc.exe.config和您列出的所有* .dll文件不是目標計算機上安裝的服務的名稱。

該修復可能會刪除這些ServiceDependency元素。 然后,僅當您的服務依賴於其他服務時,才按名稱為這些服務添加ServiceDependency元素。


解決了該部分后,您的ServiceInstallServiceControl元素仍然不正確。 特別是, Name屬性不匹配。 在您的示例代碼中,您看起來在許多元素中包含前導空格,我會刪除它。 但是,即使這只是復制和粘貼的勘誤,安裝的LayoutSwitcher也不同於啟動的布局切換器中間的一些空格。

這匹配您在評論中提到的錯誤0x80070424,如0x424 = 1060,以及net helpmsg 1060報告:

指定的服務不作為已安裝的服務存在。

確保ServiceInstall / @ NameServiceControl / @ Name屬性與手動啟動服務時使用的屬性相匹配。 (請注意,如果您的手動測試位於命令行中,則很可能會隱式刪除任何空格。)

嘗試在安裝和控件中使兩個Name屬性完全相同。 他們需要完全匹配,而不是。 您正在嘗試啟動不存在的服務。

你的信息:

“無法存儲錯誤0x80070424的ACL回滾信息;錯誤0x80070424:無法獲取對象的安全信息; CustomAction ExecSecureObjects返回實際錯誤代碼1603”

與服務無關。 理想情況下,您應該關閉此問題,因為服務問題已解決,您現在有一個單獨的問題,由該錯誤消息描述。

不知何故,您已設法調用與您的服務無關的WiX自定義操作“ExecSecureObjects”。 在WiX的某處,您正嘗試使用WiX util擴展中的PermissionEx來保護某些對象。 這是你現在看到的問題。

你能試試這段wix代碼嗎? 我清理了一下以刪除一些默認值。

除非您想使用不同的文件名放置文件,否則您不需要Name屬性。

如果您希望您的服務作為本地系統運行,則需要設置空帳戶。 如果您希望它以特定用戶身份運行,那么您可以在命令行上設置屬性SVCACCOUNT = someuser SVCPASSWORD =“password”,否則只需跳過它們。

如果Name和Id相同,則可以跳過Id。

我更喜歡將變量用於我在多個地方使用的東西,以避免拼寫錯誤,例如ServiceInstall中使用的ServiceName和我使用的ServiceControl:

<WixVariable Id="ServiceName" Value="LayoutSwitcher" />

<Component Id="PlcmLayoutSwitcherWinSvc.exe" Guid="PUT_GUID_HERE">
  <File Id="LayoutSwitcherWinSvc.exe" Source="$(var.LayoutSwitcherWinSvc_TargetDir)LayoutSwitcherWinSvc.exe" KeyPath="yes" />
  <ServiceInstall Name="!(wix.ServiceName)"
                  DisplayName="LayoutSwitcher"
                  Description="LayoutSwitcher"
                  ErrorControl="ignore"
                  Type="ownProcess" 
                  Vital="yes"
                  Start="auto"
                  Account="[SVCACCOUNT]"
                  Password="[SVCPASSWORD]" 
                  Interactive="no" />
  <ServiceControl Id="ServiceControl_!(wix.ServiceName)"
                  Name="!(wix.ServiceName)"
                  Start="install"
                  Stop="both"
                  Remove="uninstall"
                  Wait="yes" />
</Component>

您附加的日志不完整,一直運行安裝程序並僅在關閉安裝程序后附加日志。 不需要IMO調試日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM