Автоматически запускать службу Windows при установке

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

Ответ 1

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

using System.ServiceProcess;

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

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{

ServiceInstaller serviceInstaller = (ServiceInstaller) отправитель;

    using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
    {
         sc.Start();
    }
}

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

Ответ 2

После рефакторинга немного, это пример полного установщика служб 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();
    }
}
}

Ответ 3

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

net start "<service name>"
net stop "<service name>"

Ответ 4

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

net start *servicename*

Ответ 5

Программные параметры управления службами:

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

Ответ 6

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

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

Ответ 7

Несмотря на то, что в соответствии с принятым ответом точно, я все еще не смог запустить службу. Вместо этого мне пришло сообщение об ошибке при установке, в котором указано, что только что установленная служба не может быть запущена, поскольку ее не было, несмотря на использование 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();
    }

Ответ 8

Автоматический запуск означает, что служба запускается автоматически при запуске Windows. Как отмечали другие, чтобы запустить его с консоли, вы должны использовать ServiceController.

Ответ 9

Вы можете использовать метод GetServices ServiceController класса, чтобы получить массив всех служб. Затем найдите свою службу, проверив свойство ServiceName для каждой службы. Когда вы нашли свое обслуживание, вызовите метод Start, чтобы запустить его.

Вы также должны проверить свойство Status, чтобы узнать, какое состояние оно уже находится до начала запуска (оно может быть запущено, приостановлено, остановлено и т.д.).

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

Довольно поздно, но вы можете использовать инструмент sc в cmd.

sc start ServiceName

Обратите внимание, что вы должны быть в режиме администратора.