Programm mit Adminrechten



  • hallo,
    verschiedene Aktionen kann man ja nur mit Adminrechten ausführen (z.B einen Service installiern & starten oder auf bestimmte Ordner/Dateien zugreifen).
    Das ist auch der Grund, weshalb ein Programm, das ich geschrieben habe, nicht richtig unter einem "eingeschränkten Konto" läuft.

    Meine Frage ist also: Lassen sich einem normalem Programm irgendwie mehr Rechte einräumen?

    (bespielsweise mit Hilfe eines Eintrags in der Registry, in einem Bereich, auf den man nur mit Admin-Rechten zugreifen kann. So müsste man das Programm mit Admin-Rechten installieren und ihm so die Berechtigung erteilen auch unter anderen Benutzerkonten mit vollen Rechten zu laufen)

    danke schonmal im voraus



  • Einem Programm lassen sich nur dann mehr Rechte "zuweisen" wenn auch die passenden Berechtigungen bzw. der passende Benutzeraccount eingeloggt ist.
    Prinzipiell kannst Du Dein Programm mittels "Run As..." starten oder Du kannst selber "LogonUser" aufrufen und "ImpersonateX..." aufrufen...

    Tricks gibt es aber nicht, sonderst wäre Windows nicht entsprechend Zertifiziert worden...



  • das ging aber schnell!
    Sowohl für runas als auch für LogonUser muss mir ja das Passwort des entsprechenden Accounts bekannt sein, was es aber leider nicht unbedingt ist...

    Es ist also nicht möglich, eine Liste zu verwalten (die aus Gründen der Sicherheit natürlich nur vom Administratoraccount aus bearbeitet werden kann), in der "priviligierte" Programme aufgeführt sind, die mehr Rechte besitzen als "normale" Anwendungen.
    Oder gibt es so etwas?



  • Mir ist sowas nicht bekannt... dann könnte der Admin Dir doch gleich das Passwort mitteilen...



  • Jochen Kalmbach schrieb:

    Mir ist sowas nicht bekannt... dann könnte der Admin Dir doch gleich das Passwort mitteilen...

    Das ist schon wahr.

    Ich hatte die Sache nur so geplant, dass der Administrator das Programm installiert (hier würde ein Eintrag für das Programm in besagter Liste angelegt, die es ja wahrscheinlich gar nicht gibt 😉 ) und das Programm dann unter allen Useraccounts ausführbar ist, ohne dass das Programm selbst Kenntnis vom Passwort hat.

    Zudem ist mir aufgefallen, dass für runas wohl ein Passwort angegeben werden muss. Wenn der Adimistrator also kein Passwort besitzt (auch in diesem Fall sollte das Programm noch wie gewünscht funktionieren), funktioniert runas nicht.

    Könnte es sonst noch Möglichkeiten für die Lösung meines Problems geben?



  • Warum installierst Du keinen Service?



  • Jochen Kalmbach schrieb:

    Warum installierst Du keinen Service?

    Ja, daran hatte ich auch gedacht. Ich hab sogar schonmal einen Service anhand diverser Beispiele zum Laufen gebracht. Nur blicke ich noch nicht ganz durch (deshalb auch die Frage hier, ob es nicht noch andere Möglichkeiten gäbe).

    Zwei Frage noch zu Services:

    1. Ich habe den Service über CreateService installiert. Laut msdn erzeugt diese Funktion die entsprechenden Einträge in der Registry unter "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services". Spricht etwas dagegen diese Einträge direkt über einen Installer anlegen zu lassen, ohne diese Funktion zu benutzen?

    2. Ich brauche den Service ja nur wenn mein Programm ausgeführt wird. Lässt sich ein installierter Service von einem Programm starten und beenden, das unter einem Useraccount ausgeführt wird?



  • Für Services siehe:
    http://www.codeproject.com/system/serviceskeleton.asp

    Und 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.asp

    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.asp

    PS: 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.asp

    Auf 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.asp

    Ah 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!


Anmelden zum Antworten