Автоматический запуск службы Windows при установке - PullRequest
114 голосов
/ 24 июня 2009

У меня есть служба Windows, которую я устанавливаю с помощью InstallUtil.exe. Несмотря на то, что я установил метод запуска на автоматический, служба не запускается при установке, я должен вручную открыть службы и нажать кнопку запуска Есть ли способ запустить его либо через командную строку, либо через код Сервиса?

Ответы [ 11 ]

207 голосов
/ 25 июня 2009

В своем классе установщика добавьте обработчик для события AfterInstall. Затем вы можете вызвать ServiceController в обработчике событий, чтобы запустить службу.

using System.ServiceProcess;

public ServiceInstaller()
{
    //... Installer code here
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
    {
         sc.Start();
    }
}

Теперь, когда вы запустите InstallUtil на вашем установщике, он установит и запустит службу.

27 голосов
/ 13 июля 2011

После небольшого рефакторинга это пример полного установщика службы Windows с автоматическим запуском:

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace Example.of.name.space
{
[RunInstaller(true)]
public partial class ServiceInstaller : Installer
{
    private readonly ServiceProcessInstaller processInstaller;
    private readonly System.ServiceProcess.ServiceInstaller serviceInstaller;

    public ServiceInstaller()
    {
        InitializeComponent();
        processInstaller = new ServiceProcessInstaller();
        serviceInstaller = new System.ServiceProcess.ServiceInstaller();

        // Service will run under system account
        processInstaller.Account = ServiceAccount.LocalSystem;

        // Service will have Start Type of Manual
        serviceInstaller.StartType = ServiceStartMode.Automatic;

        serviceInstaller.ServiceName = "Windows Automatic Start Service";

        Installers.Add(serviceInstaller);
        Installers.Add(processInstaller);
        serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;            
    }
    private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        ServiceController sc = new ServiceController("Windows Automatic Start Service");
        sc.Start();
    }
}
}
6 голосов
/ 24 июня 2009

Как насчет следующих команд?

net start "<service name>"
net stop "<service name>"
4 голосов
/ 24 июня 2009

Программные опции для управления услугами:

  • Можно использовать собственный код, "Запуск службы" . Максимальный контроль с минимальными зависимостями, но наибольшая работа.
  • WMI: Win32_Service имеет метод StartService. Это хорошо для случаев, когда вам нужно иметь возможность выполнять другую обработку (например, чтобы выбрать, какую услугу).
  • PowerShell: выполнить Start-Service через RunspaceInvoke или создать собственный Runspace и использовать для его выполнения метод CreatePipeline. Это хорошо в тех случаях, когда вам нужно иметь возможность выполнять другую обработку (например, для выбора какой службы) с гораздо более простой моделью кодирования, чем WMI, но зависит от устанавливаемого PSH.
  • Приложение .NET может использовать ServiceController
4 голосов
/ 24 июня 2009

Вы можете использовать следующую командную строку для запуска службы:

net start *servicename*
2 голосов
/ 24 июня 2009

Используйте ServiceController , чтобы запустить службу из кода.

Обновление: И более правильный способ запуска службы из командной строки - использовать команду "sc" ( Service Controller ) вместо "net".

1 голос
/ 04 января 2013

Несмотря на то, что я в точности следовал принятому ответу, я все равно не смог запустить службу - вместо этого во время установки мне было выдано сообщение об ошибке, в котором говорилось, что только что установленная служба не может быть запущена, поскольку она не существует несмотря на использование this.serviceInstaller.ServiceName вместо литерала ...

В конце концов я нашел альтернативное решение, использующее командную строку:

private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e) {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = "/C sc start " + this.serviceInstaller.ServiceName;

        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();
    }
0 голосов
/ 29 мая 2014

Просто примечание. Возможно, вы настроили свою службу по-разному, используя интерфейс форм для добавления установщика службы и установщика проекта. В этом случае замените, где написано serviceInstaller.ServiceName на «имя из конструктора» .ServiceName.

В этом случае вам также не нужны частные участники.

Спасибо за помощь.

0 голосов
/ 15 июля 2011

Вы испортили своего дизайнера. Добавьте свой компонент установщика. Он должен иметь serviceInstaller и serviceProcessInstaller. ServiceInstaller со свойством Startup Method, для которого установлено значение Automatic, запускается при установке и после каждой перезагрузки.

0 голосов
/ 24 июня 2009

Вы можете использовать <a href="http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.getservices.aspx" rel="nofollow noreferrer">GetServices</a> метод ServiceController класс, чтобы получить массив всех услуг. Затем найдите свой сервис, проверив свойство <a href="http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.servicename.aspx" rel="nofollow noreferrer">ServiceName</a> каждого сервиса. Найдя свой сервис, вызовите метод <a href="http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.start.aspx" rel="nofollow noreferrer">Start</a>, чтобы запустить его.

Вам также следует проверить свойство <a href="http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.status.aspx" rel="nofollow noreferrer">Status</a>, чтобы узнать, в каком состоянии оно уже находится перед вызовом start (оно может быть запущено, приостановлено, остановлено и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...