无法使用WiX启动Windows服务

时间:2012-09-11 13:17:39

标签: windows service wix

我有以下WiX项目来安装我的服务:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="GUID" Name="SetupWinService" Language="1049"
           Version="1.0.0.0" Manufacturer="SetupWinService"
           UpgradeCode="GUID">
    <Package InstallerVersion="200" Compressed="yes"
             Languages="1049" SummaryCodepage="1251"
             InstallPrivileges="elevated"/>

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

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="WinService" Name="My Windows Service">
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="WinService">
      <Component Id="WinServiceInstallation" Guid="GUID">
        <File Id="ClientService.exe"
              Name="ClientService.exe"
              Source="...\ClientService.exe"
              Vital="yes" KeyPath="yes" DiskId="1"/>
        <File Id="App.config"
              Name="App.config"
              Source="...\App.config"
              Vital="yes" KeyPath="no" DiskId="1"/>

            <!--And some DLLs here-->

        <ServiceInstall Id="ServiceInstaller"
                        Type="ownProcess"
                        Vital="yes"
                        Name="WcfServiceHost"
                        DisplayName="WcfServiceHost"
                        Description="Hosts Wcf Service"
                        Start="auto"
                        Account="LocalSystem"
                        ErrorControl="ignore"
                        Interactive="no">
        </ServiceInstall>
        <ServiceControl Id="StartService" Name="WcfServiceHost"
                        Start="install" Stop="uninstall" Remove="uninstall"
                        Wait="yes" />
      </Component>
    </DirectoryRef>

    <Feature Id="Complete" Title="SetupWinService" Level="1">
      <ComponentRef Id="WinServiceInstallation" />
      <ComponentGroupRef Id="Product.Generated" />
    </Feature>
  </Product>
</Wix>

我可以安装我的服务,但安装后无法启动它。它告诉:

  

服务无法启动。验证您是否具有足够的权限来启动系统服务。

但我以管理员身份运行安装程序(Windows 7 Professional)并禁用UAC。此外,我可以通过命令提示符安装和运行instalutil.exe服务(我的服务项目包括安装程序类的实现,一般根据this article进行标记),在这种情况下一切正常

如果我将ServiceControl元素的Wait =“yes”替换为“no”,则服务安装没有错误,但它不会启动。在这种情况下,我也无法手动启动服务,因为服务启动并立即停止,并显示消息“本地计算机上的服务已启动然后停止。如果没有工作要做,某些服务会自动停止。”

我在互联网上搜索了这个问题,但我找不到任何解决方案。

我该如何解决?

这是我的Installer类的代码:

[RunInstaller(true)]
public class ProjectInstaller : Installer
{
    private ServiceProcessInstaller serviceProcessInstaller;
    private ServiceInstaller serviceInstaller;

    public ProjectInstaller()
    {
        this.serviceProcessInstaller = new ServiceProcessInstaller();
        this.serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
        this.serviceProcessInstaller.Username = null;
        this.serviceProcessInstaller.Password = null;
        this.serviceInstaller = new ServiceInstaller();
        this.serviceInstaller.ServiceName = "ClientServicesHost";
        this.serviceInstaller.StartType = ServiceStartMode.Automatic;
        this.Installers.Add(serviceProcessInstaller);
        this.Installers.Add(serviceInstaller);
        this.AfterInstall +=
                new InstallEventHandler(ProjectInstaller_AfterInstall);
    }

    void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        ServiceController sc = new ServiceController("ClientServicesHost");
        sc.Start();
    }
}

我的Windows服务:

class WindowsClientService : ServiceBase
{
    public ServiceHost serviceHost = null;

    public WindowsClientService()
    {
        this.ServiceName = "WcfServiceHost";
    }

    public static void Main()
    {
        ServiceBase.Run(new WindowsClientService());
    }

    protected override void OnStart(string[] args)
    {
        if (serviceHost != null)
        {
            serviceHost.Close();
        }

        // Create a ServiceHost for WcfClientService type
        // and provide the base address.
        serviceHost = new ServiceHost(typeof(WcfClientService));

        // Open the ServiceHost to create listeners
        // and start listening for messages.
        serviceHost.Open();
    }

    protected override void OnStop()
    {
        if (serviceHost != null)
        {
            serviceHost.Close();
            serviceHost = null;
        }
    }
}

我被指出我服务的原因会自动停止 - 它在启动后什么都不做。是真的吗?我的服务创建了听众并开始倾听 - 是“什么都不做”?

7 个答案:

答案 0 :(得分:5)

我使用WiX 3.7.821.0和我的服务遇到了同样的问题。它安装了一段时间,同样令人讨厌的“服务无法启动。确认你有足够的权限启动系统服务”。

我尝试了很多,但最后的事情是为<ServiceControl>使用两个部分,而不是试图在一个部分中填充所有部分。一个用于开始,一个用于停止。现在服务开始很好。

这不起作用:

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

这有效:

<ServiceControl Id="ServiceControl_Start"
                Name="MyService"
                Start="install"
                Wait="no" />
<ServiceControl Id="ServiceControl_Stop"
                Name="MyService"
                Stop="both"
                Remove="uninstall"
                Wait="yes" />

答案 1 :(得分:5)

我遇到了同样的错误,在我的情况下,我的文件元素上缺少KeyPath='yes' Vital="yes"

这是我的组件定义:

<Component Id="ComponentName"
           Guid="3aa1d5a5-28f0-4753-8e4b-a7ac0848d8be" >
    <File Id='ServiceFile'
          Name='Service.exe'
          DiskId='1'
          Source='bin\Service.exe'
          KeyPath='yes'
          Vital="yes"/>

    <ServiceInstall Id="ServiceInstaller"
                    Type="ownProcess"
                    Name="Service"
                    DisplayName="Service"
                    Description="A Service"
                    Start="auto"
                    ErrorControl="normal"
                    />

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

答案 2 :(得分:4)

我一直在寻找答案,最后我已经解决了!

保留与ServiceInstall名称相同的ServiceControl名称。

结果:

.under-card {
    z-index: 1000!important;
}

.ui-front, .top-card {
    z-index: 1001!important;
}

.dragging-card {
    z-index: 1002!important;
}

.ui-draggable-dragging {
    z-index: 1003!important;
}

答案 3 :(得分:2)

ServiceInstall的用户名应完全合格:

NT AUTHORITY\NetworkService

NT AUTHORITY\LocalService

NT AUTHORITY\SYSTEM

答案 4 :(得分:2)

嗯,大约一年半后我回到了这个项目。并尝试重新编译它并再次启动此服务。它有效!

所有改变的是我将clientaccesspolicy.xml添加到我的服务并运行policyServiceHost(类型为WebServiceHost)以及我的服务。但我不认为这很重要,因为它与我的应用程序的内部有关 - 而不是服务开始。

所以我尝试了很多变化,比如:

1)this.serviceProcessInstaller.Username = null;

this.serviceProcessInstaller.Username = @“NT AUTHORITY \ SYSTEM”;

2)两个或单个ServiceControl部分。

3)停止=“两个”

停止= “卸载”

所有作品现在都很精致!!!

我不知道发生了什么。我只是将它留给某种类型的bug或我的系统的一些奇怪的配置或其他任何不允许我自动启动我的服务。但现在所有的工作都很精细。

换句话说,我没有发现我服务的原因是什么,不会自动启动。 这是关于“足够的特权”(见第一篇文章),但即便是现在还不够清楚。

只有一条评论。如果我在卸载服务时使用两个ServiceControl部分,则会出现一个警告窗口(Windows 7),并提供自动关闭应用程序(服务)等等。所以我只是接受和服务卸载。但是,如果我在第一篇文章中仅使用一个ServiceControl部分,则不会出现警告窗口。并且它与1)和3)点组合没有关系。

答案 5 :(得分:1)

我将此代码段用于.wxs文件

<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="1.0.0.0" ?>
<?define UpgradeCode="{YOURGUID}" ?>
<?define Manufacturer="SetupWinService" ?>
<?define ProductName="WcfServiceHost" ?>
<?define SkuName="WcfServiceHost" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*"
             Name="$(var.ProductName)"
             Language="1049"
             Version="$(var.ProductVersion)"
             Manufacturer="$(var.Manufacturer)"
             UpgradeCode="$(var.UpgradeCode)">
        <!-- do you really need 200? i'd try at least 301 -->
        <Package InstallerVersion="301"
                 Compressed="yes"
                 Languages="1049"
                 InstallPrivileges="elevated"
                 SummaryCodepage="1251"
                 Platform="x86" />
        <Media Id="1"
               Cabinet="$(var.SkuName).cab"
               EmbedCab="yes" />
        <Directory Id="TARGETDIR"
                   Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="ProductDirectory"
                           Name="$(var.ProductName)" />
            </Directory>
        </Directory>
        <ComponentGroup Id="MainComponentGroup">
            <Component Directory="ProductDirectory">
                <File Name="$(var.**Project**.TargetFileName)"
                      Source="$(var.**Project**.TargetPath)"
                      KeyPath="yes"
                      Vital="yes" />
                <ServiceInstall Id="SeviceInstall"
                                Name="$(var.ProductName)"
                                DisplayName="$(var.ProductName)"
                                Type="ownProcess"
                                Interactive="no"
                                Start="auto"
                                Vital="yes"
                                ErrorControl="normal"
                                Account="LOCALSYSTEM">
                </ServiceInstall>
                <ServiceControl Id="ServiceControl_Start"
                                Name="$(var.ProductName)"
                                Start="install"
                                Wait="no" />
                <ServiceControl Id="ServiceControl_Stop"
                                Name="$(var.ProductName)"
                                Stop="both"
                                Remove="uninstall"
                                Wait="yes" />
            </Component>
            <Component Directory="ProductDirectory">
                <File Name="App.config"
                      Source="$(var.**Project**.TargetDir)\app.config"
                      Vital="yes" />
            </Component>
        </ComponentGroup>
        <Feature Id="MainFeature"
                 Level="1">
            <ComponentGroupRef Id="MainComponentGroup" />
        </Feature>
        <!-- added automatic upgrading -->
        <Upgrade Id="$(var.UpgradeCode)">
            <UpgradeVersion Property="UPGRADEFOUND"
                            Minimum="0.0.0.1" IncludeMinimum="yes"
                            Maximum="$(var.ProductVersion)" IncludeMaximum="yes"
                            OnlyDetect="no"
                            IgnoreRemoveFailure="yes"
                            MigrateFeatures="yes"/>
        </Upgrade>
        <InstallExecuteSequence>
            <InstallExecute Before="RemoveExistingProducts" />
            <RemoveExistingProducts Before="InstallFinalize" />
        </InstallExecuteSequence>
    </Product>
</Wix>

使用这个基本System.ServiceProcess.ServiceBase - 实现(与你的实际没有区别)

public partial class Service : ServiceBase
{
    public Service()
    {
        this.InitializeComponent();
    }

    public static void Main()
    {
        Run(new Service());
    }

    #region Service Commands

    protected override void OnStart(string[] args)
    {
    }

    protected override void OnStop()
    {
    }

    protected override void OnPause()
    {
        this.OnStop();
    }

    #endregion
}

通过这个片段,我得到了一个演示项目......

Fully working demo project available - 如果仍然失败,请调整代码,以便重现您的问题!

答案 6 :(得分:0)

我在某些计算机上遇到此错误。同一个可执行文件可以在某些文件上运行,并在其他文件中出现此错误。

在这些计算机上更新.NET 1.1 / 2.0 / 3.0有帮助(它适用于Windows XP,7和8.1)。