AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Verständnisfrage Elevation und Impersonation
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage Elevation und Impersonation

Ein Thema von Der schöne Günther · begonnen am 21. Feb 2014 · letzter Beitrag vom 21. Feb 2014
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 12:37
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.
Das LogonUser und ImpersonateLoggedOnUser funktioniert. Das sehe ich beispielsweise daran, wenn ich auf Dateien zugreifen möchte- Blockiere ich einem Benutzer explizit den Schreibzugriff auf die Datei, gebe mich dann als dieser aus, kann ich dort auch nicht mehr schreiben.

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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 12:53
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.
Sofern dein Adminbenutzer Zugriff auf die Systemdateien hat, solltest du die definitiv löschen können. Um auf HKEY_CURRENT_USER Keys zuzugreifen, musst du erst noch MSDN-Library durchsuchenLoadUserProfile aufrufen, wenn ich mich recht erinnere. HKEY_LOCAL_MACHINE sollte aber eigentlich ohne Probleme funktionieren.

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:
http://www.delphipraxis.net/160355-s...t-starten.html
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (21. Feb 2014 um 13:03 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:06
Nein, das ist definitiv nicht der Fall. Beispiel: Textdatei direkt auf C:\ schreiben.

Delphi-Quellcode:
procedure TForm20.Button1Click(Sender: TObject);
var
   strings: TStrings;
begin
   strings := TStringList.Create();
   strings.Append('Hallo Welt');
   strings.SaveToFile('c:\textfile.txt');
end;
Führt man das als "normaler Benutzer" aus: Zugriff verweigert. Führt man das mit einem normalen Administratorkonto aus: Geht.

Soweit alles wie erwartet.

Gebe ich mich vor dem Schreibvorgang als Admin aus:

Delphi-Quellcode:
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;
funktioniert es weder ("Zugriff verweigert"), wenn ich die Datei als normaler Benutzer starte, noch als Admin. Das verstehe ich auch nicht.


--
Die Methode "Impersonate" habe ich glaube ich einfach von Luckie gestohlen
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;
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:33
Nein, das ist definitiv nicht der Fall. Beispiel: Textdatei direkt auf C:\ schreiben.

Delphi-Quellcode:
procedure TForm20.Button1Click(Sender: TObject);
var
   strings: TStrings;
begin
   strings := TStringList.Create();
   strings.Append('Hallo Welt');
   strings.SaveToFile('c:\textfile.txt');
end;
Führt man das als "normaler Benutzer" aus: Zugriff verweigert. Führt man das mit einem normalen Administratorkonto aus: Geht.
Das sollte bei aktivierter UAC aber definitiv nicht der Fall sein.

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:
  1. 2.Prozess (zeigt aber jedes Mal eine UAC Meldung an)
  2. TaskScheduler
  3. System Service
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (21. Feb 2014 um 13:36 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:38
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.
Alles klar, das war dann wohl ein Missverständnis meinerseits. Ich dachte, damit würde ich gleichzeitig in meinem Thread auch die Rechte des Administrators erhalten.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:42
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.
Alles klar, das war dann wohl ein Missverständnis meinerseits. Ich dachte, damit würde ich gleichzeitig in meinem Thread auch die Rechte des Administrators erhalten.
Auf einem System mit deaktivierter UAC würde das auch perfekt funktionieren. Mit UAC bekommst du leider nicht das "richtige" Admintoken und damit auch nicht die vollen Rechte des Administratoraccounts.

Ich schildere demnächst mal mein konkretes Problem, wahrscheinlich brauche ich noch nicht einmal Administratorrechte.
Alles klar, aber falls du doch Adminrechte benötigst, kann ich dir schon sagen, dass du um eintweder eine UAC Meldung oder eine vorherige Installation nicht umherkommst (sofern du die UAC nicht komplett abschalten willst).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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