Wie kann ein Windows-Dienst, der einen Prozess startet, wenn ein Timer-Ereignis ausgelöst wird?
Habe ich einen Windows-Dienst mit Timer und in-firing-event der timer.Elapsed
ich bin erstellen eines Prozesses (System.Diagnostics.Process.Start(exe path)
) im Intervall von 5 Sekunden. Aber dieser Prozess nicht erstellt werden, auf das feuern eines Ereignisses.
Gibt es eine andere Möglichkeit, dies zu tun?
Vielen Dank im Voraus.
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Process pr = new Process();
pr.StartInfo.FileName = @"C:\Program Files\Messenger\msmsgs.exe";
pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
pr.StartInfo.CreateNoWindow = false;
pr.Start();
}
- Oder wird Sie erstellt und dann sofort verlassen? Wenn Sie einfügen können den code hier, es wäre hilfreich
- Windows-Dienste sind nicht geeignet, um interaktive Anwendungen. Sie können die Ausführung eines Prozesses, sondern immer ein neues Fenster zu öffnen, ist eine heikle Angelegenheit. Nicht zu erwähnen, alle Sicherheit Probleme, die Sie ausführen, in Ihrem Versuch, dies zu tun. Die Chancen sind, müssen Sie überdenken Ihren Entwurf und verwenden Sie etwas anderes als ein Windows-Dienst, vor allem, wenn Ihr Ziel-Benutzer unter Windows Vista oder später in Anbetracht seiner verschärfte Sicherheit Modell für Dienstleistungen.
- Auch finden Sie mögliche Duplikate von hier: stackoverflow.com/questions/677874/... (die Diskussion, wie Sie können, heben den service auf unter anderen Anmeldeinformationen ausführen und/oder im interaktiven Modus (Hinweis: dies ist nicht unterstützt unter Vista oder höher)).
- vielen Dank Cody, u Kann mir sagen, was getan werden kann, zu führen .exe-Datei aus dem timer-Ereignis??
- Die Idee ist, Sie kann nicht... ich weiß nicht, was unklar war zu meiner früheren Erklärung.
- Haben Sie versucht, um den service der interaktiven? Auch überprüfen Sie mit dem task-manager, ob der Prozess wird gestartet aber nicht angezeigt. msdn.microsoft.com/library/default.asp?url=/library/en-us/...
- im task-manager, Prozess läuft, aber es ist nicht eröffnet.
- Dieser arbeitete im Juni 2019 in Visual Studio mit ein .NET 4.7.2 Anwendung: code.msdn.microsoft.com/windowsapps/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist hinzufügen von Beschreibungen des Problems in den Kommentaren, wie Sie gehen entlang, die hilfreich gewesen wäre zu wissen, von Anfang an. Der Grund, dass Sie sehen können, der Prozess hat begonnen, aber die Fenster nicht immer wird eröffnet ist, weil der security-Modell änderungen vorgenommen wurden, die Windows-Dienste unter Windows Vista und höher. Du hast es nicht erwähnt speziell noch nicht, aber ich habe den starken Verdacht, dass Sie versuchen, führen Sie diese unter einem dieser Betriebssysteme. Das eigentliche Problem ist nicht das starten eines Prozesses, zeigt die UI an.
, Was Sie versuchen zu erreichen, wird als ein "Interaktive Dienst", das ist eine, die erlaubt die direkte Interaktion mit dem Benutzer und den desktop (d.h., zeigen Sie ein Fenster oder einen dialog).
Wenn Sie Windows XP (und Ihr Dienst wird nur immer laufen unter Windows XP), können Sie Folgen Sie den Anweisungen in diesem Artikel, um zu ermöglichen, Ihren Dienst für die Ausführung im interaktiven Modus, die Ihnen erlauben, um den Adobe Acrobat-Anwendung Fenster, wie Sie es erwarten. Aber, wie die Dokumentation zeigt auch an, diese Funktion funktioniert nicht unter Windows Vista und höher:
Genauer gesagt, in diesen Versionen, änderungen wurden vorgenommen, um, wie Dienste und Anwendungen ausgeführt werden. Dienstleistungen sind nun isoliert das system in Session 0, während Anwendungen ausgeführt werden, die in anderen Sitzungen. Dies ist beabsichtigt, um zu isolieren services vor Angriffen, die Ihren Ursprung in der Anwendung code. Daher keine Benutzeroberfläche angezeigt, die von einem service wird immer sichtbar sein, um alle Benutzer auf dem system, einschließlich eine einfache message-box. Sie können Lesen Sie das white paper erklärt, dass diese änderungen im detail hier. Wenn Sie ein eher visueller Mensch, siehe folgende Abbildung illustriert das neue Modell, unter besonderer Berücksichtigung der Trennlinien:
Das Ergebnis ist, dass wenn Sie eine Ausrichtung auf jene Versionen, oder jemals brauchen könnte, um gezielt die Versionen, die Sie nicht verwenden können, diese Lücke. Ich sage "Schlupfloch", denn unter dem Strich, wie ich bereits erwähnt in einem Kommentar, ist, dass Windows-Dienste sind nicht vorgesehen, um interaktive. Was Sie versuchen zu tun, hier läuft im Gegensatz zu den Zweck und design des Dienstes sind. Es war nicht empfehlenswert, vor, und jetzt ist es flach geht gar nicht. Wenn Sie diese bestimmten Funktionen haben, sollten Sie eine andere Art der Anwendung. Sowohl Windows Forms und WPF sind vorgesehen für user-mode-Anwendungen, und beide Prozesse starten und neue Fenster öffnen wie nötig. Ich empfehle, dass Sie konvertieren, um diese Art der Anwendung statt.
SetWindowsHookEx
?Da Sie nicht bekommen, einen Prozess zu zeigen, UI von dem service, den ich empfehlen, dass Sie führen die Helfer-Prozess, wenn der Benutzer anmeldet, und starten Sie Ihren Prozess aus.
Merke ich, ich bin ein wenig spät zu dieser party. Aber da diese Frage kam in meiner Suche nach einer Lösung, ich werde eine Antwort an den OP ' s Frage.
Können Sie ein Programm starten, die von einem Dienst mit CreateProcessAsUser mit dem token des angemeldeten Benutzers. MSDN stellt ein schönes Beispiel-app demonstriert dies, sich CSCreateProcessAsUserFromService:
https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content
Ich es versucht, und es funktioniert. Ich bin in der Lage, erstellen Sie einen neuen Prozess für meinen bestehenden .NET-Anwendung von einem Dienst, und es funktioniert Prima. Ich habe die service-Protokoll Auf Eigenschaften der Lokalen System-Konto, ließ aber die "Allow service to interact with desktop" deaktiviert. Meine Anwendung wird erstellt, wenn der Zeitgeber abläuft, und funktioniert genauso, wie wenn normal gestartet, einschließlich GUI-Darstellung und Benutzerinteraktion.
Ob dies eine unzulässige oder unerwünschte Sache zu tun, ist eine andere Diskussion. Aber es ist tatsächlich möglich, und wirklich gar nicht so schwer.
Es ist eine Art umgehen, aber ich würde Beratung tun Sie dies nur, wenn SIE SICHER SIND, ZU AKZEPTIEREN, DIE FRAGE der SICHERHEIT!
Könnte dies die Antwort auf dein Problem:
CreateProcessAsUser.
Das Beispiel veranschaulicht, wie erstellen/einen Prozess starten, die interaktiv in die Sitzung des angemeldeten Benutzer aus Dienst-Anwendung geschrieben, in C#.Net.