Tratando de iniciar un servicio de Windows desde una aplicación de Windows dar System.ComponentModel.Win32Exception: Acceso denegado
-
08-10-2019 - |
Pregunta
Estoy tratando de desarrollar una aplicación de Windows para iniciar / detener y monitorear el estatus de dos servicios particulares.
El problema es que estoy recibiendo
System.ComponentModel.Win32Exception: Acceso denegado
Tenga en cuenta que ambos servicios son sistema local
El siguiente es el código
private void StartService(string WinServiceName)
{
ServiceController sc = new ServiceController(WinServiceName,".");
try
{
if (sc.ServiceName.Equals(WinServiceName))
{
//check if service stopped
if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Stopped))
{
sc.Start();
}
else if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Paused))
{
sc.Start();
}
}
}
catch (Exception ex)
{
label3.Text = ex.ToString();
MessageBox.Show("Could not start " + WinServiceName + "Service.\n Error : " + ex.ToString(), "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
sc.Close();
sc.Dispose();
// CheckStatus();
}
}
Solución
Trate lo leppie sugirió en su comentario, si no funcione es necesario que nos diga qué línea está lanzando una excepción -. Cuando estás creando ServiceController, cuando se está tratando de iniciar o en otro lugar
Por cierto, no debe llamar sc.Start () si el servicio está en pausa, debe llamar a sc.Continue ().
Además, es probable que sea mejor idea de usar mediante construcción de try / finally, como esto:
private void StartService(string WinServiceName)
{
try
{
using(ServiceController sc = new ServiceController(WinServiceName,"."))
{
if (sc.ServiceName.Equals(WinServiceName))
{
//check if service stopped
if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Stopped))
{
sc.Start();
}
else if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Paused))
{
sc.Continue();
}
}
}
}
catch (Exception ex)
{
label3.Text = ex.ToString();
MessageBox.Show("Could not start " + WinServiceName + "Service.\n Error : " + ex.ToString(), "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
De esta manera no es necesario llamar a sc.Close () mismo (por cierto, es necesario llamar Cerrar deseche sólo es redundante - Documentación para Cerrar: Desconecta este caso ServiceController del servicio y libera todos los recursos que la instancia asignado.)
Editar :
Haga clic derecho sobre el archivo exe en el Explorador y seleccione Ejecutar como administrador. En Windows 7, a menos que tenga el UAC (User Access Control) desactivado no se está ejecutando programas como administrador hasta que solicite explícitamente / o se le pide que lo haga.