Kann man einen Dienst aus einem Dienst starten/installieren?
-
So mein ich das ja nicht!
Ich will ja aus einem selbst geschriebenen Dienst einen zweiten starten oder noch besser installieren.
Wenn du meine Beispiele anguckst(z.B. bei der MSDN-Variante), dann musst du dir 2 SvcMains vorstellen. Die Konsolenanwendung starten den ersten Dienst, der dann den anderen Dienst installiert. So hab ich mir das gedacht.
-
Warum soll das nicht gehen?
Soweit der erste Dienst die entsprechenden Rechte hat.
Wo der Code für die Installation oder das starten des Dienstes läuft ist doch wurscht.
-
Hmm ok, könnt ihr mir nen Codebeispiel oder Tutorial geben, denn meine Versuche komplett fehlgeschlagen sind.
-
Heron schrieb:
So mein ich das ja nicht!
Doch, tust du, du verstehst nur anscheinend nicht was ich schreibe.
Ich will ja aus einem selbst geschriebenen Dienst einen zweiten starten oder noch besser installieren.
No dann mach das doch einfach.
(BTW: "einen zweiten Dienst starten" ist im übrigen genau das was du mitsystem("net start Dienstname")
erreichst - wenn es auch wie gesagt vielleicht nicht die "schönste" Lösung ist. Und installieren könntest du theoretisch mitsystem("sc create (...)")
.)Wenn du meine Beispiele anguckst(z.B. bei der MSDN-Variante), dann musst du dir 2 SvcMains vorstellen.
Ja es gibt verschiedene Varianten wie du das umsetzen kannst.
* eine .exe mit unterschiedlichen Services die sogar im selben Prozess laufen
* eine .exe mit unterschiedlichen Services die in unterschiedlichen Prozessen laufen
* mehrere .exen mit je einem Service
(Theoretisch müsste sogar eine DLL gehen, als .exe könnte man dannrundll32.exe
verwenden - mit den passenden Command-Line Parametern halt)Hmm ok, könnt ihr mir nen Codebeispiel oder Tutorial geben, denn meine Versuche komplett fehlgeschlagen sind.
Lol, ne, sorry.
Beispiele gibt's doch genug im Netz, richte dich nach denen.
Du musst bloss noch den Teil der ein Service registriert aus dem Code des anderen Service heraus aufrufen.
Wenn du dabei auf konkrete Probleme stösst, dann kannst du gerne konkrete Fragen stellen.Aber einfach so "zeigt mal wie das geht" - ne, ich glaube dazu wird hier wohl keiner Lust haben. Sind ja doch mehr als 5-10 Zeilen Code.
-
Hmm sry, aber ich kann mir nicht vorstellen, dass das so funktioniert, wenn ich nur eine .exe habe. Vielleicht hab ich auch nur nen fetten Denkfehler, dann tut es mir leid. Du meinst also, ich soll die beiden Dienste eintragen lassen und so weiter, und dann mit system() dem ersten starten und damit in dem ersten den zweiten installieren?Ok , so probier ichs mal aus. Wenns funktioniert, entschuldige ich mich jetzt schon mal für meine Dämlichkeit
-
Ich habe das Gefühl, Du hast Dir nicht mal angesehen, wie ein Service installiert oder gestartet wird.
http://www.codeproject.com/Articles/16488/A-Windows-Service-Application
Wo soll das Problem sein in einer EXE 20 Dienste zu starten, installieren, ja sogar zu hosten?
-
Das ich mehrere Dienste in einer Anwendung laufen lassen kann, weiss ich ja jetzt. Und das ich mir das angesehen habe, sieht man an meinen Beispielen, vielleicht hab ich sie aber falsch verstanden.
Ich habe mir mal die system()-Befehle ("sc create") anguckt. Das ist im Grunde nichts anderes als CreateService().
Also, zum Starten hab ich einen SERVICE_TABLE_ENTRY erstellt und dann mit StartServiceCtrlDispatcher(), den Dienst starten wollen, wie in dem MSDN Beispiel.Hab mir Martins Beispiel angeschaut, das meiner Methode ähnelt, nur dass ich ich nicht StartService() genommen habe und da liegt auch mein Problem, oder?? Ich stell das Beispiel mal heute Abend nach.
-
Heron schrieb:
Das ich mehrere Dienste in einer Anwendung laufen lassen kann, weiss ich ja jetzt. Und das ich mir das angesehen habe, sieht man an meinen Beispielen, vielleicht hab ich sie aber falsch verstanden.
Ich habe mir mal die system()-Befehle ("sc create") anguckt. Das ist im Grunde nichts anderes als CreateService().Ja.
Also, zum Starten hab ich einen SERVICE_TABLE_ENTRY erstellt und dann mit StartServiceCtrlDispatcher(), den Dienst starten wollen, wie in dem MSDN Beispiel.
Du hast den Ablauf hier nicht verstanden.
StartServiceCtrlDispatcher() startet nicht das Service, sondern ist nötig das mit das Service mit dem Service Control Manager kommunizieren kann.
Es ist nötig damit das Service dem Service Control Manager seinen Status mitteilen kann.http://msdn.microsoft.com/en-us/library/windows/desktop/ms686324(v=vs.85).aspx
Allgemein kannst du das Service aus deinem Programm nicht starten (bzw. es kann sein dass man kann, keine Ahnung, aber man tut es auf jeden Fall nicht). Services starten tut nur der Service Control Manager. Du kannst aber den Service Control Manager bitten das Service zu starten.
Also der Ablauf ist normalerweise dieser:
* X: bittet den Service Control Manager ein Service zu starten
* Service Control Manager: startet den Service-Prozess
* Service-Prozess: meldet sich beim Service Control Manager an
* Service-Prozess: teilt irgendwann dem Service Control Manager den Status "running" mitHab mir Martins Beispiel angeschaut, das meiner Methode ähnelt, nur dass ich ich nicht StartService() genommen habe und da liegt auch mein Problem, oder?? Ich stell das Beispiel mal heute Abend nach.
Ja, vermutlich.
-
Heron schrieb:
Und das ich mir das angesehen habe
Beispielprogramme suchen und überfliegen und ernsthaft Doku lesen und versuchen sie zu verstehen sind zwei Paar Schuhe.
-
Ok Leute, ich hab es jetzt hinbekommen.
Und vielen Dank für eure Hilfe, aber hustbaer, solche Kommentare kannst du dir sparen. Das nervt nur.