基于Wix安装程序的TopShelf Windows服务无法启动

时间:2019-11-27 18:28:51

标签: c# .net wix windows-services topshelf

我已经使用TopShelf和Quartz编写了一个基本的.NET 4.7.2 C#Windows服务。当我在Windows 10笔记本电脑上使用Visual Studio 2019调试该服务时,该服务将起作用。然后,我创建了一个基于Wix 3.11.2的安装程序来安装和启动此服务。现在,我正在尝试使用此安装程序在笔记本电脑上安装该服务。安装程序可以复制文件,但无法启动服务。这是代码:

Product.wxs

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="Broker Test" Language="1033" Version="1.0.0.0"
       Manufacturer="Test"
       UpgradeCode="{68813F65-1022-4E32-AC50-CD16B5927DAD}">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

<Media Id="1" Cabinet="BrokerTest.cab" EmbedCab="yes" />

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="INSTALLDIR" Name="Application">
    <Directory Id="WINDIR" Name="Service"/>
  </Directory>
</Directory>

<Feature Id="ProductFeature" Title="BrokerTest_MSI" Level="1">
  <ComponentGroupRef Id="BrokerWindowsService" />
</Feature>

<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
<Property Id="INSTALLTYPE" Value="1"/>
</Product>
</Wix>

WinService.wxs

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment>
<ComponentGroup Id="BrokerWindowsService">

  <ComponentRef Id="Tb.WinService.Test" />
  <ComponentRef Id="TopShelf"/>
  <ComponentRef Id="Tb.ServiceConfig" />
  <ComponentRef Id="Microsoft.Extensions.DependencyInjection" />
  <ComponentRef Id="Microsoft.Extensions.DependencyInjection.Abstractions" />      
  <ComponentRef Id="Quartz" />      

</ComponentGroup>

<DirectoryRef Id="WINDIR">
  <Directory Id="DataDir" Name="Data"/>

  <Component Id="Tb.WinService.Test" Guid="{F1DF09D9-98D8-4D63-9BB9-7581D56E1685}">

    <CreateFolder Directory="DataDir">
      <util:PermissionEx User="NT Authority\SYSTEM" GenericAll="yes"/>
    </CreateFolder>

    <File Id="Tb.WinService.Test.dll" Name="$(var.Tb.WinService.Test.TargetFileName)" Source="$(var.Tb.WinService.Test.TargetPath)" />
    <File Id="Tb.WinService.Test.pdb" Name="$(var.Tb.WinService.Test.TargetName).pdb" Source="$(var.Tb.WinService.Test.TargetDir)$(var.Tb.WinService.Test.TargetName).pdb" />

    <ServiceInstall Id="ServiceInstaller" Type="ownProcess" Vital="yes"
                            Name="BrokerWindowsServiceTest"
                            DisplayName="Broker Windows Service Test"
                            Description="Runs scheduled tasks"
                            Start="auto" Account="NT Authority\SYSTEM"
                            ErrorControl="ignore"
                            Interactive="no" />

    <ServiceControl Id="StartService"
                            Start="install" Stop="both" Remove="uninstall"
                            Name="BrokerWindowsServiceTest" Wait="yes" />

  </Component>

  <Component Id="TopShelf" Guid="{CEC3596B-4D38-4641-81EF-CBC09C4FE67E}">
    <File Id="TopShelf.dll" Name="TopShelf.dll" Source="$(var.SolutionDir)packages\Topshelf.4.2.1\lib\net452\Topshelf.dll" Vital="yes" />
    <File Id="TopShelf.xml" Name="TopShelf.xml" Source="$(var.SolutionDir)packages\Topshelf.4.2.1\lib\net452\Topshelf.xml" Vital="yes" />
  </Component>

  <Component Id="Tb.ServiceConfig" Guid="{A08D1440-4B2A-4DFB-9F55-27E81DC4B106}">
    <File Id="Tb.Service.App.Config" Name="$(var.Tb.WinService.Test.TargetName).exe.config" 
          Vital="yes" KeyPath="yes" Source="$(var.Tb.WinService.Test.TargetDir)App.config" />
  </Component>

  <Component Id="Microsoft.Extensions.DependencyInjection" Guid="{8F69CFC4-02F9-479C-9C57-E2F88180E542}">
    <File Id="Microsoft.Extensions.DependencyInjection.dll" Name="Microsoft.Extensions.DependencyInjection.dll" 
          Source="$(var.SolutionDir)packages\Microsoft.Extensions.DependencyInjection.3.0.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.dll" Vital="yes" />
  </Component>

  <Component Id="Microsoft.Extensions.DependencyInjection.Abstractions" Guid="{8EB47289-9527-4CE4-9991-EBF8997368DC}">
    <File Id="Microsoft.Extensions.DependencyInjection.Abstractions.dll" Name="Microsoft.Extensions.DependencyInjection.Abstractions.dll" 
          Source="$(var.SolutionDir)packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.0.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll" Vital="yes" />
  </Component>

  <Component Id="Quartz" Guid="{345DA6DA-F385-47A6-844C-3171ADE42E83}">
    <File Id="Quartz.dll" Name="Quartz.dll" Source="$(var.SolutionDir)packages\Quartz.3.0.7\lib\net452\Quartz.dll" Vital="yes" />
    <File Id="Quartz.xml" Name="Quartz.xml" Source="$(var.SolutionDir)packages\Quartz.3.0.7\lib\net452\Quartz.xml" Vital="yes" />
  </Component>      

</DirectoryRef>
</Fragment>
</Wix>

运行Wix安装程序时出现以下错误:

Privileges Error

如果我尝试手动启动该服务,则会出现以下错误:

Error Message

我已经尝试了以下方法:

  1. 我正在使用应该具有适当访问权限的NT Authority \ System帐户。
  2. 当前,我的Windows服务实际上没有做任何事情。它正在重播Task.CompletedTask。因此,不应有超时情况。
  3. 我尝试过调试和发布版本。
  4. 我正在开发的同一台计算机上安装。因此,.NET Framework版本不应该成为问题。
  5. 我尝试启动调试器,但无法连接。所以我没有更多的细节。
  6. 我捕获了异常并写入了事件日志,但这也没有更多详细信息。

2 个答案:

答案 0 :(得分:0)

  

安装程序方法 :我将检查二进制文件中的服务安装程序代码。您必须在其中执行某些操作   未复制的程序集/二进制文件的安装方法   由MSI在安装时进行。您在这些安装程序中正在做什么   方法?样本:12

     

WiX服务安装 :我将删除所有非属性   WiX元素中需要。参见以下示例:Service Installation   (Stropek)。尤其是 Account attribute ,请忽略它。还要取出SYSTEM的许可元素。默认权限会更好-它们已经存在。

Procmon.exe :如果运行,则可以检查系统以查看运行 InstallUtil.exe 时发生的情况Procmon.exe ,然后检查信息过载。您熟悉此工具吗?我宁愿不去研究它(再次-rudimentary example),我认为应该足以研究您的安装方法代码。

捕获 :当您运行 {{1}时,也可以使用设置捕获工具来扫描系统的前后状态。 } 。这需要一个强大的工具( InstallUtil.exe AdminStudio ),并且很少为开发人员所用。只是为了记录。


链接

其他

答案 1 :(得分:0)

确保ServiceInstall名称与您的topshelf服务名称完全匹配