C++ | ControlService - Dienste Starten/Stoppen
lima-city → Forum → Programmiersprachen → C/C++ und D
aufruf
baum
break
code
dienst
eigenschaft
erscheinenden dialog
fehler
flag
gemacht code
hilfsdienst
internet
manager
manifest angeben
navigieren
null
service
status
versuchen
vorgehen
-
Hey,
ich versuche den "IP-Hilfsdienst" von Windows zuerst zu kontrollieren ob er läuft und dann evtl. starten und beenden.
Habe schon gefühlt alle Seiten im Internet durchgeschaut und eigentlich habe ich auch schon den meines aktuellen Wissens nach richtigen Code:
SC_HANDLE hScMIPHilfsdienst = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hScMIPHilfsdienst == NULL) { DWORD error = GetLastError(); LPCTSTR errormsg = "#1 - " + error; SetWindowText(hInfobox, (LPCTSTR) error); } SC_HANDLE hIPHilfsdienst = OpenService(hScMIPHilfsdienst, "iphlpsvc" , SC_MANAGER_ALL_ACCESS); if (hIPHilfsdienst == NULL) { DWORD error = GetLastError(); LPCTSTR errormsg = "#2 - " + error; SetWindowText(hInfobox, (LPCTSTR) error); } SERVICE_STATUS sInfo; ControlService(hIPHilfsdienst, SERVICE_CONTROL_INTERROGATE, &sInfo); if (sInfo.dwCurrentState == SERVICE_STOPPED) { SetWindowText(hInfobox, "Aus"); }else{ SetWindowText(hInfobox, "An"); }
Aber wenn ich jetzt das ganze aufrufe, bekomme ich in der Console einen Fehler:
0x000006EF: Ein NULL-Kontexthandle wurde während eines Remoteprozeduraufrufs vom Client an den Host übergeben.
grüße striker503 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo portal715,
grundsätzlich funktioniert Dein Code bei mir einwandfrei. Was Du natürlich machen solltes ist im Fehlerfall die Funktion mit return zu verlassen
Desweiteren musst Du im Manifest angeben, dass das Programm Admin-Rechte benötigt sonst geht das OpenSCManager() schief. -
Hey darkpandemic,
Das mit den Admin-Rechten habe ich nicht eingestellt...
Hast mir eine kleine Anleitung wie ich das mache?
-
Hallo portal715,
um die Anforderung von Admin-Rechten einzustellen musst Du wie folgt vorgehen:
1. Rechtsklick auf das Projekt
2. Im Popup-Menü 'Eigenschaften' auswählen
3. Im erscheinenden Dialog im Baum auf der linken Seite zu
Konfigurationseigenschaften -> Linker -> Manifestdatei
navigieren
4. Den Eintrag 'UAC-Ausführungsebene' auf 'requireAdministrator' einstellen. -
Okay, der Fehler ist weg, aber er sagt, dass es an ist obwohl es eigentlich nicht der Fall ist...
Eine Idee? :)
Kannst ja auch mal versuchen ob es bei dir auch das richtige anzeigt, wenn du den IP-Hilfsdienst beendest...
-
Hallo portal715,
das es bei Dir so aussieht, als ob der Service immer läuft liegt daran, dass Du im nur auf SERVICE_STOPPED prüfst. Die Wahrheit ist aber, dass Dein ControlService() bereits fehlschlägt, weil Deinem Service-Handle das SERVICE_INTERROGATE-Recht fehlt. Es ist noch zu beachten, dass OpenService() mit ERROR_SERVICE_NOT_ACTIVE fehlschlägt, falls der Dienst beendet wurde. SERVICE_STOPPED ist der Fall, wenn der Dienst zwar läuft aber angehalten wurde.
Hier mal mein Testcode (ich hab's in C gemacht):
void service_test() { SC_HANDLE manager, service; SERVICE_STATUS status = {0}; if(!(manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS))) { fprintf(stderr, "Error: OpenSCManager() failed. (%lu)\n", GetLastError()); return; } if(!(service = OpenService(manager, "iphlpsvc" , SERVICE_ALL_ACCESS))) { fprintf(stderr, "Error: OpenService() failed. (%lu)\n", GetLastError()); CloseServiceHandle(manager); return; } if(!ControlService(service, SERVICE_CONTROL_INTERROGATE, &status)) { DWORD error = GetLastError(); if(error == ERROR_SERVICE_NOT_ACTIVE) printf("Service state: not active\n"); else fprintf(stderr, "Error: ControlService() failed. (%lu)\n", error); CloseServiceHandle(service); CloseServiceHandle(manager); return; } switch(status.dwCurrentState) { case SERVICE_STOPPED: printf("Service state: stopped\n"); break; case SERVICE_START_PENDING: printf("Service state: start pending\n"); break; case SERVICE_STOP_PENDING: printf("Service state: stop pending\n"); break; case SERVICE_RUNNING: printf("Service state: running\n"); break; case SERVICE_CONTINUE_PENDING: printf("Service state: continue pending\n"); break; case SERVICE_PAUSE_PENDING: printf("Service state: pause pending\n"); break; case SERVICE_PAUSED: printf("Service state: paused\n"); break; } CloseServiceHandle(service); CloseServiceHandle(manager); }
Edit: Bugfix: Für OpenService() muss man die Service-Access-Flags verwenden und nicht die für den Manager.
Beitrag zuletzt geändert: 19.8.2012 22:48:23 von darkpandemic -
Wundervoll :)
Vielen Dank, mal wieder einiges gelernt (z.B. nicht einfach an Tutorials im Internet glauben...) :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage