Den Status eines Windows-Dienstes abfragen
-
Hallo,
hier ist mein Ansatz mit dem ich versuche den Status eines Dienstes unter Windows 2000 abzufragen.
Weshalb es zu diesen Fehlern kommt kann ich mir dennoch nicht erklären.
Vielleicht weiss ja jemand weiter oder hat einen guten Tipp
Danke.#include <iostream> #include <windows.h> using namespace std; int main() { SC_HANDLE ServDataBase; if(OpenSCManager(NULL, //local SERVICES_ACTIVE_DATABASE, // name of the service control manager database to open SC_MANAGER_ALL_ACCESS // includes STANDARD_RIGHTS_REQUIRED )==NULL) { cout << "FAILED" << endl; } unsigned long iNumberofServices; unsigned long pcbBytesNeeded; ENUM_SERVICE_STATUS ServStat; ServStat.lpServiceName="TlntSvr"; // name of service ServStat.lpDisplayName="Telnet"; // display name // access the SERVICE_STATUS struct to specify detailed information: ServStat.ServiceStatus.dwServiceType=SERVICE_WIN32_SHARE_PROCESS; ServStat.ServiceStatus.dwCurrentState=SERVICE_RUNNING; ServStat.ServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_PAUSE_CONTINUE; cout << "1st Error: " << GetLastError() << endl; // returns Error 997, Overlapped I/O operation is in progress. int iEnReturn; iEnReturn = EnumServicesStatus(ServDataBase, SERVICE_WIN32, SERVICE_STATE_ALL, &ServStat, sizeof(ServStat), &pcbBytesNeeded, &iNumberofServices, 0); { cout << GetLastError() << endl; // returns Error 234 cout << iEnReturn << endl; // returns 0 <<-- that means it did not succeed } return 0; }
-
234, Es sind mehr Daten verfügbar.
-
Aber was bedeutet das?
Ich kann mit der Fehlermeldung nichts anfangen genauso wie mit dem Erro 997.

-
erstmal macht es nur sinn GetLastError aufzurfen, wenn die funktion fehlgeschlagen ist.
und zum problem mit mehr daten. du musst wahrscheinlich EnumServicesStatus ein zweites mal aufrufen, aber dann mit der richtigen größe die du ja beim ersten aufruf durch pcbBytesNeeded bekommen hast.
-
Aha, okay.
Mit dem ErrorHandling hast du natürlich vollkommen recht.pcbBytesNeeded = 5878 (Bytes)
Wie mache ich das dann mit dem zweiten Aufruf?
Der letzte Parameter heisst der Funktion ist bei mir ja 0.
In MSDN heisst er lpResumeHandle [in, out].
Beim ersten Aufruf muss dieser 0 sein so wie ich es mache.Wie schaut dann der zweite Aufruf aus?
Dank dir mal

-
Wenn Du den Status von einem Dienst haben willst, statt alle Dienste aufzulisten, dann kannst Du es so machen:
#include <iostream> #include <windows.h> using namespace std; #pragma comment( lib, "Advapi32.lib" ) int main() { SC_HANDLE ServDataBase = OpenSCManager( NULL, //local SERVICES_ACTIVE_DATABASE, // name of the service control manager database to open SC_MANAGER_ALL_ACCESS // includes STANDARD_RIGHTS_REQUIRED ); if( !ServDataBase ) { cout << "FAILED" << endl; return 1; } SC_HANDLE hService = OpenService( ServDataBase, "TlntSvr", SC_MANAGER_ALL_ACCESS ); SERVICE_STATUS ss; if( hService ) { bool bQuery = QueryServiceStatus( hService, &ss ); if( bQuery ) switch( ss.dwCurrentState ) { case SERVICE_STOPPED: cout << "Service gestoppt!" << endl; break; case SERVICE_START_PENDING: cout << "Service wird gestartet..." << endl; break; case SERVICE_STOP_PENDING: cout << "Service wird gestoppt" << endl; break; case SERVICE_RUNNING: cout << "Service läuft..." << endl; break; case SERVICE_CONTINUE_PENDING: cout << "Service wird fortgeführt..." << endl; break; case SERVICE_PAUSE_PENDING: cout << "Service wird angehalten..." << endl; break; case SERVICE_PAUSED: cout << "Service angehalten!" << endl; break; } } return 0; }
-
Wow super, genau das habe ich gesucht!
Vielen Dank für deine Mühe!!!