Asunto: Cómo detener servicio de Windows con Visual C# .Net
Estoy desarrollando una aplicación de Facturación y contabilidad para una empresa, estoy usando Microsoft Visual C# .Net de Visual Studio .Net 2010, he añadido una opción a la aplicación para que el usuario pueda hacer copia de seguridad de la BD PostgreSQL, lo que quiero hacer es detenener el servicio de PostgreSQL, copiar los ficheros de la bd y volver a iniciarlo ¿cómo detengo e inicio un servicio Windows con Visual C#?
Publicado:
Dom Jul 29, 2012 6:42 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Cómo detener servicio de Windows con Visual C# .Net
Anuncios
varios escribió:
Estoy desarrollando una aplicación de Facturación y contabilidad para una empresa, estoy usando Microsoft Visual C# .Net de Visual Studio .Net 2010, he añadido una opción a la aplicación para que el usuario pueda hacer copia de seguridad de la BD PostgreSQL, lo que quiero hacer es detenener el servicio de PostgreSQL, copiar los ficheros de la bd y volver a iniciarlo ¿cómo detengo e inicio un servicio Windows con Visual C#?
Para detener un servicio Windows con Visual C# puedes usar el siguiente código:
Código:
ServiceController servicioWindows = new ServiceController("postgresql-9.0");
try
{
if (servicioWindows != null &&
servicioWindows.Status == ServiceControllerStatus.Running)
{
servicioWindows.Stop();
}
servicioWindows.WaitForStatus(ServiceControllerStatus.Stopped);
servicioWindows.Close();
MessageBox.Show("Servicio detenido correctamente");
}
catch (Exception ex)
{
MessageBox.Show ("Error al detener el servicio: " + ex.Message);
}
Para que el código anterior funcione tendrás que añadir el correspondiente using:
using System.ServiceProcess;
Y ten en cuenta también varias cosas:
1. Con el código C# anterior detendremos un servicio con el nombre "postgresql-9.0", obviamente deberás cambiar esto por el nombre del servicio, no la descripción sino el nombre corto.
2. Con el código C# anterior la aplicación no continuará hasta que se haya detenido el servicio o haya dado algún tipo de error al detenerse. Esto te será útil pues, como dices, no deberás iniciar la copia de ficheros hasta que el servicio se haya detenido completamente. Con "WaitForStatus", como te mostramos en el ejemplo C# conseguirás esto.
3. El código C# anterior, antes de detener el servicio, comprueba el estado actual y sólo intenta detenerlo si está en estado "running".
Publicado:
Dom Jul 29, 2012 7:14 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Cómo detener servicio de Windows con Visual C# .Net
Anuncios
Para iniciar el servicio el código sería:
Código:
ServiceController servicioWindows =
new ServiceController("postgresql-9.0");
try
{
if (servicioWindows != null &&
servicioWindows.Status != ServiceControllerStatus.Running)
{
servicioWindows.Start();
}
servicioWindows.WaitForStatus(ServiceControllerStatus.Running);
servicioWindows.Close();
MessageBox.Show("Servicio iniciado correctamente");
}
catch (Exception ex)
{
MessageBox.Show("Error al iniciar el servicio: " + ex.Message);
}
Al igual que para detener el servicio, para iniciar el servicio con C# comprobamos primero que no esté inicado ya, si no lo está intentamos iniciarlo y no continuará el programa hasta que no esté iniciado o dé error.
Publicado:
Dom Jul 29, 2012 7:20 pm
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: Re: Cómo detener servicio de Windows con Visual C# .Net
Anuncios
Estoy ejecutando el código que me comentas pero aparece este error:
---------------------------
Facturación y contabilidad - Backup PostgreSQL
---------------------------
Error al iniciar el servicio: No se puede abrir el servicio postgresql-9.0 en el equipo '.'.
---------------------------
Aceptar
---------------------------
Utilizo PostgreSQL 9 y el servicio se llama "postgresql-9.0", esto lo he comprobado varias veces y es correcto ¿a qué puede ser debido este error?
Publicado:
Dom Jul 29, 2012 7:22 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Cómo detener servicio de Windows con Visual C# .Net
Anuncios
varios escribió:
Estoy ejecutando el código que me comentas pero aparece este error:
---------------------------
Facturación y contabilidad - Backup PostgreSQL
---------------------------
Error al iniciar el servicio: No se puede abrir el servicio postgresql-9.0 en el equipo '.'.
---------------------------
Aceptar
---------------------------
Utilizo PostgreSQL 9 y el servicio se llama "postgresql-9.0", esto lo he comprobado varias veces y es correcto ¿a qué puede ser debido este error?
Si usas Windows Vista, Windows 7 ó Windows 8 ten en cuenta que para estos procesos tendrás que ejecutar tu aplicación como administrador (pulsando con el botón derecho del ratón sobre el ejecutable y seleccionando "Ejecutar como administrador"), de lo contrario es posible que no tenga permisos para modificar el estado de un servicio. Esto ocurre si tienes el UAC (control de cuentas de usuario) activado o si el usuario que inicia la aplicación no tiene permisos suficientes.
Publicado:
Dom Jul 29, 2012 7:55 pm
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: Re: Cómo detener servicio de Windows con Visual C# .Net
Anuncios
alonsojpd escribió:
Si usas Windows Vista, Windows 7 ó Windows 8 ten en cuenta que para estos procesos tendrás que ejecutar tu aplicación como administrador (pulsando con el botón derecho del ratón sobre el ejecutable y seleccionando "Ejecutar como administrador"), de lo contrario es posible que no tenga permisos para modificar el estado de un servicio. Esto ocurre si tienes el UAC (control de cuentas de usuario) activado o si el usuario que inicia la aplicación no tiene permisos suficientes.
Efectivamente, he generado el ejecutable de la aplicación, lo he ejecutado como administrador y ahora sí me inicia y detiene el servicio.
Pero ahora me surge otra duda, sería muy molesto que el usuario tuviera que ejecutar toda la aplicación de Facturación y Contabilidad como administrador cada vez que la abra ¿hay alguna forma de que sólo pida iniciarse como administrador al ejecutar la copia de seguridad y no al ejecutar la aplicación completa?
Publicado:
Dom Jul 29, 2012 7:58 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Cómo detener servicio de Windows con Visual C# .Net
Anuncios
varios escribió:
Efectivamente, he generado el ejecutable de la aplicación, lo he ejecutado como administrador y ahora sí me inicia y detiene el servicio.
Pero ahora me surge otra duda, sería muy molesto que el usuario tuviera que ejecutar toda la aplicación de Facturación y Contabilidad como administrador cada vez que la abra ¿hay alguna forma de que sólo pida iniciarse como administrador al ejecutar la copia de seguridad y no al ejecutar la aplicación completa?
Existen varios métodos para solucionar esto. Nosotros te recomendamos que la parte de la copia de seguridad la hagas en una segunda aplicación independiente de la de Facturación y Contabilidad. Y en la de facturación y contabilidad, en el menú o botón o donde quieras, ejecutes esta segunda aplicación de backup en modo administrador, sería con el siguiente código C#:
Código:
ProcessStartInfo aplicacionWindows =
new System.Diagnostics.ProcessStartInfo();
aplicacionWindows.FileName = "backup_postgresql.exe";
aplicacionWindows.Verb = "runas";
Process process = new Process();
process.StartInfo = aplicacionWindows;
process.Start();
Añadiendo en el using:
using System.Diagnostics;
Donde "backup_postgresql.exe" será el nombre del ejecutable de la aplicación de backup de PostgreSQL que desarrolles.
De esta forma sólo se le mostrará el aviso al usuario de que se va a ejecutar una aplicacón que podría realizar cambios en el sistema (control UAC) cuando pulse en el menú de backup de PostgreSQL.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A