WIX-Installer ServiceControl"足够的权限"错误

时间:2015-06-02 16:45:57

标签: c# windows-services wix installer visual-studio-2015

Visual Studio 2015 RC Wix v3.10.0.1726

我正在为Windows服务创建一个安装程序。我已经使用InstallUtil对服务进行了测试,运行正常。不幸的是,我在使用wix时遇到了一些麻烦,这是确切的错误 -

"服务'服务名称'未能启动。验证您是否具有足够的权限来启动系统服务。"

现在我已经缩小了通过WIX启动​​服务的问题。如果我放弃ServiceControl标记并使用services.msc手动启动它,它可以正常工作。

从其他问题看来,这个错误是一般的捕获错误,并且发生在各种情况下。最受欢迎的是,如果您的服务依赖于安装到GAC(全局程序集缓存)的程序集,我也不清楚。我从不隐瞒地向GAC保存任何内容,我的服务只是调用我写的项目中包含的.cs文件。

非常感谢任何帮助!

<Component Id="ProductComponent7">
    <File Source="$(var.ServiceName.TargetPath)" KeyPath="yes" Vital="yes"/>
    <ServiceInstall Id="ServiceName.exe"
                      Account="LocalSystem"
                      Arguments="-start"
                      Type="ownProcess" 
                      Name="ServiceName.exe" 
                      DisplayName="ServiceName Service" 
                      Description="sdfg" 
                      Start="auto" 
                      Interactive="yes"
                      ErrorControl="critical" />
  <ServiceControl Id="ServiceControl" Name="ServiceName" Start="install"  />
        </Component>

我还在ServiceControl中尝试了各种不同的属性,我最近将它们全部删除,以尽量简化它。

如果有人有任何见解,那就太棒了!

3 个答案:

答案 0 :(得分:4)

问题似乎是您已经安装了名为ServiceName.exe的服务,并且您正在尝试启动一个名为ServiceName的服务。 Name值需要匹配。

答案 1 :(得分:0)

正确,这是一般错误。您必须对您的服务进行分析,以了解它无法启动的原因。

GAC只是一种情况。在这种情况下,这是因为MSI直到StartServices之后才向GAC发布程序集。一种典型的竞争条件,导致缺少依赖性和错误。

如果消息框仍然显示,请从控制台运行EXE。你有错误吗?您的应用程序日志中是否有任何错误?找出服务无法解决的原因,解决它并重试。

答案 2 :(得分:0)

对我来说,该错误是由于Name标记中的ServiceInstall属性具有与ServiceBase child class InitializeComponent()方法中指定的名称不同的名称值。

代码更新:

在Product.wxs中:

<ServiceInstall Id="ServiceInstaller"
          Type="ownProcess"
          Name="MyWindowsService"
          DisplayName="$(var.ServiceDisplayName)"
          Description="$(var.ServiceDiscription)"
          Start="auto"
          Account="LocalSystem"
          ErrorControl="normal" />

在ServiceBase子类中:

private void InitializeComponent()
{
    components = new System.ComponentModel.Container();
    this.ServiceName = "MyWindowsService";
}