繁体   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