http://msdn.microsoft.com/en-us/library/aa379608%28v=VS.85%29.aspx
BOOL WINAPI CreateProcessWithLogonW(
__in LPCWSTR lpUsername,
__in_opt LPCWSTR lpDomain,
__in LPCWSTR lpPassword,
__in DWORD dwLogonFlags,
__in_opt LPCWSTR lpApplicationName,
__inout_opt LPWSTR lpCommandLine,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCWSTR lpCurrentDirectory,
__in LPSTARTUPINFOW lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInfo
);
try this
do
{
WCHAR _domain [MAX_COMPUTERNAME_LENGTH + 1];
DWORD l = sizeof _domain;
if (!(_Result = GetComputerNameW (_domain, &l))) break;
LPWSTR
_login = argv[1],
_password = argv[2],
_cmdline = argv[3],
_path = argc > 4 ? argv[4] : NULL;
PROCESS_INFORMATION pi;
_STARTUPINFOW si = { sizeof (_STARTUPINFOW) };
_Result = CreateProcessWithLogonW (_login, _domain, _password,
LOGON_WITH_PROFILE, NULL, _cmdline, NULL, NULL, _path, &si, π);
if (!_Result) break;
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
}
while (false);
procedure TForm1.Button1Click(Sender: TObject);
var
hUserToken: THandle;
UserName, UserDomain, Password:WideString;
dwLogonType:DWORD;
begin
Memo1.Clear;
UserName:=Edit1.Text;
UserDomain:=Edit2.Text;
Password:=Edit3.Text;
dwLogonType:=LOGON32_LOGON_INTERACTIVE;
if ComboBox1.Text='LOGON32_LOGON_INTERACTIVE'
then dwLogonType:=LOGON32_LOGON_INTERACTIVE;
if ComboBox1.Text='LOGON32_LOGON_NETWORK'
then dwLogonType:=LOGON32_LOGON_NETWORK;
if ComboBox1.Text='LOGON32_LOGON_BATCH'
then dwLogonType:=LOGON32_LOGON_BATCH;
if ComboBox1.Text='LOGON32_LOGON_SERVICE'
then dwLogonType:=LOGON32_LOGON_SERVICE;
if not LogonUserW(PWChar(UserName), PWChar(UserDomain), PWChar(Password),
dwLogonType, LOGON32_PROVIDER_DEFAULT, hUserToken) then
begin
Memo1.Lines.Add(SysErrorMessage(GetLastError));
end else
Memo1.Lines.Add(SysErrorMessage(GetLastError));
CloseHandle(hUserToken);
end;