Was kann ein C-Dienst (Windows-Dienst) nicht, was ein normales C-Programm kann?
-
Ich hab ein Programm geschrieben, dass vor dem Einloggen bereits ausgeführt werden soll. Also quasi ein Dienst (Service)
Hab dazu mittels srvany mein exe Programm als Dienst eingebunden, damit es gleich nach Hochfahren, noch vor dem Einloggen startet.
In meinem Programm kommt eine MessageBox gleich in WM_CREATE -> Messagebox kam nicht
Mein Programm reagiert mittels GetAsyncKeyState auf Tasten -> egal welche Tasten ich vor dem Einloggen drücke, sie kommen im Programm nicht an
Dann hab ich nur mal versucht, im WM_CREATE eine Datei auf C: zu erzeugen -> siehe da, die Datei wurde erzeugt. Also zumindest mal ein Lebenszeichen von meinem Programm. Ich hatte schon Sorgen, dass mein Programm völlig kalt bleibt.Dann hab ich noch in mein Programm eingebaut, dass bei der Taste "A" eine MessageBox erscheint.
Als Dienst bei Systemstart eingebunden, kommt wie gesagt keine Messagebox
Im eingeloggten Windows manuell auf die prog.exe geklickt, kommen bei A-Tastendrücken Messageboxen (so wie es ja auch eigentlich sein sollte)
ABER: Jetzt kommts
meine prog.exe als Dienst bei Systemstart gestartet, ich logge mich in Windows ein, und drücke dann bei fertig gestartetem Desktop im Normalebetrieb ein A und es folgt KEINE Messagebox!Wie ist das zu verstehen? Dass die Messageboxen bei Systemstart nicht durchgekommen sind, haben meinem Programm so zugesetzt dass es dann nachher im normalen Windowsbetrieb auch nicht mehr will? (also ganz vereinfacht ausgedrückt)
Also worauf muss ich bei einem Dienst achten, was kann ein Dienst nicht?
Grafische Oberflächen? Messageboxen? Timer? Tastendrücke? Tastaturausgaben/Eingaben? Filebearbeitung?
-
Soweit ich das noch in Erinnerung hab, können Dienste nicht mit der graphischen Oberfläche arbeiten (dafür sind sie auch gar nicht gedacht). Wenn du das Programm aber als normalen Prozess startest, funktioniert das ganze natürlich.
Bei Input bin ich mir aber nicht sicher. Was sollte dein Programm denn beiGetAsyncKeyState
machen? Eine MessageBox anzeigen?
-
devkid schrieb:
Soweit ich das noch in Erinnerung hab, können Dienste nicht mit der graphischen Oberfläche arbeiten (dafür sind sie auch gar nicht gedacht). Wenn du das Programm aber als normalen Prozess startest, funktioniert das ganze natürlich.
Bei Input bin ich mir aber nicht sicher. Was sollte dein Programm denn beiGetAsyncKeyState
machen? Eine MessageBox anzeigen?ok grafische Oberfläche braucht es eigentlich nicht, aber die anderen Sachen wie Tastaturinput wären wichtig.
Es soll auf GetAsyncKeyState reagieren können und zb. eine MessageBox aufpoppen lassen.Im Dienst hab ich übrigens das Kästchen "Interaktivität mit Benutzeroberfläche" angehakt.
Ich starte das Programm indem ich srvany als Dienst starte und mein Exe-Programm als Parameter mitschicke.
Mit dem Tool ExeToSrv läuft es ähnlich. Ich starte ExeToSrv als Dienst und geb als Parameter mein Exe-Programm mit.Oder fallen aufgrund der Verbindung mit diesen "Wirt-Programmen" srvany und exetosrv einige "Spezialfunktionen" wie MessageBox flach?
Und warum funktionieren diese "Spezialfunktionen" dann nachher dann bei fertig geladenem Desktop auch nicht mehr, wo sie ja ansonst ganz normal funktionieren würden?
-
Hast du diese Häkchen für "Interaktivität mit Benutzeroberfläche" bei dem Wirtsprogramm oder bei deinem Dienst gesetzt? Oder gab es da nur eins von beiden? Möglicherweise fällt die "Interaktivität mit Benutzeroberfläche"-Option durch die Wirtsprogramme ja auch ganz unter den Tisch, wodurch dann wieder keine Interaktion mit der graphischen Oberfläche möglich wäre.
Und Input sollte eigentlich auch von einem normalen Desktop-Programm übernommen werden, nicht von einem Dienst. Wenn das OS gerade bootet kann man schlecht Tastatur- und Maus-Eingaben abfangen.
Und wie gesagt, wenn du das Programm als normale Exe startest, hat es eben die Möglichkeit mit der GUI zu arbeiten und funktioniert "normal".
-
devkid schrieb:
Hast du diese Häkchen für "Interaktivität mit Benutzeroberfläche" bei dem Wirtsprogramm oder bei deinem Dienst gesetzt? Oder gab es da nur eins von beiden? Möglicherweise fällt die "Interaktivität mit Benutzeroberfläche"-Option durch die Wirtsprogramme ja auch ganz unter den Tisch, wodurch dann wieder keine Interaktion mit der graphischen Oberfläche möglich wäre.
Ja so in der Art, nur beim Wirtprogramm! Ich melde mich heute Nacht nochmal wenn ich im Nachtdienst bin, dann mache ich genaue Screenshots wie das mit den Zusammenhängen Wirtprogramm, meiner Exe usw. aussieht.
ich habe gestern übrigens noch probiert meine EXE als geplanten Tast, als Administrator ausgeführt, bei Systemstart auszuführen. Selbes Ergebnis: Fileoperationen werden schon vor dem Einloggen ordnungsgemäß durchführt, Tastaturinteraktion wird ignoriert
-
Ein Dienst kann keinerlei Tastatureingaben bekommen!
Ein Dienst hat keine Verbindung zu einem Desktop. Das Ding mit dem Interaktiven Dienst geht noch bis XP, seit Vista und WS2008 gibt es diese Funktion nicht mehr!
Einziger Trick: Du baust ein Frontend Modul, das separat gestartet wird und mit dem Service per IPC Kontakt aufnimmt.Was willst Du bei einem Dienst mit Tastatureingaben?
-
Martin Richter schrieb:
Was willst Du bei einem Dienst mit Tastatureingaben?
Keylogger basteln?
-
devkid schrieb:
Hast du diese Häkchen für "Interaktivität mit Benutzeroberfläche" bei dem Wirtsprogramm oder bei deinem Dienst gesetzt? Oder gab es da nur eins von beiden? Möglicherweise fällt die "Interaktivität mit Benutzeroberfläche"-Option durch die Wirtsprogramme ja auch ganz unter den Tisch, wodurch dann wieder keine Interaktion mit der graphischen Oberfläche möglich wäre.
So sieht das bei den Diensten aus, Dienstname: TAST_X,
hinterlegtes Programm: srvany.exe (<--Wirtprogramm)
http://img212.imageshack.us/img212/7383/dienstexj6.jpgSo sieht das ganze in der Regedit aus:
http://img338.imageshack.us/img338/2344/reg1tn3.th.jpgUnd hier im Schlüssel Parameters, gibts eine Variable Application, wo das eigentliche EXE-Programm hinterlegt ist:
http://img71.imageshack.us/img71/3996/reg2up5.th.jpgIm Taskmanager läuft dann beides: srvany.exe und tast_x.exe
devkid schrieb:
Und Input sollte eigentlich auch von einem normalen Desktop-Programm übernommen werden, nicht von einem Dienst. Wenn das OS gerade bootet kann man schlecht Tastatur- und Maus-Eingaben abfangen.
Naja, gebootet hat es ja dann schon.
Zu sehen ist leerer Desktophintergrund mit Loginmaske
-
Martin Richter schrieb:
Ein Dienst kann keinerlei Tastatureingaben bekommen!
Ein Dienst hat keine Verbindung zu einem Desktop. Das Ding mit dem Interaktiven Dienst geht noch bis XP, seit Vista und WS2008 gibt es diese Funktion nicht mehr!
Einziger Trick: Du baust ein Frontend Modul, das separat gestartet wird und mit dem Service per IPC Kontakt aufnimmt.IPC.. da läuten bei mir ein paar Glocken! Ich erinner mich zurück an die Schulzeit, Pipes, Semaphore, WaitingForSingleObject usw. Das krieg ich denk ich hin.
Aber unter Frontend Modul kann ich mir leider gar nichts vorstellen. Also was Frontend bedeutet schon, aber wie man so ein Modul erstellt und einbaut. Kann mir das bitte jemand kurz beschreiben, oder einen Link nennen? Hab auf anhieb keine brauchbaren Suchergebnisse gefunden.
Martin Richter schrieb:
Was willst Du bei einem Dienst mit Tastatureingaben?
Das Tool soll den Anwender bei der Benutzeranmeldung unterstützen.
-
Vanillekipferl schrieb:
Das Tool soll den Anwender bei der Benutzeranmeldung unterstützen.
Das wirst Du mit einem Service nicht hinbekommen.
-
Mit der von dir angesprochenen Realisierung würds klappen?
Bin auch schon fleißig am Suchen was dahintersteckt
-
Mit "Frontent Modul" meinte Martin einfach ein kleines Programm, welches ganz normal in der Window-Station des Users läuft. Also einfach ein ganz normales Programm, wie jedes andere. Dieses könnte dann über Pipes/Sockets/... mit dem Service kommunizieren.
Allerdings funktioniert das nicht für's Logon - denn da kann man keine "ganz normalen Programme" laufen lassen.
Also nein, damit funktioniert's auch nicht. Sich irgendwie am Logon Prozess zu schaffen zu machen ist denke ich ziemlich kompliziert.
-
Nach GINA googlen und dann sich wundern, was man alles machen muss um in den Anmeldeprozess reinzukommen.
-
Achso, einfach ein gewöhnliches EXE-Programm das in meinem Dienst-Programm aufgerufen wird.
Aber wenns damit auch nicht funktioniert, dann kann man wohl nichts machen.Die Zeit vor dem Einloggen gehört wohl ganz allein dem Betriebssystem und niemand anderem.
Im Logon-Prozess selbst will ich nicht unbedingt herummurksen.Falls doch noch jemanden eine Möglichkeit einfällt, wäre ich dennoch gespannt!
-
Na währe veileicht hilfreich was du wie wan und wo machen willst. Also dem User beim Anmelden helfen is mir zu Misteriös
Gruß Matthias
-
Den User während der Eingabe unterstützen mit Messageboxen
Wenn die Num-Lock Taste deaktiviert ist zb.Also dass das Programm schon läuft, während noch die Anmeldemaske da ist und der User noch nicht eingeloggt wurde