Kopiuj
type
runinfo = record
wynik:boolean;
phandle:cardinal;
errortext:string;
end;
function CreateProcessWithLogonW(
lpUsername,
lpDomain,
lpPassword:PWideChar;
dwLogonFlags:dword;
lpApplicationName: PWideChar;
lpCommandLine: PWideChar;
dwCreationFlags: DWORD;
lpEnvironment: Pointer;
lpCurrentDirectory: PWideChar;
const lpStartupInfo: tSTARTUPINFO;
var lpProcessInformation: TProcessInformation ): BOOL; stdcall; external 'advapi32.dll';
Function RunAsUser(const filename,username,password:string;Domena:string='.'):runinfo;
var
StartupInfo: tStartupInfo;
ProcessInfo: TProcessInformation;
wfilename,wusername,wpassword,wdomena:pwidechar;
function LastErrorText:string;
var
blad:cardinal;
s:string;
begin
blad:=GetLastError;
s:=SysErrorMessage(blad);
if s='' then s:='nieznanej';
result:=Format('Błąd nr %d o treści "%s"', [blad, s]);
end;
begin
FillChar (StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOWNORMAL;
GetMem( wfilename, Length( filename ) * SizeOf( WideChar ) + SizeOf(WideChar ) ) ;
GetMem( wusername, length(username) * SizeOf( WideChar ) + SizeOf(WideChar ) ) ;
GetMem( wpassword, length(password) * SizeOf( WideChar ) + SizeOf(WideChar ) ) ;
GetMem( wdomena, length(Domena) * SizeOf( WideChar ) + SizeOf (WideChar));
StringToWideChar( filename, wfilename, Length( filename ) * SizeOf(WideChar ) + SizeOf( WideChar ) ) ;
StringToWideChar( username, wusername, Length( username ) * SizeOf(WideChar ) + SizeOf( WideChar ) ) ;
StringToWideChar( password, wpassword, Length( password ) * SizeOf(WideChar ) + SizeOf( WideChar ) ) ;
StringToWideChar( Domena, wdomena , Length(Domena)* SizeOf(WideChar ) + SizeOf( WideChar ) ) ;
result.wynik:=CreateProcessWithLogonW(wusername,nil,wpassword,0, wfilename, nil,
0, nil, nil,StartupInfo , ProcessInfo);
if not Result.wynik then Result.errortext:=LastErrorText;
Result.phandle:= ProcessInfo.hProcess ;
freemem(wfilename);
freemem(wusername);
freemem(wpassword);
end;
Kopiuj
var
res:runinfo;
begin
res:=RunAsUser('twój_program.exe','Gość','','.');
if not res.wynik then
ShowMessage(res.errortext);