Windows Dienst erst nach Anmeldung starten



  • Vielen Dank für die zahlreichen vorschläge. Ich habe es nun hinbekommen, jedoch gibt es noch ein Problem. Und zwar installiere ich den Windows Service mit der SC.exe. Am Anfang dachte ich juhu das klappt ja super aber da die SC.exe auf eine Rückantwort wartet und falls diese nicht kommt den Service abschießt ist dies schlecht für mich. Gibt es eine einfach möglichkeit den Service leicht zu installieren? Denn von .net findet man tausend sachen aber für mich ist da leider nix dabei.

    Vielen Dank



  • Kann ich nicht verstehen dass Du nichts gefunden hast... Aber schau mal hier.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms683500(v=vs.85).aspx



  • Das benutze ich sogar schon aber klappt auch nicht... kann es vlt. daran liegen dass in meinem service ein extra thread aufgemacht wird, der eine dauerschleife beinhaltet?



  • sc.exe wartet auf gar nix, sc.exe macht einfach nur Einträge in der Registry.

    Warten tut der Service-Control-Manager, bei dem muss sich jedes Service melden, sonst ist es kein Service sondern höchstens ein Daemon. Damit wie das Service installiert wird hat das aber nichts zu tun.

    Mr_Einsa schrieb:

    Es ist so ich werde in dem Windows Service einen Prozess starten und dies muss natürlich geschehen, wenn jemand bei Windows angemeldet ist.

    Wieso soll das Service einen Prozess starten wenn ein User angemeldet ist?
    Also erstmal kannst du im Service Prozesse starten wann du willst, dazu muss auch kein User angemeldet sein. Die laufen dann halt in einer hübsch unsichtbaren Window-Station.

    Und wenn du einen Prozess starten willst der mit dem User interagiert ... wieso verwendest du dann überhaupt ein Service?
    Bzw. wieso machst du es nicht so wie es alle machen, und machst "Run" Einträge bzw. Task-Scheduler Jobs um den Teil zu starten der mit dem User interagieren will/soll/muss?
    Wie im übrigen schon vorgeschlagen wurde.

    Und was .NET angeht... Öhm. Es gibt sogar nen eigenen Projekttyp für .NET Services, wo der ganze nötige Boilerplate-Code bereits generiert wird. Viel einfacher geht's nicht. Schwer zu finden ist das Template auch nicht, heisst ja bloss "Windows Service". 😕

    EDIT: oder meinst du mit dem "für mich ist da nix dabei" dass du kein .NET verwenden kannst/willst? Dann würde ich das Template "ATL Project" mit Option "Service" empfehlen. Dadurch bekommt dein Service zwar automatisch ne COM Schnittstelle verpasst, aber das tut ja nicht wirklich weh. Musst du ja nicht verwenden wenn du nicht willst.



  • Da geb ich dir völlig recht hustbaer. Ich kann kein .net verwenden. Jedoch will ich das Programm als Windows Service starten. Wie kann ich denn dem Service-Control-Manager sagen, dass der Service noch aktiv ist? Es wäre wirklich hilfreich wenn ihr mir das erläutert. Oke also der Service wird gestartet und der Service-Control-Manager wartet meist alle 30sec auf ein "ping" von dem Service, aber wie kann ich ihm diesen "ping" zukommen lassen? Denn ich starte den service mit sc create servicename servicepfad start= auto type= interact type= own ... im service selber komm ich in die Main und stell dort meine ServiceMain ein ... in der ich dann einen Thread starte der in einer Dauerschleife etwas ausließt. ich kapier einfach nicht wie ich dem SCM die Antwort schicke ohne meinen Service zu unterbrechen. Die meisten Services schaffen das ja aber wieso meiner nicht 😞



  • Du solltest dringen lernen Dir Informationen zu beschaffen!

    Schau da mal rein. Eigentlich alles was Du wissen musst.
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms685967(v=vs.85).aspx

    Und Speziell diesen solltest Du mal unter die Lupe nehmen.
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms687414(v=vs.85).aspx



  • Vielen Dank für deinen Beitrag. Auf den Seiten war ich schon, ich denke ganz einfach dass mein Englisch zu schlecht ist und ich irgendetwas übersehe. Ich hab berreits mehrere Projekte erstellt mit den unterschiedlichsten Ansätzen. Auch deinen geposteten Ansatz habe ich schon vor Tagen genutzt und bin nicht auf das gewünschte Ergebnis gekommen.

    Also was ich hier: http://msdn.microsoft.com/en-us/library/windows/desktop/ms687414%28v=vs.85%29.aspx
    Entnehme ist, dass ich ich mich zuerst beim ServiceControlHandler Registrieren muss, dann muss ich ihm den derzeitigen ServiceStatus zukommen lassen. Der zuerst SERVICE_START_PENDIN ist, jetzt starte ich mit der Initialisierung... wenn alles gut geht gebe ich dem SCH den SERVICE_RUNNING status. Und jetzt kommt mein Hirngulasch zum einsatz. Und zwar laut dem Beispiel warte ich jetzt so lange, bis der Service den Status annimmt: SERVICE_STOPPED. Und hier denke ich muss innerhalb von 30sec der SCH den status SERVICE_STOPPED erhalten, sonst wird er terminiert.

    Anhand des zweiten links: http://msdn.microsoft.com/en-us/library/windows/desktop/ms685149%28v=vs.85%29.aspx
    habe ich folgenden Text entnommen:

    The control handler must return within 30 seconds, or the SCM returns an error. If a service must do lengthy processing when the service is executing the control handler, it should create a secondary thread to perform the lengthy processing, and then return from the control handler. This prevents the service from tying up the control dispatcher. For example, when handling the stop request for a service that takes a long time, create another thread to handle the stop process. The control handler should simply call SetServiceStatus with the SERVICE_STOP_PENDING message and return.

    Mein Ergebnis: Wenn ich den Service implementiere, und ganz am ende, in meine while-Schleife eintrete, würde es reichen wenn ich ständig alle 5sec einfach nur ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 ); aufrufe. Und so schaffe ich es dass der Service ständig läuft und nicht nach 30sec terminiet wird. Da ich natürlich meine Arbeiten in Threads abarbeite, macht dies meinem Arbeitsfluss nichts aus... lieg ich da richtig?
    Zum Beispiel:

    while(1)
    {
       Sleep(5000);
       ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );
    }
    return;
    


  • Du brauchst gar nix periodisch aufrufen.
    Die Callback-Funktion über die der SCM dir Steuerkommandos schickt darf bloss nicht zu lange brauchen, das ist das wo die 30 Sekunden herkommen.


  • Mod

    Dann werfe ich noch mal einen Artikel ins Feld:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ee126211(v=vs.85).aspx

    Wenn es zu lange dauert kann man dem SCM auch den "Fortschritt" mitteilen und ihm sagen wie lange die nächste Operation dfauert bis zum Statuswechsel....

    Es gibt doch x Grundgerüste für Services. Warum benutzt Du keines davon?



  • So mal ein Update... vielen Dank für eure Hilfe, nun funktioniert alles einwandfrei.

    Mein Problem war es die ganze Zeit, dass ich eine Funktion hatte die den Service blockierte ... *selberkopfeinhau* und somit war es klar das ich ständig Probleme hatte. Aber zu guter letzt habe ich dies behoben und das Ding rennt einwandfrei.


Anmelden zum Antworten