Ermitteln, ob Code als Dienst ausgeführt wird

7

Gibt es eine Möglichkeit für eine .NET-Bibliothek festzustellen, ob sie als Dienst ausgeführt wird?

Meine Bibliothek kann in beide Richtungen laufen. Wenn es als Dienst ausgeführt wird, müssen Entwickler jedoch eine zusätzliche Methode aufrufen, die angibt, dass Fakten oder bestimmte Funktionen nicht korrekt funktionieren. Ich möchte, dass meine Bibliothek, die die Protokollierung behandelt, eine Warnung schreibt, wenn sie in einem Dienst verwendet wird, ohne dass diese Methode aufgerufen wird.

    
Jonathan Allen 05.01.2009, 18:55
quelle

7 Antworten

11

Nachdem wir viel durch intellisense, den Debugger und die Dokumentation gesucht hatten, konnten wir nichts wirklich zuverlässiges finden. Möglicherweise ist es möglich, die aktuelle Prozess-ID abzurufen und herauszufinden, ob dieser Prozess beim SCM registriert ist. Während .NET jedoch eine Möglichkeit bietet, eine Sammlung aller Services abzurufen, gehören die Prozess-IDs nicht zu den verfügbaren Informationen. Das Vergleichen des Prozessnamens mit Dienstnamen ist möglich, aber nicht unbedingt zuverlässig.

Es gibt jedoch zwei Dinge, die relativ einfach zu überprüfen sind und für die Unterscheidung, die Sie benötigen, ausreichen, wenn nicht genau "Wird dieser Code als Dienst ausgeführt?"

System.Environment.UserInteractive : (Wie Stephen Martin bemerkte) Wenn das stimmt, kann es kein Service sein. Die meisten Prozesse, die kein Dienst (noch ein Gerätetreiber) sind, sagen "wahr". Einige Konsolen-Apps geben möglicherweise false aus, wenn sie in nicht interaktiven Situationen ausgeführt werden, z. B. als Teil eines Build-Prozesses.

System.Diagnostics.Process.GetCurrentProcess().SessionId : (was ich denke, ist das gleiche, was Pierre meinte) Wenn das nicht 0 ist, wurde es nicht als Dienst gestartet. Die meisten normalen Anwendungen werden nicht in Sitzung 0 sein (mit einigen nicht ganz normalen Ausnahmen, wie von Pierre und Stephen bemerkt). Die größte Frage ist, wie sich das unter einem älteren Betriebssystem wie XP oder früher verhält. XP und Windows 2000 haben anscheinend Dienste, die in Sitzung 0 ausgeführt werden, normale Anwendungen befinden sich jedoch auch in Sitzung 0. Einige Konfigurationen von XP (z. B. nicht in einer Domäne) erlauben mehrere Benutzersitzungen gleichzeitig und sie erhalten jeweils eine andere Sitzungs-ID, aber die erste bekommt Sitzung 0. Es ist also keine so effektive Überprüfung vor Vista.

Je nachdem, was Sie tatsächlich unterscheiden müssen, funktionieren eine oder beide dieser Prüfungen möglicherweise für Sie.

    
Rob Parker 07.10.2009 00:39
quelle
5

Es gibt keine Möglichkeit, festzustellen, ob Ihre Bibliothek im Kontext eines Dienstes ausgeführt wird oder nicht, obwohl Sie Environment.UserInteractive verwenden können, um eine Vermutung zu treffen.

Aber im Allgemeinen sollte eine Bibliothek niemals von ihrem Anwendungskontext abhängen. Eine Bibliothek sollte Dienste für eine Anwendung bereitstellen, und wenn sie abhängig davon, wie sie aufgerufen wird, unterschiedliche Parameter erfordert, sollte die Anwendung diese Parameter bereitstellen müssen.

Ihre Bibliothek verhält sich wahrscheinlich nicht streng anders, je nachdem, ob sie in einem Service gehostet wird oder nicht, sondern es gibt einige Informationen über die Serviceumgebung oder den Benutzer, über den Ihre Bibliothek informiert werden muss. Die Anwendung sollte die Bibliothek über die notwendigen Bedingungen oder Informationen informieren, die die Bibliothek nicht selbst erraten sollte.

EDIT: Ich würde die Kommentare zu Ihrer Frage auffrischen, wenn ich könnte. Verwenden Sie bei Bedarf überladene Methoden und / oder scheitern Sie einfach, wenn nicht alle erforderlichen Informationen bereitgestellt werden.

    
Stephen Martin 05.01.2009 19:13
quelle
2

Sie sollten wahrscheinlich überprüfen, ob Sie in der Sitzung Null laufen (zumindest wenn Sie Vista als Ziel haben). Sie können WTSRegisterSessionNotification wie in diesem Beispiel verwenden:

%Vor%     
Pierre Arnaud 05.01.2009 19:11
quelle
2

Eine schnelle und schmutzige Methode besteht darin, einen Befehlszeilenschalter auf den Eintrag in der Registrierung unter HKLM \ System \ CurrentControlSet \ services \ MeinService \ ImagePath anzuwenden und dann nach dem Schalter in Ihrer Hauptfunktion zu suchen .

Sie wissen dann, ob Sie von services.exe gestartet wurden oder nicht. Ja, es ist ein Hack.

    
joveha 08.02.2010 23:37
quelle
2

Ein wenig spät zur Party, aber wie wäre es, die Liste der Dienste mit ServiceController.GetServices zu bekommen und die ID Ihres Prozesses gegen diese zu prüfen?

("Wie bekomme ich die Windows-Service-Prozess-ID?": Ссылка )

    
Andrew Morton 25.12.2011 14:29
quelle
1

Eine Möglichkeit besteht darin, sich den Benutzerkontext Ihrer Anwendung anzusehen. Wenn Sie sehen, dass es als Benutzer "SYSTEM" ausgeführt wird, werden Sie als Dienst ausgeführt (oder zumindest mit Berechtigungen auf Dienstebene).

    
Brian 05.01.2009 22:36
quelle
1

Die Antwort von 0xA3 auf Diese Frage enthält tatsächlich C # -Code, um den SCM abzufragen, ähnlich wie Rob Parker in seiner Antwort beschreibt.

    
Tim Keating 24.05.2010 16:32
quelle

Tags und Links