web-dev-qa-db-de.com

Starten Sie den Windows-Dienst programmgesteuert

Ich habe ein Problem mit einer Anwendung, die ich erstelle. Ich versuche, einen Windows-Dienst über meine C # -App zu starten. Wenn ich auf meine Start-Schaltfläche klicke, sieht es so aus, als würde alles durchgehen, aber wenn ich mich beim Server anmelde, zeigt der Dienst immer noch nicht an, dass er läuft. Beim zweiten Ausführen erhalte ich jedoch eine Ausnahme, dass die Instanz des Dienstes bereits ausgeführt wird. Wenn ich mich wieder beim Server anmelde, scheint der Dienst gestoppt zu sein. Hat jemand das jemals gesehen?

Hier ist mein Code.

try
{
    while (reader.Read())
    {
        int timeoutMilliseconds = 1000;
        string serviceName = reader["ServiceName"].ToString();
        string permission = reader["Permission"].ToString();

        if (permission == "E")
        {
            lblServStartSuccess.Visible = true;

            ServiceController service = new ServiceController(serviceName);
            TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);
        }
        else
        {
            lblServErrorStart.Visible = true;
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.ToString());
}

EDIT: Hier ist die Ausnahme, die ich bei einem Service erhalten habe:

System.InvalidOperationException: Service Logical Disk Manager Der Verwaltungsdienst wurde auf dem Computer '.' Nicht gefunden. ---> System.ComponentModel.Win32Exception: Der angegebene Dienst hat keine als installierter Dienst vorhanden --- Ende der inneren Trace-Ablaufverfolgung

Ich weiß, dass der Dienst existiert. Muss ich vor dem Dienst etwas hinzufügen, um den Server anzugeben?

47
Matt

Wenn der von Ihnen angezeigte Code auf einem anderen Computer ausgeführt wird, als dort, wo der Dienst ausgeführt werden soll (aus Ihren Kommentaren ist nicht ersichtlich, ob dies der Fall ist oder nicht), müssen Sie den Computernamen im ServiceController-Konstruktor angeben.

Ist es möglich, dass Sie den Dienst erfolgreich starten, aber nicht auf der Maschine, die Sie glauben? Das würde zu den Symptomen passen, die Sie beschreiben.

ServiceController service = new ServiceController(serviceName, serverName);

Siehe auch ServiceController Konstruktordokumentation .

38
hatchet

Hier ist der Code, den ich in einem Windows-Dienst habe, der dafür verantwortlich ist, dass andere Dienste, die auf demselben Server ausgeführt werden, nicht mehr gestartet werden.

ServiceController controller = new ServiceController(serviceName);
if (controller.Status==ServiceControllerStatus.Running)
    controller.Stop();

if (controller.Status==ServiceControllerStatus.Stopped)
    controller.Start(); 
18
Gary Kindel

Dies ist ein alter Thread, aber Google hat mich hierher gebracht. Meine Dienste werden auch nach dem erfolgreichen Start immer noch als angehalten abgerufen. Wenn Sie hinzufügen

service.Refresh();

Es wird der aktuelle Status anstelle des gespeicherten Status von einer vorherigen Abfrage abgefragt. Ich weiß nicht, warum es so funktioniert, aber es tut es.

P .: Ich habe noch eine Minute Zeit hinzugefügt und trotzdem bekam ein Dienst keine Antwort ohne Aktualisierung.

5
MattyMatt
public static void StartService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;

            // count the rest of the timeout
            int millisec2 = Environment.TickCount;
            timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1));
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);

        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }
    public static void StopService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;
            if (service.Status == ServiceControllerStatus.Running)
            {
                millisec1 = Environment.TickCount;
                timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
            }


        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }
    public static void RestartService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;
            if (service.Status == ServiceControllerStatus.Running)
            {
                millisec1 = Environment.TickCount;
                timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
            }
            // count the rest of the timeout
            int millisec2 = Environment.TickCount;
            timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);

        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }

Vergessen Sie nicht, Service Process als Referenz hinzuzufügen Using System.ServiceProcess;

2
Nikhil Dinesh

Zunächst müssen Sie in Ihrem Projekt References eine Referenz der DLL (ServiceProcess) hinzufügen:

Right click on References in Solution Explorer -> Add Reference -> Assemblies -> 
Framework -> System.ServiceProcess

Fügen Sie dann ServiceProcess DLL zu Ihrem Projekt hinzu:

using System.ServiceProcess;

Verwenden Sie danach diesen Code:

ServiceController service = new ServiceController(yourServiceName);
1
user5377037

Probieren Sie einfach service.Start (); ohne Timeout oder waitforstatus und haken Sie seine Ereignisse ein, um zu sehen, was passiert.

0
tcables