Cercando di avviare un servizio di Windows da un'applicazione Windows dare System.ComponentModel.Win32Exception: Accesso negato

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

Domanda

Sto cercando di sviluppare un'applicazione di Windows per avviare / stop e stato di monitoraggio di due particolari servizi.

Il problema è che sto ottenendo

  

System.ComponentModel.Win32Exception:   Accesso negato

Si noti che entrambi i servizi sono di sistema locale

Il seguente è il mio codice

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();
}
}
È stato utile?

Soluzione

Prova cosa leppie suggerito nel suo commento, se non funziona è necessario dirci quale linea sta gettando eccezione -. Quando si sta creando ServiceController, quando stai cercando di avviare o da qualche altra parte

A proposito, non si dovrebbe chiamare sc.Start () se il servizio è in pausa, si dovrebbe chiamare sc.Continue ().

Inoltre, è probabilmente meglio idea di utilizzare con costrutto di try / finally, in questo modo:

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

In questo modo non c'è bisogno di chiamare sc.Close () da soli (a proposito, è necessario chiamare Solo Chiude Dispose è ridondante - Documentazione per Chiudi: disconnette questo caso ServiceController dal servizio e libera tutte le risorse di cui l'istanza allocato.)

Modifica : alt text

Fare clic destro sul file exe in Explorer e selezionare Esegui come amministratore. In Windows 7, a meno che non si dispone di UAC (User Access Control) disattivato non sta eseguendo programmi come amministratore fino a quando non esplicitamente richiesta / o vi viene chiesto di farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top