Der Versuch, einen Windows-Dienst aus einer Windows-Anwendung geben System.ComponentModel.Win32Exception zu starten: Zugriff verweigert

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

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();
}
}
War es hilfreich?

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top