Also entweder reden wir aufgrund mangelnder gemeinsam akzeptierter Definition von "Admin-Fähigkeiten" aneinander vorbei
Ich denke das ist es. Oder ich hatte zu wenig Kaffee.
Ganz konkret:
- Zwei Benutzer, "localUser" und "localAdmin". Ersterer gehört nicht zur Gruppe "Administratoren", letzterer schon
- Eine aktive Sitzung im Benutzer "localUser". Der Benutzer doppelklickt unseren Prozess
- Der Prozess hat in seinem Manifest, wie wohl so ziemlich jeder,
Delphi-Quellcode:
requestedExecutionLevel
level="asInvoker"
- Der Prozess soll nun das Verzeichnis C:\Program Files\Watzn erstellen.
Kann er das? Dein Beitrag liest sich so als ginge das. Wenn ja, was ist dann hieran falsch?
Delphi-Quellcode:
uses
System.SysUtils,
WinApi.Windows;
const
adminName = '
localAdmin';
adminPwd = '
localAdmin';
function getAdminToken(): THandle;
begin
Win32Check( LogonUser(
adminName,
nil,
adminPwd,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
Result
) );
end;
procedure p();
var
adminToken: THandle;
begin
adminToken := getAdminToken();
try
Win32Check( ImpersonateLoggedOnUser(adminToken) );
try
Win32Check( CreateDirectory('
C:\Program Files\Watzn',
nil) );
finally
Win32Check( RevertToSelf() );
end;
finally
CloseHandle(adminToken);
end;
end;
Selbst bei TeamViewer kann man das beobachten: Der Benutzer führt einen TeamViewer-QuickSupport aus. Authentifiziert sich jemand von außen mit den Kontodaten eines Administrator-Accounts startet TeamViewer sich selbst noch einmal und beendet sich dann. So kannte ich es bislang.