Programm mit Adminrechten
-
Für Services siehe:
http://www.codeproject.com/system/serviceskeleton.aspUnd ja, ein Service lässt sich auch "on demand" starten, nämlich erst dann, wenn er von einer Applikation auch benötigt wird.
Wenn sich die Installation des Services sofort auswirken soll, dann musst Du ihn AFAIK via CreateService installieren.
-
Vielen Dank für die schnelle Hilfe erst einmal!

Ich werde das gleich nochmal alles ausprobieren.
-
Jochen Kalmbach schrieb:
Und ja, ein Service lässt sich auch "on demand" starten, nämlich erst dann, wenn er von einer Applikation auch benötigt wird.
So das habe ich jetzt hinbekommen. Allerdings funktioniert es nur, wenn die Applikation unter einem Administratoraccount ausgeführt wird.
Es muss doch auch möglich sein einen bereits installierten, aber nicht gestarteten Service, von einer Applikation aus zu starten, die keine Adminrechte besitzt. (Ich könnte mir vorstellen, dass man dafür bereits bei der Installation des Service irgendwas beachten muss).
Wäre nett, wenn mir hier jemand weiter helfen könnte.
-
Wie startest Du denn den Service? Was hast Du unter "Starttyp" eingestellt? (das muss auf "Manuell" stehen...)
Wenn das so konfiguriert ist, musst Du eigentlich nur den Service "öffnen" (CreateFile) und dann müsste er automatisch gestartet werden...
-
Jochen Kalmbach schrieb:
Wie startest Du denn den Service? Was hast Du unter "Starttyp" eingestellt? (das muss auf "Manuell" stehen...)
Hier der Aufruf der Funktion CreateService (natürlich unter Admin).
Soweit ich das überblicke, wird der Service installiert aber noch nicht gestartet.hService=CreateService(scm,"TestService", "Beschreibung ...", SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, //<- das sollte das richtige Flag sein SERVICE_ERROR_NORMAL, "(...path...)\\FirstService.exe", 0,0,0,0,0);Jochen Kalmbach schrieb:
Wenn das so konfiguriert ist, musst Du eigentlich nur den Service "öffnen" (CreateFile) und dann müsste er automatisch gestartet werden...
Mit CreateFile kann man den Service starten? Davon hatte ich bisher noch nichts gelesen. Wäre nett, wenn du mir sagen könntest wie das geht.
Bisher habe ich versucht (anhand des verlinkten Beispiels) den Service über StartService zu starten. Hat aber nicht funktioniert, wie du an folgendem Code sehen kannst:SC_HANDLE hService,scm; scm=OpenSCManager(0,0,GENERIC_READ|SERVICE_START); //kann sein, dass die Parameter hier nicht stimmen, //aber ich wüsste nicht, was ich hier sonst angeben soll if(!scm) return 1; hService=OpenService(scm,"TestService",SERVICE_START); //die Funktion liefert NULL zurück. //Rückgabe von GetLastError: "ERROR_ACCESS_DENIED" if(!hService) { CloseServiceHandle(scm); return 1; } StartService(hService,0,NULL); CloseServiceHandle(hService); CloseServiceHandle(scm);
-
Ich hab es selber nich nicht gemacht... aber vielleicht hilft Dir folgendes weiter:
http://msdn.microsoft.com/library/en-us/dllproc/base/service_security_and_access_rights.asp
bzw.
http://msdn.microsoft.com/library/en-us/secauthz/security/queryserviceobjectsecurity.aspPer default wird das "SERVICE_START" dem "Local user" nicht zugewiesen, somit hat er nicht das Recht einen Service zu starten...
Um das zu ändern, siehe: Modifying the DACL for a Service
http://msdn.microsoft.com/library/en-us/dllproc/base/modifying_the_dacl_for_a_service.aspPS: Das mit "CreateFile" war natürlich falsch, sorry...
-
Jochen Kalmbach schrieb:
aber vielleicht hilft Dir folgendes weiter:
http://msdn.microsoft.com/library/en-us/dllproc/base/service_security_and_access_rights.aspAuf diese Seite bin ich beim Durchforsten der msdn schonmal gestoßen. Mir ist aber nicht ganz schlüssig, welche Flags an OpenSCManager übergeben werden müssen, um einen Service zu starten/beenden.
Jochen Kalmbach schrieb:
Per default wird das "SERVICE_START" dem "Local user" nicht zugewiesen, somit hat er nicht das Recht einen Service zu starten...
Um das zu ändern, siehe: Modifying the DACL for a Service
http://msdn.microsoft.com/library/en-us/dllproc/base/modifying_the_dacl_for_a_service.aspAh danke! Das hilft schonmal enorm weiter. Ich werde es möglichst bald testen.
Eigentlich müsste man den Code doch fast so in die Installationsroutine für den Service übernehmen können.In einer Zeile steht:
BuildExplicitAccessWithName(&ea, TEXT("GUEST"), SERVICE_START | SERVICE_STOP | READ_CONTROL | DELETE, SET_ACCESS, NO_INHERITANCE);Mir ist selbst mit Hilfe der Beschreibung der Funktion BuildExplicitAccessWithName nicht klar, was ich hier für "TEXT("GUEST")" angeben muss, um das Start/Stop-Recht allen Useraccounts zu geben.
-
Fragestellender schrieb:
Mir ist selbst mit Hilfe der Beschreibung der Funktion BuildExplicitAccessWithName nicht klar, was ich hier für "TEXT("GUEST")" angeben muss
hatte ich überlesen. Es scheint wohl "TEXT("EVERYONE")" zu sein
-
Jochen Kalmbach schrieb:
Tricks gibt es aber nicht, sonderst wäre Windows nicht entsprechend Zertifiziert worden...
tricks gibt massenweise: http://www.securityfocus.com/microsoft
-
net schrieb:
Jochen Kalmbach schrieb:
Tricks gibt es aber nicht, sonderst wäre Windows nicht entsprechend Zertifiziert worden...
tricks gibt massenweise: http://www.securityfocus.com/microsoft

-
Fragestellender schrieb:
hatte ich überlesen. Es scheint wohl "TEXT("EVERYONE")" zu sein
Nein, es ist doch nicht (immer) "EVERYONE". Auf einer deutschen Windows-Version beispielsweise, muss man der Funktion BuildExplicitAccessWithName den String "JEDER" übergeben.
Jedenfalls fülle ich die EXPLICIT_ACCESS-Struktur jetzt manuell und erzeuge eine "EVERYONE"-äquivalente SID über AllocateAndInitializeSid, um das Problem mit dem lokalisierten String zu umgehen.
Jedenfalls: Vielen Dank für die Hilfe!

Anders hätte ich das wohl nicht hinbekommen!