Tratando de iniciar un servicio de Windows desde una aplicación de Windows dar System.ComponentModel.Win32Exception: Acceso denegado

StackOverflow https://stackoverflow.com/questions/4407796

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();
}
}
¿Fue útil?

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 : text alt

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top