Warum können Windows-Dienste keine GUI haben?

22

Ich habe diese Funktion in früheren Windows-Versionen wie XP und NT verwendet. Ich konnte eine GUI von einem Windows-Dienst ausführen. In späteren Versionen ist dies jedoch nicht möglich.

Was ist der Grund für das Entfernen dieser Funktion? Warum können Windows-Dienste keine GUI haben?

Arun
quelle

Antworten:

47

Hauptsächlich aus Sicherheitsgründen.

Wie ich es verstehe, wenn ein Windows - Dienst GUI - Controls wie eine MessageBox erzeugt wurden sie in der Regel nur in der Session zu sehen , dass die Dienste läuft in dh Sitzung 0 , die auch verwendet lokal oder von jemandem Logging protokolliert auf dem ersten Benutzer sein über die Verwendung mstsc / admin. Daher würde dieser Benutzer diese Steuerelemente sehen und könnte mit dem Dienst interagieren.

Aus Sicherheitsgründen ist Sitzung 0 jetzt reserviert und der erste Benutzer, der sich anmeldet, erhält eine neue Sitzung und sieht daher die GUI-Steuerelemente nicht.

Da dies viele Dienste beeinträchtigt, gibt es aus Kompatibilitätsgründen einen Prozess (siehe dieses MSDN-Blog) , der versucht, festzustellen, ob Nachrichten angezeigt werden, und mit der Warnung 'Ein auf diesem Computer ausgeführtes Programm versucht, eine Nachricht anzuzeigen 'und ermöglicht das Anzeigen oder Ignorieren der Nachricht.

Microsoft hat ein WhitePaper zu diesem Thema, das Sie hier herunterladen können

Ich würde auch vermuten, dass ein weiterer geringfügiger Grund darin besteht, dass das Feature missbraucht / missverstanden wurde und zu schlechten Designs führte. Ich hatte zum Beispiel einen alten Server mit einem Drittanbieter-Service, der einige Benachrichtigungen / Fehler über ein Meldungsfeld anzeigte, anstatt in das Ereignisprotokoll zu schreiben. Ich habe mich jedoch nie lokal und selten im Administratormodus angemeldet und daher die Nachrichten nicht angezeigt.

sgmoore
quelle
1
Ich habe das Gefühl, es hat etwas mit der Benutzerkontensteuerung zu tun - Sicherung bedeutet, dass die Benutzerkontensteuerung keine Arbeitsstationssitzung für den interaktiven Benutzer freigibt oder dass ein Hacker selbst vorgibt, die Benutzerkontensteuerung zu sein.
gbjbaanb
23

Früher waren interaktive Dienste möglich , aber das Dienstmodell ist das eines Prozesses, der unabhängig von einem Benutzer ausgeführt wird. Sie sollen unbeaufsichtigt ausgeführt werden und sollten daher keine GUI benötigen.

Interaktive Dienste sind seit Windows Vista nicht mehr verfügbar und sollten daher nicht mehr verwendet werden.

Wenn Sie mit dem Dienst interagieren müssen, empfiehlt die Seite, auf die ich verlinkt habe, die Erstellung einer separaten GUI-Anwendung, die mit dem Dienst über IPC (Interprocess Communication) kommuniziert, z. B. Named Pipes.

ChrisF
quelle
Ihr Geschmack ist veraltet: Dienste können ab Windows Vista nicht direkt mit einem Benutzer interagieren. Daher sollten die im Abschnitt Verwenden eines interaktiven Dienstes genannten Techniken nicht in neuem Code verwendet werden.
Nemke
10

Weil Dienste im Hintergrund ausgeführt werden sollen, ohne mit dem Benutzer zu interagieren. Sie können tatsächlich ausgeführt werden, solange kein Benutzer angemeldet ist.

Michael Borgwardt
quelle
Warum gab es diese Funktion dann in früheren Versionen? In Anbetracht Ihrer Antwort findet keine Kommunikation zwischen dem Windows-Dienst und der Desktop-Anwendung statt. Diese Antwort könnte also nicht angemessen sein.
Arun
3
@Arun - basierend auf dieser Logik werden Dinge, die kaputt sind, niemals repariert. Michaels Antwort ist richtig - Services sollten keine Guis haben. Nur weil frühere Versionen von Windows sie hatten (Dienste mit GUIS), heißt das nicht, dass sie sie hätten haben sollen .
8
@Arun es stimmt nicht, dass es keine Kommunikation zwischen Desktop-Apps und Diensten gibt, nur, dass der Dienst selbst keine GUI hat. Vielmehr verfügt eine Desktop-App über die GUI und kommuniziert mit dem Server.
Paul Hiemstra
So können Windows-Dienste GUI haben, aber sie sollten sie nicht haben?
Arun
1
@Arun, Dienste haben selbst keine GUIs, werden jedoch häufig von separaten Front-End-Anwendungen gesteuert, die den Dienst steuern können, indem sie auf irgendeine Weise (über Named Pipes, Sockets, ...) mit ihm kommunizieren.
GrandmasterB
0

Ja, es war möglich und es hat funktioniert. Beim Einloggen haben Sie die Oberfläche der Anwendung erhalten. Es war sehr nützlich für ältere Anwendungen, die keinen Dienst zur Verfügung haben, aber dennoch auf dem Server ausgeführt werden müssen. Es war jedoch nicht die stabilste Lösung. Es wurde als der Benutzer ausgeführt, der darauf klicken oder sich abmelden konnte. Das war nicht sehr nett.

Jetzt entwickelt jeder native Dienste und fügt eine Anwendung oder ein Protokoll hinzu, um den Dienst zu verwalten. Das ist ein gutes Entwurfsmuster und wird jetzt die meiste Zeit verwendet.

Sehen Sie es eher als Vermächtnis, dass es möglich war.

Luc Franken
quelle
-1

Die Dienste sind für unbeaufsichtigte Vorgänge gedacht, hauptsächlich im Hintergrund. Der Namensdienst selbst fungiert als Server für einige Clientanwendungen oder andere Dienste, die diesen Dienst in Anspruch nehmen. Daher möchten MS möglicherweise jetzt die Grundlagen einhalten und eine klare Unterscheidung zwischen Diensten und Apps treffen. Apps beschäftigen die Benutzer und lassen Dienste ihren Zweck stillschweigend erfüllen. Während Nagelschneider gibt es, warum für Küchenmesser gehen, um Nils zu schneiden?

Tony Thomas
quelle