![]() |
Verständnisfrage Elevation und Impersonation
Eine ganz dumme Frage:
Ein Prozess läuft in einem normalen Benutzeraccount. Der Prozess hat allerdings eine Möglichkeit, an die momentan gültigen Anmeldedaten (Benutzername, Passwort) eines Administrator-Accounts zu kommen. Das soll er nutzen, um einen Registry-Schlüssel in HKLM zu ändern. Ist das möglich? Als reiner Laie habe ich es als erstes mit reiner "Impersonation" versucht (sprich
Delphi-Quellcode:
und dann
LogonUser(..)
Delphi-Quellcode:
). Die zweite Möglichkeit wäre, einen komplett neuen Prozess für diese Aufgabe unter dem gewünschten Benutzeraccount zu starten, aber das funktioniert ebenso wenig.
ImpersonateLoggedOnUser(..)
Ich weiß, die Windows-UAC-Geschichte sollte langsam jeder mitbekommen haben. Ich nicht. Sehe ich das richtig, dass ich an diesem Dialog für den Benutzer nicht vorbeikommen werde? |
AW: Verständnisfrage Elevation und Impersonation
Ich habe vor Kurzem entdeckt wie sich
![]() Und zwar ist im Windows Taskplaner eine Aufgabe mit dem Namen "CCleanerSkipUAC" eingetragen. Es sind keine Trigger eingetragen so dass man die Aufgabe nur manuell starten kann. Ausserdem ist das Flag "Mit höchsten Berechtigungen ausführen" gesetzt. Mit der Kommandozeile
Code:
kann man die Aufgabe starten was dazu führt das CCleaner.exe mit Adminrechten gestartet wird.
schtasks /run /TN CCleanerSkipUAC
Es gibt auch eine API mit der man auch Parameter für die Exe übergeben kann. Auf jeden Fall ein interessanter Ansatz. |
AW: Verständnisfrage Elevation und Impersonation
Was genau hat denn bei LogonUser() und ImpersonateLoggedOnUser() nicht funktioniert? Was sagt GetLastError, etc? Ich vermute mal deinem Benutzerkonto fehlt das "SeImpersonatePrivilege", welches standardmäßig nur Administrator Accounts besitzen. In diesem Falle würde ich vermutlich einfach eine neue Instanz des eigenen Prozesses über CreateProcessAsUser() starten und per Parameter signalisieren, dass die entsprechende Admin Funktionalität ausgeführt werden soll.
|
AW: Verständnisfrage Elevation und Impersonation
Aber wenigstens benötigte der CCCleaner einmalig Adminrechte, um den Task anzulegen, oder?
|
AW: Verständnisfrage Elevation und Impersonation
Zitat:
Das Problem bei dieser Methode ist übrigens, dass die "höchsten Rechte" auf einem Limited Account, leider auch nur "limited" sind. Sprich: Der Taskplaner Trick zur Unterdrückung der UAC Meldung funktioniert nur auf Admin Accounts. |
AW: Verständnisfrage Elevation und Impersonation
Zitat:
Das scheint allerdings nur die "Persönlichkeit" an sich zu betreffen. Gebe ich mich beispielsweise als Administrator aus, kann ich trotzdem keine HKLM-Registry-Veränderungen durchführen oder Systemdateien löschen. Die Errorcodes reiche ich nach, Sorry :oops: |
AW: Verständnisfrage Elevation und Impersonation
Zitat:
![]() Ich vermute mal, dass LogonUser() dich zwar korrekt mit einem Adminaccount einloggt, aber leider auch nur das Restricted Admin Token zurückliefert. Edit: Grade nochmal nachgelesen. LogonUser() liefert tatsächlich nur das restrikted Token. Du könntest probieren dir das Linked Token zu extrahieren, wie ich es hier demonstriert habe: ![]() Ich vermute allerdings, dass dazu wiederrum bestimmte Privilegien / SYSTEM Context nötig sind, die du als normaler Administrator nicht besitzt. Andernfalls könnte man die UAC ja jederzeit umgehen. |
AW: Verständnisfrage Elevation und Impersonation
Nein, das ist definitiv nicht der Fall. Beispiel: Textdatei direkt auf C:\ schreiben.
Delphi-Quellcode:
Führt man das als "normaler Benutzer" aus: Zugriff verweigert. Führt man das mit einem normalen Administratorkonto aus: Geht.
procedure TForm20.Button1Click(Sender: TObject);
var strings: TStrings; begin strings := TStringList.Create(); strings.Append('Hallo Welt'); strings.SaveToFile('c:\textfile.txt'); end; Soweit alles wie erwartet. Gebe ich mich vor dem Schreibvorgang als Admin aus:
Delphi-Quellcode:
funktioniert es weder ("Zugriff verweigert"), wenn ich die Datei als normaler Benutzer starte, noch als Admin. Das verstehe ich auch nicht.
procedure TForm20.Button1Click(Sender: TObject);
var strings: TStrings; begin strings := TStringList.Create(); strings.Append('Hallo Welt'); if not TWindowsUser.Impersonate( 'admin', '1234567890' ) then Beep(); try strings.SaveToFile('c:\textfile.txt'); finally RevertToSelf(); end; end; -- Die Methode "Impersonate" habe ich glaube ich einfach ![]()
Delphi-Quellcode:
class function TWindowsUser.Impersonate(
const username: String; const password: String; const domain: String = Para_Impersonate_domain ): Boolean; var LogonType: Integer; LogonProvider: Integer; TokenHandle: THandle; strAdminUser: string; strAdminDomain: string; strAdminPassword: string; begin LogonType := LOGON32_LOGON_INTERACTIVE; LogonProvider := LOGON32_PROVIDER_DEFAULT or LOGON32_PROVIDER_WINNT50; {TODO -oJM -cDoc : ActionItem} // Token für den gewünschten Benutzer holen Result := LogonUser( PChar(username), PChar(domain), PChar(password), LogonType, LogonProvider, TokenHandle ); // Wenn das Token in Erfahrung gebracht werden konnte... if Result then begin Result := ImpersonateLoggedOnUser(TokenHandle); CloseHandle(TokenHandle); end; end; |
AW: Verständnisfrage Elevation und Impersonation
Zitat:
Warum es nach deiner Impersonation nicht funktioniert ist klar. LogonUser() liefert dir wie gesagt nur das restricted Admin Token. Das hat nicht mehr Rechte als ein eingeschränktes Benutzerkonto. Du hast folgende Möglichkeiten:
|
AW: Verständnisfrage Elevation und Impersonation
Zitat:
Danke für die Lösungsvorschläge, aber eine UAC-Meldung ist leider keine Option, die vorherige "Installation" versuche ich zu vermeiden. Ich schildere demnächst mal mein konkretes Problem, wahrscheinlich brauche ich noch nicht einmal Administratorrechte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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