2010-02-27 5 views
18

Ich habe einen Windows-Dienst (C#) auf einem Server installiert, der alle 10 Minuten eine ausführbare Datei (C#) startet, um einige Bilder von einem Verzeichnis zu einem anderen zu verarbeiten. Keine Interaktion ist mit jedem Benutzer erforderlich. Da die ausführbare Datei ein Ausgabefenster ist, muss ich das Kontrollkästchen "Dienst mit dem Desktop interagieren" , das als insecure and bad practice angesehen wird, aktivieren, damit der Dienst ausgeführt wird. Wie würde ich mit diesem Problem umgehen? Ich mag die ausführbare Datei von meinem Windows-Dienst getrennt habe, weilAlternative zu "Dienst mit Desktop interagieren"?

  • es einfacher zu debuggen macht und keinen vollständigen Windows-Dienst redeploy erfordern.
  • manchmal verwende ich die gleichen Windows Service, um mehrere ausführbare Dateien in verschiedenen Intervallen (aber alle auf das gleiche Projekt bezogen) zu starten.

EDIT:

Wenn die Interaktion mit dem Desktop nicht aktiviert ist, wird die Konsole-Anwendung korrekt erhält nicht ausgeführt, und die folgenden Fehler angezeigt innerhalb der Windows-Protokolle:

Faulting application myapp.exe, version 1.0.0.0, time stamp 0x4b8304c3, 
faulting module KERNEL32.dll, version 6.0.6002.18005, time stamp 0x49e03821, 
exception code 0xc0000142, fault offset 0x00009eed, process id 0x10ec, 
application start time 0x01cab736950a64b5. 

Einmal Die Desktop-Interaktion ist aktiviert, die Anwendung wird normal ausgeführt.

Irgendwelche Gedanken?

Vielen Dank für Ihre Zeit.

+0

Ist dies für Vista und später? –

+0

Der Debugging-Teil ist kein guter Grund. Sie könnten eine ausführbare Datei und den Dienst beide verwenden eine gemeinsame Assembly, die die gesamte Funktionalität enthält. –

+0

Ja, der Windows-Dienst läuft unter Windows Server 2008 Web Edition. Windows-Dienst und ausführbare Datei werden mit Visual Studio 2008 gegen die mit .NET Framework 3.5 – jdecuyper

Antwort

10

Wenn Sie Vista verwenden und später, und Sie müssen nicht wirklich eine Interaktion mit dem Benutzer, haben aber eine interaktive exe ausführen, sollte die Session 0 isolation feature helfen, einige der Bedenken über die ‚schlechten zu lindern üben, wenn ein Dienst mit dem Desktop interagiert (was in Sitzung 0 keine physische Konsole hat).

Diese Isolierung von Sitzung 0 verhindert, dass unprivilegierte Benutzer Shatter Attacks auf Ihrem Dienst ausführen, wenn sie ihre interaktiven Desktops in verschiedenen Sitzungen abrufen. Shatter-Angriffe sind der Hauptgrund, warum diese "Interaktion mit dem Desktop" als schlechte Praxis angesehen wurde und wenn Sie Vista oder später verwenden, sollte es in Ordnung sein, wenn Sie es nicht vermeiden können (oder zu viel Aufwand dafür ausgeben müssen).

Also, wenn die Dinge gut funktionieren, wie sie sind, sind Sie wahrscheinlich in Ordnung.

Natürlich könnten die Dinge nach einem OS-Update einfach aufhören zu arbeiten, daher ist es wahrscheinlich besser, sich darauf vorzubereiten, die Abhängigkeit von Interaktivität zu verschieben, da Sie sie nicht wirklich brauchen.

+0

Die Isolierung von Sitzung 0 macht sehr viel Sinn und macht mich irgendwie weniger besorgt über die Sicherheitseinflüsse meines Dienstes. Aber wie Sie richtig erwähnt haben, wäre es besser, die Interaktivität wegzulassen. Beim Erstellen des Prozesses habe ich bereits versucht, die Eigenschaften "UseShellExecute" auf "true" und "CreateNoWindow" auf "false" zu setzen, aber der Dienst erfordert weiterhin Interaktion mit dem Desktop. – jdecuyper

+0

Hast du das richtig eingegeben? CreateNoWindow sollte * true * sein und ich denke, UseShellExecute sollte wahrscheinlich falsch sein (obwohl UseShellExecute keine Rolle spielt). – Weeble

+0

Sorry wegen dieses Tippfehlers! CreateNoWindow ist tatsächlich auf "True" festgelegt. – jdecuyper

2

Wenn Sie können, würde ich empfehlen, Ihre ausführbaren Dateien, die die Verschiebung behandeln, um ein Ausgabefenster nicht zu verwenden. Wenn es sich um standardmäßige Konsolenanwendungen ohne Ausgabe handelt, können Sie sie innerhalb eines Dienstes ausführen, ohne dass die Option "Interaktion mit dem Desktop zulassen" erforderlich ist. Dies bietet Ihnen alle Vorteile, ohne dass sich Ihr Service ändert.

+0

Wie würden Sie die Ausgabe der Anwendung entfernen? Wo denkst du über die gleiche Lösung wie Weeble? Vielen Dank. – jdecuyper

+0

Ja, das war im Grunde mein Gedanke. Wenn es sich nur um eine Konsolenanwendung handelt, sollten Sie keine Interaktion mit dem Desktop benötigen. Wenn Sie eine Windows-Anwendung verwenden, wird es jedoch nicht funktionieren ... –

2

Ist der Subprozess nur eine Konsolenanwendung? Ich habe Windows Services nicht geschrieben, aber ich denke, dass es vielleicht ausreicht, den Subprozess ohne ein Fenster zu starten. Verwenden Sie die Überladung von Process.Start, die eine ProcessStartInfo verwendet und ProcessStartInfo.CreateNoWindow auf true setzt.

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

+0

Vielen Dank für Ihren Link. Ich habe es bereits ausprobiert, aber das Kontrollkästchen muss aktiviert sein. – jdecuyper

+0

Leider habe ich im Moment keinen Zugriff auf eine Windows-Maschine. Weißt du, ob der Subprozess startet und dann fehlschlägt oder gar nicht startet? Und ist es eine Konsolenanwendung oder etwas anderes? – Weeble

+0

Es ist eine C# -Konsolenanwendung. Ich habe meine Frage bearbeitet und die Fehlermeldung hinzugefügt, die protokolliert wird. – jdecuyper

4

Ich weiß, das ist ein bisschen spät, aber in diesem Fall würde ich den Taskplaner verwenden und nicht mit dem Windows-Dienst kümmern. Der Aufgabenplaner verfügt über umfassende Planungsoptionen und kann Konsolenanwendungen ohne Probleme ausführen.