С# запускает Windows Service программно

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

Вот мой код.

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());
}

EDIT: Вот исключение, которое я получил по одной услуге:

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

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

Ответ 1

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

  ServiceController service = new ServiceController(serviceName, serverName);

http://msdn.microsoft.com/en-us/library/aa331793%28v=VS.71%29.aspx

Ответ 2

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

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

if (controller.Status==ServiceControllerStatus.Stopped)
    controller.Start(); 

Ответ 3

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

service.Refresh();

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

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

Ответ 4

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;

Ответ 5

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

Ответ 6

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

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

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

using System.ServiceProcess;

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

ServiceController service = new ServiceController(yourServiceName);