Используя метод, предложенный Скоттом В., этот код работал для меня. Возможно, что-то из этого потребуется настроить в зависимости от конкретной сетевой среды.
procedure ChangeLoggedInUser(username, password, domain: string);
var
creds: Cardinal;
begin
try
if LogonUser(PChar(username)
,PChar(domain)
,PChar(password)
,LOGON32_LOGON_NETWORK
,LOGON32_PROVIDER_DEFAULT
,creds
)
then begin
ImpersonateLoggedOnUser(creds);
end
else begin
RaiseLastOSError;
end;
finally
//wipe the memory for security
FillChar(username,SizeOf(username),#0);
FillChar(password,SizeOf(username),#0);
FillChar(domain,SizeOf(username),#0);
end; //try-finally
end;
Этот код можно назвать так:
...
//at this point i am logged in as whoever is logged into the local machine
DoSomethingMundane;
//change credentials of the current thread
ChangeLoggedInUser('importantuser','secretpassword','mydomain');
//now my process will be logged in as "importantuser"
DoSomethingThatRequiresCreds;
//go back to normal
ReverToSelf;
//now my process is back to normal
DoSomethingMundane;