Probleme mit Windows Dienst

  • C#
  • .NET 4.5

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Probleme mit Windows Dienst

    Hi,
    kurz zum Hintergund.
    Wir haben in der Produktion einen Touch PC hängen, an dem Mitarbeiter Maschinen Stillstände in einer Excelliste erfassen.
    Viele dieser Mitarbeiter sind nicht wirklich Firm im Umgang mit dem PC, daher müssen wir es Ihnen so einfach wie möglich machen.
    Ebenso gibt es Mitarbeiter, die gerne mal so PC nutzen um im Internet zu surfen...
    Daher ist der PC so konfiguriert, das beim Starten lediglich Excel gestartet wird.
    Wird Excel beendet, ist kein Zugriff auf das Windows unten drunter möglich und die IT muss dann per Remote Excel wieder starten.
    Daher habe ich mir einen kleinen Dienst erstellt, der prüft ob Excel beendet wurde und dann Excel wieder starten soll.
    Gestalte ich das ganze als Consolenanwendung läuft es ohne Probleme.
    Allerdings habe ich ja dann das Konsolenfenster. wenn dies geschloßen wird, wird Excel wieder nicht gestartet.
    Daher der Dienst.

    Der Dienst selbst hat allerdings Probleme zu starten, es kommt immer ein Timeout.

    Hier mal der Code dazu:
    DienstInstallerKlasse

    C#-Quellcode

    1. using System.ComponentModel;
    2. using System.Configuration.Install;
    3. using System.ServiceProcess;
    4. namespace ProcessMonitoring
    5. {
    6. [RunInstaller(true)]
    7. public class MonitorInstaller :Installer
    8. {
    9. private ServiceInstaller _Service;
    10. private ServiceProcessInstaller _Process;
    11. public MonitorInstaller()
    12. {
    13. _Service = new ServiceInstaller();
    14. _Process = new ServiceProcessInstaller();
    15. _Process.Account = ServiceAccount.LocalSystem;
    16. _Service.ServiceName = "ProcessMonitoring";
    17. _Service.DisplayName = "Process Monitoring";
    18. _Service.Description = "Überwachung eines bestimmten Prozesses und ggf. Neustart nach Beendigung";
    19. _Service.StartType = ServiceStartMode.Automatic;
    20. Installers.Add(_Process);
    21. Installers.Add(_Service);
    22. }
    23. }
    24. }



    ServiceBase

    C#-Quellcode

    1. using System.Diagnostics;
    2. using System.ServiceProcess;
    3. using System.Threading;
    4. namespace ProcessMonitoring
    5. {
    6. public class Monitor : ServiceBase
    7. {
    8. private Process _Process;
    9. public static void Main(string[] args)
    10. {
    11. Run(new Monitor());
    12. }
    13. protected override void OnStart(string[] args)
    14. {
    15. _Process = new Process();
    16. _Process.StartInfo.FileName = "Excel.exe";
    17. _Process.Start();
    18. while (IsRunning())
    19. {
    20. Thread.Sleep(1000);
    21. }
    22. }
    23. bool IsRunning()
    24. {
    25. if (_Process.HasExited)
    26. _Process.Start();
    27. return true;
    28. }
    29. }
    30. }



    Was mach ich denn da falsch?
    "Hier könnte Ihre Werbung stehen..."
    Ein Windows Dienst bekommt eine gewisse Menge Zeit in der OnStart() fertig sein muss. Ist dem nicht der Fall, wird der Dienst von Windows abgesägt.

    Starte in OnStart einen Timer, und prüfe dort alle 1000ms ob der Prozess läuft.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    @EaranMaleasi ich hab das jetzt erst mal in einer ConsolenApp versucht, weil das deinstallieren des Dienstes lästig ist wenn der dienst nicht startet...
    Ich hab mit Sicherheit einen Fehler drinn... es klappt leider nicht.

    C#-Quellcode

    1. class Program
    2. {
    3. private static Process _Process;
    4. static void Main(string[] args)
    5. {
    6. _Process = new Process();
    7. _Process.StartInfo.FileName = "Excel.exe";
    8. System.Timers.Timer t = new System.Timers.Timer(1000);
    9. t.Elapsed += new System.Timers.ElapsedEventHandler(t_elapsed);
    10. t.Enabled = true;
    11. t.Start();
    12. while (IsRunning())
    13. {
    14. Thread.Sleep(1000);
    15. }
    16. //Console.ReadKey();
    17. //Console.ReadKey();
    18. }
    19. static void t_elapsed(object sender, System.Timers.ElapsedEventArgs e)
    20. {
    21. if (!CheckExcel("Excel.exe"))
    22. {
    23. _Process.Start();
    24. }
    25. }
    26. private static bool CheckExcel(string p)
    27. {
    28. return Process.GetProcessesByName(p).Length > 0;
    29. }
    30. static bool IsRunning()
    31. {
    32. if (_Process.HasExited)
    33. _Process.Start();
    34. return true;
    35. }
    36. }
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    und die IT muss dann per Remote Excel wieder starten.
    Genügt es nicht, einfach den Rechner neu zu booten?
    Egal, ob per Reset oder Programm.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany Ja, das geht auch, machen wir dann meist auch weils halt schneller geht.
    Nur arbeiten die Jungs ja im 3 Schichtbetrieb und wenn einer um 23:30 Uhr das Excel schließt, startet das von uns keiner neu :)

    @Nolde Stimmt, da war was :) hab ich geändert.

    Ich hätte auch vorher mal in den Taskmanager gucken sollen, das klappt soweit schon mit dem Dienst.
    Nur startet der Dienst eben den Process Excel.exe aber ohne Fenster ;(

    Wie bekomme ich denn nun das Fenster zu sehen?

    EDIT: der gleiche Code in einer Consolen Anwendung funktioniert einwandfrei. Excel wird gestartet, sobald es beendet wird startet es wieder neu...mit Fenster
    "Hier könnte Ihre Werbung stehen..."
    @NoIde die Einstellung hatte ich im Dienst selbst schon gesetzt.
    Bin bei Google dann auf dies hier gestoßen: https://www.codeproject.com/Articles/4891/Interact-With-Desktop-when-Installing-Windows-Serv leider wird der Eintrag nicht in der Registry geändert.
    Aber auch mit gesetztem Haken bei "Datenaustausch zwischen Dienst und Desktop zulassen" bekomme ich kein Fenster...
    Au mann... ich werd wohl doch erstmal auf die Console zurückgreifen und hoffen das ich mit dem Satz "Dieses Fenster bitte NICHT schließen" weniger Neustarts an der Maschine habe...



    Also, ich hab jetzt alles probiert.
    Als Lokal Dienst mit Interact with Desktop gesetzt = geht nicht, kein Fenster
    Als User mit Username und Kennwort = geht nicht, kein Fenster.
    Hab auch mal andere Programme versucht Notepad, Firefox, eigene exe = keines zeigt ein Fenster.
    Ich gebs auf...



    So, ich hab nun einfach ein KioskMode Programm erstellt.
    Rahmenloses Fenster mit nem Flowlayoutpanel, darin ein Button mit Excel Symbol (eventuell kommen weitere dazu).
    Beendet werden kann es nur mit einem Hotkey.
    Das Programm wird beim Anmelden gestartet (Registryeintrag Shell geändert).
    Mal schauen wie es läuft...

    Drei (!) Posts zusammengefügt. Für nachträgliche Änderungen bitte die „Bearbeiten“-Funktion benutzen! ~Thunderbolt
    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()