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);
end;
end;
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 gebe ich den Benutzernamen aus. Funktioniert unter Windows XP SP2 mit eingeschränkten Benutzerrechten. Unter Windows 2000 dürfte es, wie Basilikum schon bemerkt hat, Probleme mit den Privilegien geben, da dort das Privileg SE_TCB_NAME erforderlich ist, welches in der Regel nur Dienste Besitzen.