Запустите Windows Service программно - PullRequest
49 голосов
/ 12 июля 2011

У меня проблема с приложением, которое я создаю.Я пытаюсь запустить службу Windows через мое приложение C #.Когда я нажимаю кнопку «Пуск», похоже, что все проходит, но когда я захожу на сервер, служба по-прежнему не показывает, что она работает.Однако при втором запуске я получаю исключение, в котором говорится, что экземпляр службы уже запущен.Снова, когда я захожу на сервер, сервис, кажется, остановлен.Кто-нибудь когда-нибудь видел это?

Вот мой код.

try
{
    while (reader.Read())
    {
        int timeoutMilliseconds = 1000;
        string serviceName = reader["ServiceName"].ToString();
        string permission = reader["Permission"].ToString();

        if (permission == "E")
        {
            lblServStartSuccess.Visible = true;

            ServiceController service = new ServiceController(serviceName);
            TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);
        }
        else
        {
            lblServErrorStart.Visible = true;
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.ToString());
}

РЕДАКТИРОВАТЬ: Вот исключение, которое я получил на одну услугу:

System.InvalidOperationException: служба Административная служба диспетчера логических дисков не найдена на компьютере '.'.---> System.ComponentModel.Win32Exception: указанная служба не существует в качестве установленной службы --- Конец внутренней трассировки стека исключений

Я знаю, что служба существует.Нужно ли что-то добавить перед службой, чтобы сказать, на какой сервер смотреть?

Ответы [ 6 ]

40 голосов
/ 12 июля 2011

Если код, который вы показали, выполняется на компьютере, отличном от того, на котором должен запускаться сервис (из ваших комментариев не ясно, так ли это), вам нужно будет указать имя компьютера в ServiceController.constructer.

Возможно ли, что вы успешно запускаете службу, но не на той машине, которую думаете?Это соответствует описанным вами симптомам.

ServiceController service = new ServiceController(serviceName, serverName);

Также см. ServiceController документация конструктора .

18 голосов
/ 12 июля 2011

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

ServiceController controller = new ServiceController(serviceName);
if (controller.Status==ServiceControllerStatus.Running)
    controller.Stop();

if (controller.Status==ServiceControllerStatus.Stopped)
    controller.Start(); 
5 голосов
/ 27 июля 2016

Это старая ветка, но гугл получил меня здесь. Мои сервисы, даже после успешного запуска, будут по-прежнему запрашивать обратно как остановленные. Если вы добавите

service.Refresh();

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

P.S .: Я добавил минутный тайм-аут и все равно получил службу остановленного ответа без обновления.

2 голосов
/ 30 июня 2018

Прежде всего вам нужно добавить ссылку на DLL (ServiceProcess) в ваш проект Ссылки как:

Right click on References in Solution Explorer -> Add Reference -> Assemblies -> 
Framework -> System.ServiceProcess

Затем добавьте ServiceProcess DLL в ваш проект:

using System.ServiceProcess;

После этого используйте этот код:

ServiceController service = new ServiceController(yourServiceName);
2 голосов
/ 13 мая 2016
public static void StartService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;

            // count the rest of the timeout
            int millisec2 = Environment.TickCount;
            timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1));
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);

        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }
    public static void StopService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;
            if (service.Status == ServiceControllerStatus.Running)
            {
                millisec1 = Environment.TickCount;
                timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
            }


        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }
    public static void RestartService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;
            if (service.Status == ServiceControllerStatus.Running)
            {
                millisec1 = Environment.TickCount;
                timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
            }
            // count the rest of the timeout
            int millisec2 = Environment.TickCount;
            timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);

        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }

Не забудьте добавить ServiceProcess в качестве ссылки, используя System.ServiceProcess;

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

Просто попробуйте service.Start ();без таймаута или waitforstatus и подключите его события, чтобы увидеть, что происходит.

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