Wie kann ein Windows-Dienst einen Prozess starten, wenn ein Timer-Ereignis ausgelöst wird?

7

Ich habe einen Windows-Dienst mit Timer erstellt und im fire-Ereignis von timer.Elapsed erstelle ich einen Prozess ( System.Diagnostics.Process.Start(exe path) ) im Intervall von 5 Sekunden. Dieser Prozess wird jedoch nicht beim Auslösen eines Ereignisses erstellt.

Gibt es eine andere Möglichkeit, dies zu tun?

Vielen Dank im Voraus.

%Vor%     
Sahil Verma 23.12.2010, 05:46
quelle

4 Antworten

19

Sie fügen Beschreibungen des Problems in den Kommentaren hinzu, während Sie davon ausgehen, dass das zu Beginn hilfreich gewesen wäre. Der Grund, dass Sie sehen können, dass der Prozess gestartet wurde, aber kein Fenster geöffnet wird, liegt an Sicherheitsmodelländerungen, die an Windows Services unter Windows Vista und höher vorgenommen wurden. Sie haben es noch nicht speziell erwähnt, aber ich habe den starken Verdacht, dass Sie versuchen, dies unter einem dieser Betriebssysteme auszuführen. Das eigentliche Problem ist nicht einen Prozess zu starten, es zeigt eine Benutzeroberfläche.

Was Sie erreichen möchten, ist ein "Interaktiver Dienst" , der ist eine, die direkt mit dem Benutzer und dem Desktop interagieren kann (z. B. ein Fenster oder einen Dialog anzeigen).
Wenn Sie Windows XP verwenden (und Ihr Dienst wird nur immer ) em> muss unter Windows XP ausgeführt werden), können Sie den Anweisungen in diesem Artikel folgen, damit Ihr Dienst im interaktiven Modus ausgeführt werden kann. Dadurch können Sie das Adobe Acrobat-Anwendungsfenster wie erwartet anzeigen. Wie diese Dokumentation jedoch auch angibt, funktioniert diese Funktion unter Windows Vista und höher nicht:

  

Wichtig Dienste können ab Windows Vista nicht direkt mit einem Benutzer interagieren.   Daher die Techniken, die im Abschnitt Verwenden eines interaktiven Dienstes erwähnt werden   sollte nicht in neuem Code verwendet werden.

Genauer gesagt wurden in diesen Versionen Änderungen an der Ausführung von Diensten und Anwendungen vorgenommen. Dienste werden jetzt vom System in Sitzung 0 isoliert, während Anwendungen in anderen Sitzungen ausgeführt werden. Dies dient dazu, Dienste von Angriffen zu isolieren, die aus Anwendungscode stammen. Daher wird keine Benutzeroberfläche, die von einem Dienst angezeigt wird, für jeden Benutzer auf dem System sichtbar sein, einschließlich einer einfachen Nachrichtenbox. Sie können das Whitepaper, in dem diese Änderungen erläutert werden, hier lesen. Wenn Sie eine visuellere Person sind, beziehen Sie sich auf das folgende Diagramm, das das neue Modell veranschaulicht, und beachten Sie dabei besonders die Trennlinien:

Das Ergebnis ist, dass Sie diese Lücke nicht verwenden können, wenn Sie auf diese Versionen abzielen oder diese Versionen möglicherweise als Ziel haben. Ich sage "Schlupfloch", denn die Schlussfolgerung ist, wie ich bereits in einem Kommentar erwähnt habe, dass Windows Services nicht interaktiv sein sollen . Was Sie hier versuchen, läuft dem Zweck und dem Design eines Dienstes zuwider. Es wurde vorher nicht empfohlen, und jetzt funktioniert es überhaupt nicht. Wenn Sie diese spezielle Funktionalität benötigen, sollten Sie eine andere Art von Anwendung erstellen. Windows Forms und WPF sind für Anwendungen im Benutzermodus vorgesehen, und beide können Prozesse starten und bei Bedarf neue Fenster öffnen. Ich empfehle dringend, dass Sie stattdessen zu diesem Stil der Anwendung konvertieren.

    
Cody Gray 23.12.2010 06:54
quelle
0

Da Sie keinen Prozess zum Anzeigen der Benutzeroberfläche vom Dienst erhalten, empfehle ich, den Hilfsprozess auszuführen, wenn sich der Benutzer anmeldet und den Prozess von dort startet.

    
Daniel Mošmondor 23.12.2010 08:06
quelle
0

Mir ist klar, dass ich zu spät zu dieser Party komme. Aber da diese Frage bei meiner Suche nach einer Lösung auftaucht, werde ich eine Antwort auf die Frage des OP geben.

Sie können ein Programm von einem Dienst mit CreateProcessAsUser starten, indem Sie das Token des angemeldeten Benutzers verwenden. MSDN bietet eine nette Beispiel-App, die das demonstriert; Suchen Sie nach CSCreateProcessAsUserFromService: Ссылка

Ich habe es versucht, und es funktioniert. Ich bin in der Lage, einen neuen Prozess für meine vorhandene .NET-Anwendung von einem Dienst zu erstellen, und es funktioniert einwandfrei. Ich habe die Eigenschaften des Diensts für die Anmeldung auf das Konto "Lokales System" festgelegt, aber die Option "Interaktion mit dem Desktop zulassen" deaktiviert. Meine Anwendung wird nach Ablauf des Timers erstellt und funktioniert wie beim normalen Start, einschließlich GUI-Präsentation und Benutzerinteraktion.

Ob das eine unangemessene oder unerwünschte Sache ist, ist eine andere Diskussion. Aber es ist tatsächlich möglich und wirklich nicht so schwierig.

    
Gary Burgess 10.07.2015 15:08
quelle
0

Es gibt eine Art von Arbeit, aber ich würde empfehlen, dies nur zu tun, wenn Sie SICHERHEITSHINWEIS ZU AKZEPTIEREN!

Dies könnte die Antwort auf Ihr Problem sein: CreateProcessAsUser .

Das Beispiel demonstriert, wie ein Prozess in der Sitzung des angemeldeten Benutzers über eine in C # .Net geschriebene Dienstanwendung interaktiv erstellt / gestartet wird.

    
Carsten Schildknecht 12.08.2015 14:19
quelle