function CreateProcessWithLogonW; external 'advapi32.dll' name 'CreateProcessWithLogonW';
procedure ExecAsDifferentUser(const AUserName: string;
const ADomain: string;
const APassword: string;
const ACommand: string;
out AProcessInf: TProcessInformation);
var
bSuccess : boolean;
recStartupInfo : TStartupInfoW;
begin
FillChar(recStartupInfo, SizeOf(recStartupInfo), #0);
recStartupInfo.cb:= SizeOf(recStartupInfo);
recStartupInfo.dwFlags:= STARTF_USESHOWWINDOW;
recStartupInfo.wShowWindow:= 1;
FillChar(AProcessInf, SizeOf(AProcessInf), #0);
SetLastError(0);
bSuccess := CreateProcessWithLogonW(
StringToOleStr(AUserName), // lpUsername,
StringToOleStr(ADomain), // lpDomain,
StringToOleStr(APassword), // lpPassword: PWideChar;
LOGON_WITH_PROFILE, // dwLogonFlags: DWORD;
StringToOleStr(''), // lpApplicationName,
StringToOleStr(ACommand), // lpCommandLine: PWideChar;
0, // dwCreationFlags: DWORD;
nil, // lpEnvironment: pointer;
StringToOleStr(''), // lpCurrentDirectory: PWideChar;
@recStartupInfo, // lpStartupInfo: PStartupInfoW;
@AProcessInf // lpProcessInformation: PProcessInformation
);
if not bSuccess then
RaiseLastOSError();
end;
--------------------------------------------------------------------------------
var
sCmd : string;
recProcessInfo : TProcessInformation;
const
ANY_EXE_PATH = 'C:\Windows\Notepad.exe';
ANY_EXE_PARAM = 'C:\Windows\System32\tsadmin.msc';
begin
sCmd := '"'+ANY_EXE_PATH+'" "'+ANY_EXE_PARAM+'"';
ExecAsDifferentUser('Administrator',
......
......,
sCmd,
recProcessInfo);
|