Wix MSI软件包:用于Windows服务

错误:使用WiX工具集为Windows服务创build新的安装程序。 无法安装该服务。 获得一个错误
错误截图

环境

  • 微软视觉工作室2017年
  • Windows 7的
  • WiX工具集v3:MSI安装项目

问题/目标

我想创build一个安装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

你可以试试这个wix代码? 我清理了一下,删除了一些默认值。

除非你想用不同的文件名放置文件,否则不需要Name属性。

如果你希望你的服务以本地系统运行,那么你需要设置空账户。 如果你希望它作为一个特定的用户运行,那么你可以在你的命令行上设置属性SVCACCOUNT = someuser SVCPASSWORD =“password”,否则就跳过它们。

如果名称和ID是相同的,那么你可以跳过ID。

我更喜欢在多个地方使用变量来避免输入错误,例如ServiceInstall和ServiceControl中使用的ServiceName:

<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调试日志不是必需的。

尝试在安装和控件中使两个Name属性完全相同。 他们需要完全匹配,而不是。 你正试图开始一个不存在的服务。

你的信息:

“无法存储错误0x80070424的ACL回滚信息;错误0x80070424:无法获取对象的安全信息; CustomAction ExecSecureObjects返回实际的错误代码1603”

与服务无关。 理想情况下,您应该关闭此问题,因为服务问题已得到解决,您现在有一个单独的问题,由该错误消息描述。

不知何故,你设法调用一个与您的服务无关的WiX自定义操作“ExecSecureObjects”。 在您的WiX的某处,您正尝试使用WiX util扩展的PermissionEx保护一些对象。 这是你现在看到的问题。

您的ServiceDepenency元素似乎列出了您的服务的可执行文件所依赖的dll和其他文件。 这不是ServiceDependency元素的意图。 它应该列出在此服务之前必须启动的其他服务。 您收到的错误很可能是由于LayoutSwitcherWinSvc.exe.config和其他列出的所有* .dll文件不是目标机器上安装的服务的名称。

修复很可能会删除这些ServiceDependency元素。 然后,只有当您的服务依赖于其他服务,请按名称为这些服务添加ServiceDependency元素。


解决了这个部分,看起来你的ServiceInstall和ServiceControl元素仍然是不正确的。 特别是, 名称属性不匹配。 在你的示例代码中,看起来你在很多元素中包含了主要的空白,我会删除它。 但是,即使这只是从复制和粘贴的勘误,安装的布局切换器不同于开始的布局切换器中间的一些空白。

这与您在注释中提到的错误0x80070424相匹配,如0x424 = 1060和net helpmsg 1060报告:

指定的服务不作为已安装的服务存在。

确保ServiceInstall / @ NameServiceControl / @ Name属性与您在手动启动服务时使用的内容相匹配。 (请注意,如果您的手动测试是在命令行上进行的,则极有可能删除任何空格。)