Der Versuch, einen Windows-Dienst aus einer Windows-Anwendung geben System.ComponentModel.Win32Exception zu starten: Zugriff verweigert
-
08-10-2019 - |
Frage
Ich versuche, eine Windows-Anwendung zu entwickeln, um Start / Stopp und Monitorstatus von zwei besonderen Dienstleistungen.
Das Problem ist, ich bin immer
System.ComponentModel.Win32Exception: Zugriff wird verweigert
Beachten Sie, dass beiden Dienste sind lokales System
Im Folgenden ist mein Code
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();
}
}
Lösung
Versuchen Sie, was in seinem Kommentar vorgeschlagen leppie, wenn es nicht funktioniert, müssen uns sagen, welche Linie Ausnahme wirft -., Wenn Sie erstellen Servicecontroller, wenn Sie versuchen, es zu starten oder irgendwo anders
Btw, Sie sollten nicht nennen sc.Start (), wenn der Dienst angehalten wird, sollten Sie rufen sc.Continue ().
Außerdem ist es wahrscheinlich bessere Idee zu verwenden mit Konstrukt als try / finally, wie folgt aus:
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);
}
}
Auf diese Weise brauchen Sie nicht sc.Close () aufrufen selbst (btw, Sie brauchen nur in der Nähe zu nennen Entsorgen redundant ist - Dokumentation für Close: Trennt diese Servicecontroller-Instanz aus dem Dienst und gibt alle Ressourcen, dass die Instanz zugeordnet.)
Bearbeiten :
Rechtsklick auf exe-Datei im Explorer und Ausführen als Administrator wählen. In Windows 7, es sei denn, Sie UAC (User Access Control) ausgeschaltet haben Sie nicht, bis Sie explizit Anfrage Programme als Administrator / oder Sie werden aufgefordert, dies zu tun.