Servicedienste ermitteln



  • Morgen allesamt,

    ich suche grad nach ner Möglichkeit, mir in einer ListBox oder ComboBox oder wo auch immer, mir alle Dienste anzeigen zu lassen. Also die, welche ich auch unter der Systemsteuerung\Verwaltung\Dienste sehe.

    Hat das schon mal jemand gemacht oder eine Idee wie ich das angehen könnte. Ich hab herausgefunden, das diese Dienste auch in der Registry stehen, aber ich möchte diese ungern durchlaufen. Jemand ne Idee?





  • So, hab mich mal rangesetzt, aber irgendwie funktioniert hier nichts )-:

    //Servicedienste anzeigen
      /*
      BOOL EnumServicesStatus(
    
        SC_HANDLE hSCManager,	// handle to service control manager database
        DWORD dwServiceType,	// type of services to enumerate
        DWORD dwServiceState,	// state of services to enumerate
        LPENUM_SERVICE_STATUS lpServices,	// pointer to service status buffer
        DWORD cbBufSize,	// size of service status buffer
        LPDWORD pcbBytesNeeded,	// pointer to variable for bytes needed
        LPDWORD lpServicesReturned,	// pointer to variable for number returned
        LPDWORD lpResumeHandle 	// pointer to variable for next entry
       );
      */
    
      HANDLE SManag = OpenSCManager(NULL, //Lokaler Rechner
                                     NULL, //DB
                                     SC_MANAGER_ENUMERATE_SERVICE); //Service anzeigen
    
      ENUM_SERVICE_STATUS EnumServ;
    
      DWORD dwBytesNeeded = 0;
      DWORD dwServicesReturned = 0;
      DWORD dwResumedHandle = 0;
      DWORD dwServiceType = SERVICE_WIN32 | SERVICE_DRIVER;
    
      DWORD dwBytes = sizeof(ENUM_SERVICE_STATUS) + dwBytesNeeded;
      ENUM_SERVICE_STATUS* pServices = NULL;
      pServices = new ENUM_SERVICE_STATUS [dwBytes];
    
      BOOL retVal = EnumServicesStatus(SManag, dwServiceType, SERVICE_STATE_ALL,
            &EnumServ, sizeof(ENUM_SERVICE_STATUS), &dwBytesNeeded, &dwServicesReturned,
            &dwResumedHandle);
    
      //Application->MessageBoxA(dwServicesReturned,NULL,MB_OK);
      for (unsigned iIndex = 0; iIndex < dwServicesReturned; iIndex++)
      {
        //cout << TEXT("Display Name") << (pServices + iIndex)->lpDisplayName << TEXT('\t');
        //cout << TEXT("Service Name") << (pServices + iIndex)->lpServiceName << endl;
        //Memo1->Text = (pServices + iIndex)->lpServiceName;
        Application->MessageBoxA((pServices + iIndex)->lpServiceName,NULL,MB_OK);
      }
    
      delete [] pServices;
      pServices = NULL;
    
      CloseServiceHandle(SManag);
    

    in der unteren Schleife sollte er mir mal die Dienste ausgeben, was leider nicht funktioniert.

    Jemand ne Idee?

    Danke



  • Dein Code kann so gar nicht funktionieren :p - denn du liest nach EnumServ ein und willst aus pServices ausgeben 😉

    Versuch's mal so - das klappt bei mir:

    SC_HANDLE SManag = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
    
    DWORD dwBytesNeeded = 0; 
    DWORD dwServicesReturned = 0; 
    DWORD dwResumedHandle = 0; 
    DWORD dwServiceType = SERVICE_WIN32 | SERVICE_DRIVER; 
    
    EnumServicesStatus(SManag, dwServiceType, SERVICE_STATE_ALL, NULL, 0, &dwBytesNeeded, &dwServicesReturned, &dwResumedHandle); 
    
    char *pServices = new char[dwBytesNeeded];
    
    EnumServicesStatus(SManag, dwServiceType, SERVICE_STATE_ALL, (LPENUM_SERVICE_STATUS)pServices, dwBytesNeeded, &dwBytesNeeded, &dwServicesReturned, &dwResumedHandle);
    
    for (unsigned int iIndex = 0; iIndex < dwServicesReturned; iIndex++)
    { 
        MessageBox(NULL,((LPENUM_SERVICE_STATUS)pServices)[iIndex].lpServiceName,NULL,MB_OK); 
    } 
    
    delete [] pServices; 
    pServices = NULL; 
    
    CloseServiceHandle(SManag);
    

    Die Fehlerüberprüfung hab ich mal weggelassen - sollte man aber im Endeffekt schon wieder einbauen 😉



  • Danke.

    da bewahrheitets sich mal wieder das Sprichwort mit dem Wald und den Bäumen. 🙄


Anmelden zum Antworten