Einzelnen Beitrag anzeigen

Der schöne Günther

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

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