Cercando di avviare un servizio di Windows da un'applicazione Windows dare System.ComponentModel.Win32Exception: Accesso negato
-
08-10-2019 - |
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();
}
}
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 :
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.