Ich habe eine Anwendung erstellt, die als Windows-Dienst ausgeführt wird und über meinen Code installiert wird.
Alles ist in Ordnung außer bei der Anmeldung.
Wenn ich auf dem ersten Windows xp / 2003 Server Anmeldebildschirm bin, bin ich nicht sicher, ob der Dienst überhaupt läuft. Wenn dies der Fall ist, funktioniert es, da es nicht funktioniert (der Dienst verwendet WINPCAP, was ein Problem darstellen könnte).
Die Diensteinstellungen sind auf "Interaktion mit Desktop" eingestellt und werden als SYSTEM ausgeführt.
Wie kann ich sicherstellen, dass der Dienst vor der Windows-Anmeldung gestartet wird? Wie kann ich sicherstellen, dass es auch läuft, nachdem ich mich abgemeldet habe?
Es gibt ein paar Dinge zu beachten.
Zunächst können Sie überprüfen, ob Ihr Dienst vor dem Anmelden und nach dem Abmelden tatsächlich ausgeführt wird, indem Sie Ereignisse im Windows-Ereignisprotokoll protokollieren. So ziemlich alle Dienste tun dies, wann immer sie starten und stoppen, und Ihre sollten dasselbe tun.
Es kann sein, dass WinPcap ein Teil des Problems ist. Es gibt ein paar goldene Regeln für die Verwendung von WinPcap in einem Dienst.
1a) Ihr Dienst darf nichts tun, was dazu führen könnte, dass der WinPcap-Dienst versucht, hochzufahren, während der eigene Dienst gestartet wird, da dies zu einem Deadlock im Windows-Dienststeuerungs-Manager führt. Das bedeutet, wenn der WinPcap-Dienst nicht bereits SERVICE_RUNNING ist, wenn der Dienst gestartet wird, dürfen Sie nichts tun, was dazu führen könnte, dass er gestartet wird, nachdem der Dienst SERVICE_RUNNING gestartet wurde.
Es gibt zwei Möglichkeiten, dies zu gewährleisten. Machen Sie Ihren Dienst abhängig von npf, dem Netzwerkpaketfilter-Dienst. Oder rufen Sie keine WinPcap-Funktion auf, nachdem Ihr Dienst SERVICE_RUNNING ist. Ich habe diese letzte Methode nicht ausprobiert. Ich nehme an, dann wird die WinPcap-Funktion blockieren, bis npf SERVICE_RUNNING ist.
1b) Wenn Sie Ihren Dienst von npf abhängig machen, müssen Sie ihn auch abhängig machen von nm (Network Monitor Driver) - genau dann, wenn nm auf dem System installiert ist. nm bietet WinPcap PPP / VPN-Unterstützung, und WinPcap versucht immer, es zu benutzen, wenn es installiert ist. Offensichtlich wird Ihr Dienst nicht gestartet, wenn Sie nm von Ihrem Dienst abhängig machen und nm nicht installiert ist.
Ich glaube nicht, dass es eine garantierte Möglichkeit gibt, sicherzustellen, dass Ihr Dienst gestartet wird, bevor der Desktop angezeigt wird. Möglicherweise können Sie jedoch etwas helfen, indem Sie eine Dienststeuerungsgruppe erstellen, sie am Ende der vorhandenen Liste der Dienststeuerungsgruppen hinzufügen und Ihren Dienst in diese Gruppe aufnehmen. Ich bin nicht ganz davon überzeugt, dass dies eine "bewährte" Möglichkeit ist, Ihren Service früher zu starten, denn wenn es einen genehmigten Weg gäbe, würden alle es tun und es würde nicht mehr funktionieren. Es gibt jedoch einen Vorschlag, dass Dienste in einer Gruppe vor Diensten gestartet werden, die keiner Gruppe angehören.
Betrachten Sie HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Control \ GroupOrderList" und HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Control \ ServiceGroupOrder" und machen Sie ein wenig Googeln.
Tags und Links windows-services