![]() |
Adminrechte für eine Prozedur
HI,
ich möchte in einem Programm 2 Registry-Schlüssel erstellen. Einen in HKEY_LOCAL_MACHINE und einen in HKEY_CURRENT_USER. Für den in HKLM macht mir die UAC ein Strich durch die Rechnung, wenn ich das Programm "normal" starte. Den Schlüssel kann ich nur erstellen, wenn ich das Programm explizit mit Adminrechten starte. Dann aber kann ich auf den entsprechenden HKCU nicht zugreifen, weil das Programm dann unter einem anderen Benutzerkontext läuft. Gibt es die Möglichkeit sich innerhalb des Programm's die Adminrechte vom Betriebssystem anzufordern und später wieder abzugeben? |
AW: Adminrechte für eine Prozedur
Zitat:
|
AW: Adminrechte für eine Prozedur
Zitat:
Du müsstest wissen unter welchen Key HKEY_USERS der User eigentlich liegt ... |
AW: Adminrechte für eine Prozedur
Ich würde den Schlüssel unter HKLM vom Setup erstellen lassen und den unter HKCU bei Bedarf.
|
AW: Adminrechte für eine Prozedur
Zitat:
Captnemos Problem muss an anderer Stelle liegen. Macht ja auch gar keinen Sinn. Seit es UAC gibt, ist das Token jedes Admin-Users mit einem zusätzlichen Token verlinkt. Das normale Token hat halt auch bei Admin Accounts nur eingeschränkte Rechte. Wenn man elevated, wird das linked Token zugewiesen, welches die tatsächlichen Adminrechte besitzt. Beide Token gehören aber dem selben Benutzer, deshalb sieht man auch den selben HKCU Key und hat ebenfalls genauso Zugriff auf das jeweilige Benutzerverzeichnis. |
AW: Adminrechte für eine Prozedur
Nein, er hat Recht.
Benutzer A: Standardnutzer Benutzer B: Lokaler Admin Wenn du beim UAC-Prompt nun die Credentials von Benutzer B angibst (wen sollte man sonst nehmen?) dann ist HKCU definitiv der von Benutzer B. |
AW: Adminrechte für eine Prozedur
Ihr redet von 2 unterschiedlichen Szenarien.
|
AW: Adminrechte für eine Prozedur
Ich kann ja auch die Frage mal ein bisschen anders stellen (wobei ich die Aussage von Zacherl noch mal eingehend prüfen werde).
Mein Programm kommt und soll auch ohne Installation daher. Es gibt aber innerhalb des Programmes eine optionale Einstellung, die der User auswählen kann. Tut er dies, so soll das Programm für den Fall die entsprechenden Rechte einfordern (sofern das überhaupt geht), und nach dem Setzen dieser Einstellung eben wieder ohne diese Adminrechte weiterlaufen. Ich will vermeiden, dass ein User auf die Idee kommt, den Haken "Programm als Administrator ausführen" setzt, zumal ich auch glaube, dass dann die vom User gemappten Laufwerke ggf. auch nicht zur Verfügung stehen. Und die Adminrechte generell schon beim Start vorauszusetzen, nur um eine Option zur Verfügung zu halten, die nicht immer benötigt wird, wäre auch keine gute Idee. Daher meine Frage: geht das überhaupt, oder nicht. |
AW: Adminrechte für eine Prozedur
Markus hat recht, deshalb hatte ich bei meiner ersten Antwort explizit nach Credentials gefragt. Ich arbeite als lokaler Admin. Wenn da das UAC Fenster kommt, wird der Prozess ganz einfach über das linked Token elevated. Hier findet KEIN Switch auf einen anderen User statt.
Klar, wenn du eingeschränkt arbeitest musst du Credentials von einem Adminuser eingeben. In diesem Falle hat Bernhard natürlich recht. Jetzt wieder zurück zum Problem. Ja du kannst über diverse Methoden auch nur einen einzigen Thread elevaten. Stichwort ist impersonation. Die Impersonation kannst du nach deiner Aktion auch ohne Probleme wieder rückgängig machen ( ![]() |
AW: Adminrechte für eine Prozedur
Hmm..
Und wo ist nun das Problem? HKLM ist immer bei beiden Anmeldungen gleich (solange auf dem selben PC ausgeführt). Wenn Du die Speicherroutinen in die Registry aufteilst, dann sollte es eigentlich klappen, nach dem Motto: Normaler User -> Speichern in HKCU Admin anfordern -> Speichern in HKLM wieder zurück (zum normalen User) -> Speichern/lesen in HKCU, lesen in HKLM Ich habe einige Dienste erstellt, welche gleichzeitig mit verschiedenen Anmeldungen laufen. - Der Dienst selber als LocalSystem - Der Kommunikations- Thread als User A - Ein spezieller PrintSpooler als User B (Dieser hatte die Netzwerk-Drucker gemappt) Geh hin und lagere das 'speichern' in HKLM in eine Funktion aus, welche mit LogonUser, LoadUserProfile, ImpersonateLoggedOnUser einen Admin anmeldet und dann das Speichern durchführt. Anschließend dann mit RevertToSelf und UnloadUserProfile wieder zurück zum normalen User. |
AW: Adminrechte für eine Prozedur
Okay, wir kommen der Sache näher ;) Da sieht ja schon mal so aus, wie ich mir das vorstelle.
Ich habe mir mal die Funktion LogonUser angeschaut. In der "muss" ich ja explizit den User und das Passwort mit übergeben. Ist der User nur normaler User, so muss sicherlich der Benutzername von einem (lokalen) Admin und dessen Kennwort abgefragt werden. Ist er aber selber schon mindestens lokaler Admin, so wären das ja im Grund nicht notwendig. Als Beispiel nehme ich mal eine Anwendung, die per Manifest immer mit Adminrechten starten will. In dem Fall ist es ja so, dass wenn User bereits Administrator nur die UAC-Abfrage erscheint, dass das diese Programm explizit mit Adminrechten startet, aber Benutzer oder Kennwort-Eingaben sind nicht notwendig. Oder, wenn User eben "normaler" User ist, von Windows dann die Benutzer- und Kennwort-Abfrage kommt, und anschließend das Programm unter dem Benutzerkontext des eingegebenen Benutzers gestartet wird. So ungefär hätte ich das auch. Ich will nicht selber Benutzernamen und Kennwort abfragen, sondern Windows das erledigen lassen. Denn selbst wenn ich über die Informationen Benutzername und Kennwort eine lokalen Admins verfüge, so ist bei UAC ja so, dass für bestimmte Änderungen am System die Anmeldung als Administrator nicht ausreicht, sondern auch diesem für solche Vorgänge nochmal explizit erweiterte Rechte zugeteilt werden müssen. Ich habe das bei mir ausprobiert. Wenn ich mich meinem Benutzerkonto die Lokale Gruppe Administratoren zuweise, und mein Programm starte, so kann ich keine Änderungen an HKLM vornehme. Ich muss es trotzdem mit der rechten Maustaste "Als Administrator ausführen", erst dann sind Änderungen an HKLM möglich, aber, und das ist für mich logisch, gehen die notwendigen Änderungen an HKCU in die Hose. Um also dieses "Als Administrator ausführen" in dem Fall über LogonUser zu erreichen müsste ich ja erst mal einen Benutzer (und Kennwort) haben, dass über noch mehr Rechte verfügt, als es das aktuelle Benutzerkonto in der Gruppe der lokalen Administratoren eh schon hat. Ich weiß nicht, ob ich mich jetzt klar ausgedrückt habe, und meine Problematik korrekt rüberkommt. Vielleicht habe ich ja an der Funktion LogonUser irgendwas noch nicht verstanden, Also nicht gleich anmeckern ;) |
AW: Adminrechte für eine Prozedur
Du könntest für das Schreiben in den HKLM eine kleine Exe schreiben, die du dann in deinem Programm mit "runas" aufrufst, und alles ist chic. Vorteil: Du musst dich nicht um Usernamen usw. kümmern und wenn der User keine Adminrechte hat/bekommt, dann funktioniert es sowieso nicht.
|
AW: Adminrechte für eine Prozedur
Das könnte ich machen. Ich könnte auch eine .reg erstellen und das mit der machen.
In der Frage ist aber auch ein wenig persönlicher Ehrgeiz drin :wink: |
AW: Adminrechte für eine Prozedur
Diesen Ehrgeiz hatte ich früher auch mal. Jetzt liegt mein Fokus mehr auf der Rente und einer geschmeidigen Zeit bis dahin :thumb:
|
AW: Adminrechte für eine Prozedur
Also es ist auf jeden Fall nicht möglich (ohne dreckige Hacks) volle Adminrechte zu erhalten (linked Token) ohne deinen Prozess wie schon vorgeschlagen mit "runas" als Administrator neu zu starten. Wenn es nur um eine kleine Einstellung geht, könntest du deinem Programm einen Parameter verpassen und den Prozess bei Bedarf mit "runas" und diesem Parameter im Hintergrund starten. Notfalls IPC einbauen, wenn du der eingeschränkten Instanz irgendein Feedback geben musst.
Andere Möglichkeit, die auch dann funktionieren würde, wenn der User kein lokaler Administrator ist, wäre die Einrichtung eines System Services bei der Installation. Darüber kannst du dann per IPC alle Operationen ausführen, die erhöhte Rechte verlangen. Die dritte Möglichkeit wäre der "dreckige Hack", den ich erwähnt hatte. Dieser benötigt auch einen Service oder einen Prozess, der mit Systemrechten läuft (könntest du im laufenden Betrieb - lokaler Administrator vorrausgesetzt - spawnen, indem du den Task Scheduler, bzw. den "at" Command in der Console verwendest). Dein Programm muss dann mit dem Systemprozess kommunizieren und ihm das Handle des aktuellen Thread Tokens mitteilen. Der Service nutzt dann ![]() ![]() Achtung: Hier kann man sich schnell Sicherheitslücken (privilege Escalations) einbauen. Mir persönlich wäre es den Aufwand nicht wert, weshalb ich wohl auf die "runas" Methode zurückgreifen würde. Sauberer ist meiner Meinung nach die Service Methode, aber du hattest glaube ich irgendwo weiter oben erwähnt, dass du keine Installation willst. |
AW: Adminrechte für eine Prozedur
Zitat:
![]() Axel |
AW: Adminrechte für eine Prozedur
Ich habe mich jetzt zu einer anderen Lösung durchgerungen.
In dem entsprechenden Optionspunkt habe ich einen Hinweis eingebaut, dass dieser nur zur Verfügung steht, wenn das Programm mit der Option "Als Administrator ausführen" gestartet wurde. Wird nun das Programm genau so gestartet, werden die eigentlichen Programmfunktionen ausgeblendet und nur diese Option steht zur Verfügung. Die kann der Anwender oder der Admin nun aktivieren. Beim erneuten Start im "normalen" Modus wird nun Read-Only der Inhalt von HKLM abgefragt und die dazugehörigen HKCU-Einträge ergänzt. Damit habe ich mein Ziel erreicht. Es können alle notwendigen Einträge vorgenommen werden und ich stelle Sicher, durch das Deaktivieren der normalen Programmfunktion, dass keiner auf die Idee kommt das Programm immer "Als Administrator" auszuführen. |
AW: Adminrechte für eine Prozedur
Zitat:
man kann's auch umständlich machen. Axel |
AW: Adminrechte für eine Prozedur
Zitat:
Machs doch sauber und nimm die "runas" Geschichte und gib die auszuführende Option als Parameter an dich selbst weiter. Grade wenn es nur um Optionen geht. Dort brauchst du nach De/Aktivierung ja kein wirkliches Feedback in deiner GUI anzeigen bzw. weißt ja im Erfolgsfall, wie der neue Status aussieht. In die DPR packst du sowas in die Art:
Delphi-Quellcode:
Und zum Togglen der Option sowas:
begin
if (ParamCount >= 1) then begin if (ParamStr(1) = '/toggle') then begin Beep(700, 1000); Exit; end; end; Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm3, Form3); Application.Run; end.
Delphi-Quellcode:
var
ExecInfo: TShellExecuteInfo; begin FillChar(ExecInfo, SizeOf(ExecInfo), #0); ExecInfo.cbSize := SizeOf(ExecInfo); ExecInfo.lpVerb := 'runas'; ExecInfo.lpFile := PChar(ParamStr(0)); ExecInfo.lpParameters := '/toggle'; if ShellExecuteEx(@ExecInfo) then try WaitForSingleObject(ExecInfo.hProcess, INFINITE); finally CloseHandle(ExecInfo.hProcess); end; end; |
AW: Adminrechte für eine Prozedur
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich weiß nicht warum das so kompliziert sein muss. Wenn ich es richtig verstanden habe, möchtest Du aus deinem laufenden Programm eine Methode mit Admin Rechten aufrufen, ohne dass das Programm als Admin gestartet wurde und das ist ohne weiteres machbar. Leider hört man immer wieder das es nicht geht, aber ja, es geht und es funktioniert tadellos. Natürlich auch mit W10. In deine konkreten Fall, möchtest Du einen REG Eintrag in der HKLM setzen und das geht, auf einer Workstation, ergo Client Rechner, nur mit erweiterten Rechten. Beim Server, wenn man als Admin angemeldet ist, braucht man das nicht. Also höhere Rechte anfordern. Windows ist so easy und erledigt alles benötigte selbst. Wenn Du als Admin angemeldet bist greift die UAC und fragt ob Du das zulassen möchtest. Solltest Du aber als Standardbenutzer arbeiten erscheint die Anmeldemaske, ergo LogIn Fenster, und verlangt die Eingabe eines Kontos/Pass mit höheren Rechten. Erfolgt keine passende Authentifizierung geht es nicht weiter und der Versuch wird abgebrochen. Der User kann im Programm weiterarbeiten bzw. kannst Du den User aufmerksam machen das die Einstellung gesetzt werden muss. Nun kann er, wenn nicht Admin, den Admin-Gott rufen um die Einstellung zu setzen. Im Anhang findest Du die Lösung deines Problems. Schreibe die Methode um und et voilà, schon ist das Essen angerichtet... Axel |
AW: Adminrechte für eine Prozedur
Zitat:
Du hast halt um deine "einfache Funktion" noch ganz viele Helperfunktionen geschrieben. |
AW: Adminrechte für eine Prozedur
Zitat:
Geschrieben hat es Alex [See: ![]() Aus dem Russischem übertragen wurde es von: lu-rd [see: ![]() Orginal Post: ![]() Tatsache ist: Ich stand vor dem selben Problem. Es musste ein HKLM Eintrag gesetzt werden damit beim Neustart bestimmte Aktionen abgearbeitet werden konnten. Da es nicht zumutbar bzw. kein guter Programmierstil ist, von dem User zu verlangen, das Programm zu beenden, um es dann per re.Maus als Admin zu starten, habe ich es am Anfang mit den JEDI's (jwapi/jwscl) erledigt bis mich ein befreundeter Rus. Programmierer auf die Unit aufmerksam gemacht hat. Ja, es ist richtig das auch hier ShellExecute zum Einsatz kommt, was den sonnst? Anders geht es nicht. Primär geht es darum den Code zu kapseln/auszulagern um ihn immer wieder verwenden zu können. Und das ist mit der Unit perfekt geschehen. Axel |
AW: Adminrechte für eine Prozedur
Zitat:
|
AW: Adminrechte für eine Prozedur
Zitat:
sorry, Ich hab wohl etwas überreagiert. Hmmm, der Satzt kommt mir irgendwie bekannt vor... ("Kill Bill Vol.2") :thumb: Axel |
AW: Adminrechte für eine Prozedur
Wobei es so ist, dass der TE die am einfachsten zu realisierende Variante schon selber genannt hat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz