kostenloser Webspace werbefrei: lima-city


C++ | ControlService - Dienste Starten/Stoppen

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    portal715

    Kostenloser Webspace von portal715

    portal715 hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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 :biggrin:
    Desweiteren musst Du im Manifest angeben, dass das Programm Admin-Rechte benötigt sonst geht das OpenSCManager() schief.
  4. Autor dieses Themas

    portal715

    Kostenloser Webspace von portal715

    portal715 hat kostenlosen Webspace.

    Hey darkpandemic,

    Das mit den Admin-Rechten habe ich nicht eingestellt...

    Hast mir eine kleine Anleitung wie ich das mache?
  5. 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.
  6. Autor dieses Themas

    portal715

    Kostenloser Webspace von portal715

    portal715 hat kostenlosen Webspace.

    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...
  7. 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
  8. Autor dieses Themas

    portal715

    Kostenloser Webspace von portal715

    portal715 hat kostenlosen Webspace.

    Wundervoll :)
    Vielen Dank, mal wieder einiges gelernt (z.B. nicht einfach an Tutorials im Internet glauben...) :)
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!