2011-07-12 19 views
40

Tengo un problema con una aplicación que estoy creando. Estoy tratando de iniciar un servicio de Windows a través de mi aplicación C#. Cuando hago clic en mi botón de inicio, parece que todo funciona, pero cuando inicio sesión en el servidor, el servicio aún no muestra que se está ejecutando. Sin embargo, la segunda vez que lo ejecuto, recibo una excepción que dice que la instancia del servicio ya se está ejecutando. De nuevo, cuando inicio sesión en el servidor, el servicio parece estar detenido. ¿Alguien ha visto esto alguna vez?C# start Windows Service programmatically

Aquí está mi código.

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: Aquí está la excepción que he recibido en un servicio:

System.InvalidOperationException: Servicio Administrativo de servicio Administrador de discos lógicos no se encontró en equipo ''. ---> System.ComponentModel.Win32Exception: el servicio especificado no existe como un servicio instalado --- Fin de la pila de excepción interna trace ---

Sé que el servicio existe. ¿Debo agregar algo en frente del servicio para decirle qué servidor mirar?

+1

¿Está seguro de que el servicio no está bloqueado en el estado inicial? Recuerdo que el panel de control de servicios no fue brillante al mostrar eso (al menos algunas versiones de Windows) – Rup

+0

¿Qué quiere decir con "cuando inicio sesión en el servidor"? ¿Está intentando utilizar el SCM en una máquina diferente? – BrokenGlass

+0

Sí, estoy ejecutando el servicio web desde un servidor remoto. Estoy usando una cuenta que tiene acceso de administrador. No estoy seguro de si está atascado. ¿Mi tiempo de espera puede ser demasiado corto y el tiempo de espera? – Matt

Respuesta

31

Si el código que mostró se está ejecutando en una máquina diferente a la que se supone que se debe ejecutar el servicio (no estoy seguro de sus comentarios si ese es el caso o no), deberá proporcionar el nombre de la máquina en el ServiceController constructer. ¿Es posible que esté iniciando con éxito el servicio, pero no en la máquina que cree? Eso encajaría con los síntomas que describes.

ServiceController service = new ServiceController(serviceName, serverName); 

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

+0

He editado para mostrar el uso del constructor que toma el nombre del servidor remoto. – hatchet

+0

Creo que estabas en lo correcto porque ahora recibo un error que dice que se requieren otros privilegios para hacer esto. – Matt

+0

Si inicio sesión como el usuario suplantado en el servidor de origen, puedo abrir el administrador de servicios del servidor de destino y de forma remota iniciar y detener los servicios. Simplemente no puedo hacerlo desde la aplicación web. – Matt

0

Simplemente intente service.Start(); sin timeout o waitforstatus y enganche sus eventos para ver qué está pasando.

+0

Todo parece estar funcionando. Simplemente no muestra el servicio como en ejecución. – Matt

14

Aquí es código que tengo en una ventana de servicio responsable de detener a partir de otros servicios que se ejecutan en el mismo servidor.

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

if (controller.Status==ServiceControllerStatus.Stopped) 
    controller.Start(); 
2
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); 
     } 
    } 

No se olvide de añadir ServiceProcess como referance usando System.ServiceProcess;

+0

¿Eso agrega algo al código en la pregunta? – Rup

3

Este es un hilo viejo, pero google me consiguió aquí. Mis servicios, incluso después de iniciar con éxito, seguirían preguntando como detenidos. Si agrega

service.Refresh(); 

se consulta el estado actual real en lugar del estado almacenado de una consulta anterior. No sé por qué funciona así, pero funciona.

P.S .: He añadido un minuto de larga duración y todavía recibí un servicio, se detuvo la respuesta sin la actualización.

Cuestiones relacionadas