Luckie hat
hier einen Code gepostet, mit dem es möglich ist, Aktionen unter einem anderen Benutzeraccount auszuführen.
Delphi-Quellcode:
const
USER = 'Hansbambel';
PW = 'geheim';
function GetCurrUserName: string;
var
Size : DWORD;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
SetLength(Result, Size);
if GetUserName(PChar(Result), Size) then
SetLength(Result, Size)
else
Result := '';
end;
function Impersonate(const User, PW: string): Boolean;
var
LogonType : Integer;
LogonProvider : Integer;
TokenHandle : THandle;
strAdminUser : string;
strAdminDomain : string;
strAdminPassword : string;
begin
LogonType := LOGON32_LOGON_INTERACTIVE;
LogonProvider := LOGON32_PROVIDER_DEFAULT;
strAdminUser := USER;
strAdminDomain := '';
strAdminPassword := PW;
Result := LogonUser(PChar(strAdminUser), nil,
PChar(strAdminPassword), LogonType, LogonProvider, TokenHandle);
if Result then
begin
Result := ImpersonateLoggedOnUser(TokenHandle);
CloseHandle(TokenHandle);
end;
end;
// Möglicher Aufruf
procedure TForm1.Button1Click(Sender: TObject);
begin
if Impersonate(USER, PW) then
begin
ShowMessage(GetCurrUserName);
RevertToSelf;
ShowMessage(GetCurrUserName);
end
else
MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', 0);
end;
Zur Kontrolle wird der Benutzername ausgegeben. Das funktioniert unter Windows XP SP2 mit eingeschränkten Benutzerrechten. Unter Windows 2000 dürfte es Probleme mit den Privilegien geben, da dort das Privileg SE_TCB_NAME erforderlich ist, welches in der Regel nur Dienste Besitzen.
Mit der Funtkion
RevertToSelf wird die Ausführung unter diesem Benutzer wieder aufgehoben.
Nähere Informationen und das nötige Hintergrundwissen erfahrt ihr in
Luckies Artikel auf seiner Homepage.