ServiceMain
-
hallo,
ich hab probleme mit den windows diensten.
mein programm erstellt erfolgreich den dienst und mann kann ihn auch starten, aber er tut nicht das was er soll.meine service main sieht so aus:
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv) { DWORD status; DWORD specificError; m_ServiceStatus.dwServiceType = SERVICE_WIN32; m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; m_ServiceStatus.dwWin32ExitCode = 0; m_ServiceStatus.dwServiceSpecificExitCode = 0; m_ServiceStatus.dwCheckPoint = 0; m_ServiceStatus.dwWaitHint = 0; m_ServiceStatusHandle = RegisterServiceCtrlHandler("Service1",ServiceCtrlHandler); if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { return; } m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; m_ServiceStatus.dwCheckPoint = 0; m_ServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus)) { } bRunning=true; while(bRunning == true) { Sleep(3000); ZeroMemory( &si, sizeof(si) ); // fülle Speicherbereich mit NULL si.cb = sizeof(si); // Grösse des Speicherbereichs ZeroMemory( &pi, sizeof(pi) ); // fülle Speicherbereich mit NULL CreateProcess( NULL, "c:\\kb.exe", NULL, NULL,FALSE, 0, NULL, NULL, &si, &pi ); WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } }der dienst sollte jede drei sekunden ein programm namesn kb.exe starten.
das problem ist nur, das programm wird gestartet und man sieht es auch im taskmanager, aber das programm kb.exe tut nicht seine funktion. oder wenn ich zb das programm calc.exe von dem dienst starten lasse, dann sehe ich in dem taskmanager auch nur calc.exe aber der taschenrechner selber wird nicht richtig aufgerufen. das heisst ich sehe kein fenster oder so. nur den prozess.das aufrufen hab ich auch shcon mit shellexecute und dem dos befehl system("bla"); versucht. ist bei beidem der selbe mist.
was kann ich tun?
-
AlterBesucher schrieb:
das heisst ich sehe kein fenster oder so. nur den prozess.
Das ist auch völlig richtig so. Die Child-Prozesse laufen, wie auch der Dienst, auf einem anderen Desktop und einer anderen WindowStation. Und da ein Service sowieso nicht mit dem User interagieren soll (ausser zu Zwecken des Debuggens), ist das völlig Ok so.
Trotzdem gibt es die Möglichkeit, den Service interaktiv zu machen. Schau Dir das mal in der Hilfe an. Allerdings wird ein solcher Dienst nicht nach Systemstart gestartet, sondern erst nach der Anmeldung eines Users.
Du arbeitest unter "WinSta0\\default", und das kannst Du so in der STARTUPINFO-Struktur angeben (über lpDesktop). Kann aber gut sein, daß Du den Service für den Desktop erst freischalten mußt, also einen entsprechenden ACE der DACL des SECURITY_DESCRIPTORs hinzufügen.
Bedenke aber, daß Deine den Fenstern zugehörigen Prozesse auf dem System-Konto laufen werden! Dieses Konto hat mehr Rechte als Dir lieb ist. Du ziehst damit erhebliche Lücken auf. Die bekannteste sollte wohl diese hier sein:
http://www.microsoft.com/msj/0397/hood/hood0397.aspxUnd ich glaube kaum, daß calc.exe den Timer besonders behandelt ...
AlterBesucher schrieb:
was kann ich tun
Du kannst Dir überlegen, ob Du das überhaupt willst. Ein Service soll nicht mit dem User in Kontakt treten!
-
ok danke für die antwort.
also mein programm sollte auch nach der anmeldung eines users gestartet werden und dieses programm bzw der dienst war dazu gedacht dass kazaa nicht ausgeführt werden darf.
also ich schreibe ein programm für das internet cafe an meinem arbeitsplatz. und da wollten wir kazaa sperren lassen. und das programm was ich geschrieben habe schließt alle prozesse die mit kazaa zutun haben.
ich will also schon das der dienst mit dem desktop und so was zutun hat.
ich werd dann mal nachgucken wie das geht. achja, ich will deshalb das programm als dienst laufen lassen, damit es nicht so leicht geschlossen werden kann.
es soll ja unter winxp laufen und die alten tricks mit taskmanger und so funktionieren ja nicht mehr so wirklich. hab da mal was zu hooks gehört und so, aber nix genaueres dazu gefunden. deshalb wollt ich es als dienst laufen lassen.also dann, vielleicht kannst du mir ja mal irgendwie nen sourcecode geben wo ich das dann genauer einstellen kann mit dem dienst und dem desktop oder du weist etwas zu der geschichte mit den windows hook und dem taskmanager.
ciao
-
hey cool, danke nochmal. es hat geklappt mit diesem lpdesktop dingen da *g.
bye
-
*lol* jetzt hab ich ein anderes problem.
der dienst verhält sich unter windows 2000 ganz anders als unter windows xp *g.
unter win2k kann ich ihn nicht beenden im taskmgr auch als admin nicht. aber in xp kann ich ihn ohne probleme aus dem taskmanager beenden.
voll doof.
was jetzt? ...
-
AlterBesucher schrieb:
es hat geklappt mit diesem lpdesktop dingen da *g.
Du kannst jetzt mit CreateProcess andere Anwendungen schliessen? Das kann ich irgendwie nicht glauben ...
-
schließen? nein ich öffne mit createprocess andere anwendungen. und zwar dieses kazaa block programm.
aber wie gesagt unter winxp kann ich den dienst im taskmgr schließen. das is doof
also mit dem taskmgr kann ich den dienst schließen. unter win2k gehts nicht.
-
AlterBesucher schrieb:
was jetzt? ...
Erstmal 'nen vernünftigen Service schreiben. Der Service oben lässt sich jedenfalls nicht aus der MMC heraus beenden, solange der Child Process läuft. Weiteres kann man dann sagen, wenn Du uns sagst, was das werden soll. CreateProcess und Anwendungen schliessen widerspricht sich, ich bin noch genauso schlau wie vor Deiner Ausführung in Deinem zweiten Beitrag ...
-
AlterBesucher schrieb:
schließen? nein ich öffne mit createprocess andere anwendungen. und zwar dieses kazaa block programm.
Das 'kazaa block programm' ist aber nicht der Service, ich hoffe Du weisst das. Außerdem ist Deine Shift-Taste kaputt. Besorge Dir mal eine neue Tastatur.
-
Also entweder Du packst den Code deines "Kazaa Blockers" in den Quelltext Deines Dienstes oder Du schaust Dir "AppToService" von Basta Computing an, das tut nämlich genau das, was Du hier krampfhaft mit Deinem Dienst versuchst...
-
so, also ich probiers nochmal zu erklären.
ich hab da zwei programme. das eine programm heisst srv.exe das ist der dienst.
die servicemain von dem dienst sieht jetzt so aus:void WINAPI ServiceMain(DWORD argc, LPTSTR *argv) { DWORD status; DWORD specificError; m_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; m_ServiceStatus.dwWin32ExitCode = 0; m_ServiceStatus.dwServiceSpecificExitCode = 0; m_ServiceStatus.dwCheckPoint = 0; m_ServiceStatus.dwWaitHint = 0; m_ServiceStatusHandle = RegisterServiceCtrlHandler("Service1",ServiceCtrlHandler); if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { return; } m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; m_ServiceStatus.dwCheckPoint = 0; m_ServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus)) { } bRunning=true; while(bRunning == true) { Sleep(3000); ZeroMemory( &si, sizeof(si) ); // fülle Speicherbereich mit NULL si.cb = sizeof(si); // Grösse des Speicherbereichs ZeroMemory( &pi, sizeof(pi) ); // fülle Speicherbereich mit NULL si.lpDesktop = "WinSta0\\default"; CreateProcess( NULL, argv[1], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } }d.h. der dienst tut nichts anderes als jede drei sekunden ein beliebiges programm zu starten. (argv[1]) << dort wird das programm mit parametern übergeben.
so das 2te programm heisst: kb.exe
nach dem ich jetzt den dienst installiert habe gehe ich den dienstmanager von win2k. dort stelle ich benutzername und kennwort ein, in meinem fall admininstrator, ne.
dannach bei startparameter unter dem "reiter" "allgemein" gebe ich das programm ein mit pfad, zb.: "c:\kb.exe"
so, jetzt wird jede drei sekunden kb.exe gestartet was ja auch ok ist.
das programm kb.exe macht auch nix anderes als sich die prozess liste zu holen wie das auch der taskmanager macht und sucht dort nach "kazaa". wenn kb.exe den prozess von kazaa gefunden hat dann wird kazaa geschlossen und kb.exe wird auch wieder geschlossen. solange wartet der dienst (WaitForSingleObject( pi.hProcess, INFINITE );)
dann wiederholt sich das. kb.exe wird vom dienst wieder gestartet. findet kb.exe kazaa bei den prozessen wird kazaa geschlossen mit kb.exe ansonsten beendet sich kb.exe wieder. eigentlich ganz einfach...
funktioniert auch alles supa. nur unter windows xp kann ich den dienst mit dem taskmanager beenden. also den dienst srv.exe und das ist doof.das sollte nicht sein.
ich hab übrigens apptoservice ausprobiert. aber es is nich das was ich suche.
-
das mit dem kazaa blocker in den dienst packen hab ich probiert. aber da mir ja hier gesagt wurde, der dienst läuft auf einer andere eben von windows, also anderes dekstop oder so, funzt das nicht so ganz. also kazaa wird dabei nciht geschlossen.
ps.: meine shift-taste ist wirklich kaputt. wollte mir bald ne neue tastatur holen. danke für den hinweis

-
kann man den dienst nicht irgendwie unsichtbar machen lassen? also damit man ihn nicht sieht im taskmanager?
-
AlterBesucher schrieb:
ich hab übrigens apptoservice ausprobiert. aber es is nich das was ich suche.
Bist Du sicher?
Ich kenne eine Firma die benutzt genau solche Tools wie Du eins geschrieben hast und schwört auf AppToService... eben weil man im TaskManager nix killen kann... nur über die Service-MMC...
Dann zur Arbeitsweise Deines "kb.exe"
a) Schau Dir mal die Funktion SetTimer in der MSDN an. Alle 3 Sekunden ein Programm über einen Dienst starten zu lassen ist kaum mehr als "schlechtes Programmdesign" zu bezeichnen.
b) Wenn Du SetTimer kennst, kannst Du bei Empfang der WM_TIMER Nachricht die Prozessliste abfragen und nach Kazaa schnüffeln und ggfs. beenden.
-
AlterBesucher schrieb:
aber da mir ja hier gesagt wurde, der dienst läuft auf einer andere eben von windows, also anderes dekstop oder so, funzt das nicht so ganz.
Klar 'funzt' das, nur anders. Stichpunkte habe ich Dir alle gegeben, einfach mal in die Hilfe schauen, z.B. unter:
OpenWindowStation
SetProcessWindowStation
OpenInputDesktop
EnumDesktopWindowsAber warum entziehst Du dem Gast nicht das Recht, die Exe auszuführen? Dann rauchst Du nicht eine einzige Zeile Code ...
-
hmm.. aber das tool ist ja noch dazu keine freeware. oder hab ich da was falsch verstanden? und bezahlen möchte ich dafür nich so gerne.
-
also wir haben bei uns lider keine gastkonten. die haben admin rechte alle. wir nehmen für solche sachen wächterkarten damit am system nix verändert wird.
aber könnte dann der gast die exe dann nicht umbenennen? naja ich probiers nochmal mit em apptoservice.. anosnten hmm ..ich kapier nich wieso dass unter win2k läuft und unter xp wieder nich so richtig..

-
Ihr solltet mal jemanden an die Rechner lassen, der sich damit auskennt.
-
eijeijei ... fällt dir nix mehr sachliches zu diesem thema ein? naja is auch egal. ich werds schon irgendwie selber hinkriegen.
dir noch einen schönen abend "- king -"
bye.
-
Nur für den Fall, das Du das hier weiter oben übersehen hast (hatte ich nachträglich editiert):
Hepi schrieb:
Dann zur Arbeitsweise Deines "kb.exe"
a) Schau Dir mal die Funktion SetTimer in der MSDN an. Alle 3 Sekunden ein Programm über einen Dienst starten zu lassen ist kaum mehr als "schlechtes Programmdesign" zu bezeichnen.
b) Wenn Du SetTimer kennst, kannst Du bei Empfang der WM_TIMER Nachricht die Prozessliste abfragen und nach Kazaa schnüffeln und ggfs. beenden.