this procedure will allow you to impersonate another user:
procedure TForm1.RunAs (str_user_name, str_password, str_server,
str_command : string);
var
si: TSTARTUPINFO;
pif: PROCESS_INFORMATION;
wUsername : PWideChar;
wServer : PWideChar;
wPassword : PWideChar;
wCommand : PWideChar;
success : boolean;
begin
FillChar (si, SizeOf (si), #0);
si.cb := SizeOf(tstartupinfo);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_SHOWDEFAULT;
si.lpReserved := nil;
si.lpDesktop := nil;
si.lpTitle := nil;
GetMem (wServer, Length (str_server) * SizeOf(WideChar) +
SizeOf(WideChar));
GetMem (wUsername, Length (str_user_name) * SizeOf(WideChar) +
SizeOf(WideChar));
GetMem (wPassword, Length (str_password) * SizeOf(WideChar) +
SizeOf(WideChar));
GetMem (wCommand, Length (str_command) * SizeOf(WideChar) +
SizeOf(WideChar));
try
//Convert the fourth main properties to WideString data type
StringToWideChar (str_server, wServer, Length (str_server) *
SizeOf(WideChar) + SizeOf(WideChar));
StringToWideChar (str_user_name, wUsername, Length (str_user_name) *
SizeOf(WideChar) + SizeOf(WideChar));
StringToWideChar (str_password, wPassword, Length (str_password) *
SizeOf(WideChar) + SizeOf(WideChar));
StringToWideChar (str_command, wCommand, Length (str_command) *
SizeOf(WideChar) + SizeOf(WideChar));
success := CreateProcessWithLogonW (wUsername, wServer, wPassword, 0,
nil, wCommand, 0, nil, nil, si, pif);
// Wait for the command to end
// WaitForSingleObject (pif.hProcess,INFINITE);
if success then
begin
CloseHandle (pif.hProcess);
CloseHandle (pif.hThread);
end
else
RaiseLastOSError;
finally
FreeMem (wServer);
FreeMem (wUsername);
FreeMem (wPassword);
FreeMem (wCommand);
end;
end;