Не удается запустить службу Windows с 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 через командную строку (мой проект службы включает реализацию класса Installer и в целом размечен в соответствии с этой статьей), и в этом случае все работает нормально со службой.

Если я заменяю Wait="yes" элемента ServiceControl на "no", служба устанавливается без ошибок, но не запускается. Я также не могу запустить службу вручную в этом случае, потому что служба запускается и сразу останавливается с сообщением "служба на локальном компьютере запускается, а затем останавливается. Некоторые службы останавливаются автоматически, если у них нет работы".

Я искал об этой проблеме в Интернете, но я не нашел никаких решений.

Как мне это исправить?

Это код моего класса установщика:

[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 ответов

Решение

Что ж, я вернулся к этому проекту примерно через полтора года. И пытается перекомпилировать его и запустить этот сервис снова. И это работает!

Все, что изменилось, я добавил clientaccesspolicy.xml к моей службе и запустил policyServiceHost (типа WebServiceHost) вместе со своей службой. Но я не думаю, что это важно, потому что это относится к внутренностям моего приложения, а не к запуску сервиса.

Итак, я попробовал много вариантов, как:

1) this.serviceProcessInstaller.Username = null;

или же

this.serviceProcessInstaller.Username = @ "NT AUTHORITY \ SYSTEM";

2) Два или один раздел ServiceControl.

3) Стоп ="оба"

или же

Стоп ="удалить"

ВСЕ РАБОТАЕТ СЕЙЧАС!!!

Я не знаю, что происходит. Я просто оставляю это на какой-то тип ошибки или на какую-то странную конфигурацию моей системы или на что-то еще, что не позволяет мне раньше автоматически запускать мой сервис. Но сейчас все прекрасно работает.

Другими словами, я не выяснил, по какой причине мой сервис не запустился автоматически. Речь шла о "достаточных привилегиях" (см. Первый пост), но это не совсем понятно для меня даже сейчас.

Только одно замечание. Если при удалении службы я использую два раздела ServiceControl, появляется окно с предупреждением (Windows 7) и предлагается автоматически закрыть приложение (службу) и т. Д. Так что я просто принимаю и сервис удаляется хорошо. Но окна предупреждения не появляются, если я использую только один раздел ServiceControl, как в моем примере в первом посте. И снова это не имеет отношения к 1) и 3) пунктам комбинации.

Я долго искал ответ и наконец решил!

Сохраните то же имя ServiceControl, что и имя ServiceInstall.

Результат:

<?xml version="1.0" encoding="utf-8"?>
<?define ProductVersion = "1.0.0"?>
<?define ProductUpgradeCode = "{E8DFD614-41F6-4592-AD7A-27EA8A49C82E}"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Product Id="*" UpgradeCode="$(var.ProductUpgradeCode)"
           Name="Eyes Relax"
           Version="$(var.ProductVersion)"
           Manufacturer="Ourdark"
           Language="1033">
    <Package Manufacturer="Ourdark" InstallerVersion="100" Languages="1033" Compressed="yes" />

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

    <Property Id="WHSLogo">1</Property>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder" Name="PFiles">
        <Directory Id="WHS" Name="Eyes Relax">
          <Component Id="EyesRelax" Guid="{78534F5E-FC72-49E6-AF11-4F2068EA7571}">

            <File Id="RelaxEyes.exe.config"
                  Name="RelaxEyes.exe.config"
                  Source="RelaxEyes\bin\Debug\RelaxEyes.exe.config"
                  Vital="yes"
                  KeyPath="no"
                  DiskId="1"/>

            <File Id="RelaxEyes.exe"
                  Name="RelaxEyes.exe"
                  Source="RelaxEyes\bin\Debug\RelaxEyes.exe"
                  Vital="yes"
                  KeyPath="yes"
                  DiskId="1"/>

            <ServiceInstall
              Id="ServiceInstaller"
              Type="ownProcess"
              Vital="yes"
              Name="Eyes Relax"
              DisplayName="Eyes Relax"
              Description="Eyes Relax"
              Start="auto"
              Account="NT AUTHORITY\LocalService"
              ErrorControl="ignore"
              Interactive="no">
            </ServiceInstall>
            <ServiceControl Id="StartService"
                            Start="install"
                            Stop="both"
                            Remove="uninstall"
                            Name="Eyes Relax"
                            Wait="yes" />
          </Component>
        </Directory>
      </Directory>
    </Directory>

    <Feature Id="ProductFeature" Title="WHSDiskManagement" Level="1">
      <ComponentRef Id="EyesRelax" />
    </Feature>
  </Product>
</Wix>

У меня была та же проблема с использованием 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" />

У меня была такая же ошибка, и в моем случае я отсутствовал 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>

Имя пользователя для ServiceInstall должен быть полностью квалифицирован:

NT AUTHORITY\NetworkService

NT AUTHORITY\LocalService

NT AUTHORITY\SYSTEM

Я бы использовал этот фрагмент для.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
}

С этим фрагментом я получил демо-проект для работы...

Доступен полностью работающий демонстрационный проект - если это не помогло, пожалуйста, измените код, чтобы я мог воспроизвести Вашу проблему!

У меня была эта ошибка на некоторых компьютерах. Один и тот же исполняемый файл работает на некоторых и дает эту ошибку на других.

Помогает обновление.NET 1.1/2.0/3.0 на этих компьютерах (у меня это работало на Windows XP, 7 и 8.1).

Другие вопросы по тегам