Frage zu Windows Service
-
Hallo, wenn ich im Windows in die Computerverwaltung gehe und dann bei Dienste schaue dann sehe ich ja eine Liste wo alle laufenden Dienste aufgelistet sind.
Es gibt z.b. einen Dienst der heisst: Windows-Zeitgeber
Wenn ich den deaktivieren möchte kann ich das ja auch mit den WIN API Funktionen machen.
OpenService braucht ja den Namen vom Dienst der beendet werden soll.
Dort müsste ich ja eigentlich dann schreiben Windows-Zeitgeber.
Mein Problem ist aber das z.b. auf einem Englischen oder Niederländischen Windows das Programm doch dann nicht mehr funktionieren kann. Denn dort wird der Dienst wohl kaum Windows-Zeitgeber heissen.
Muss ich dann erst überprüfen was für ein Windows auf dem PC ist wo mein Programm ausgeführt wird?
Weil dann könnte ich ja immer die passenden Service Namen an die OpenService Funktion übergeben.
Oder gibt es da eine bessere möglichkeit?
-
Das was Du da siehst, ist der "DisplayName" (CreateService, Parameter 3). Wenn Du aber an den Service heran willst, brauchst Du den "ServiceName" (CreateService, Parametr 2, OpenService).
Schaue Dir mal die Eigenschaften zum Dienst an (Rechtsklick auf den Dienst -> Eigenschaften). Dan siehst Du unter allgemein gleich als erstes:
Dienstname: W32Time
Anzeigename: Windows-ZeitgeberDer Dienst heißt demnach W32Time und nicht etwa Windows-Zeitgeber. Und das passt dann auch auf einem englischen System.
-
Ich hab nochmal eine Frage bezüglich der Windows Services
Hiermit öffne ich den Service isdvc ( Windows CardSpace ) aber ich bekomme immer den Error code 5 ( Access denied ).
SC_HANDLE sc_handle = OpenSCManager( NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS ); if( sc_handle == 0 ){ cout<<"OpenSCManager error, error code: " << GetLastError()<<endl; } SC_HANDLE sc_OpenService = OpenService( sc_handle, "idsvc", SC_MANAGER_ALL_ACCESS ); if( sc_OpenService == 0 ){ cout<<"OpenService error, error code: " << GetLastError()<<endl; }
Wenn ich aber z.b. mit dem gleichen Programm den Dienst WebClient öffnen will dann funktioniert alles ohne Probleme.
Ich hab es auch noch mit anderen Diensten getestet und da funktionierte es ohne Probleme. Jetzt würde mich einfach mal interessieren wieso es gerade beim Windows CardSpace Service nicht funktioniert.
-
Willst Du das wirklich SC_MANAGER_ALL_ACCESS?
Wenn ja, musst Du auch Admin sein (elevated).http://msdn.microsoft.com/en-us/library/windows/desktop/ms685981(v=vs.85).aspx
-
Danke für die Hilfe, hier die Lösung:
SC_HANDLE sc_handle = OpenSCManager( NULL, SERVICES_ACTIVE_DATABASE, GENERIC_EXECUTE ); if( sc_handle == 0 ){ cout<<"OpenSCManager error, error code: " << GetLastError()<<endl; } sc_handle = OpenService( sc_handle, "idsvc", GENERIC_EXECUTE ); if( sc_handle == 0 ){ cout<<"OpenService error, error code: " << GetLastError()<<endl; }