int create_process_as_user(int nArgs, __wchar_t* thisApp)
{
long lError;
STARTUPINFO si;
PROCESS_INFORMATION pi;
__wchar_t szUserName[CREDUI_MAX_USERNAME_LENGTH + 1];
__wchar_t szPassword[CREDUI_MAX_PASSWORD_LENGTH + 1];
__wchar_t szDomain[CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1];
__wchar_t szUser[CREDUI_MAX_USERNAME_LENGTH + 1];
__wchar_t* pszTarget = NULL;
if(!is_windows_xp())
return FALSE;
szUserName[0] = L'\0';
szPassword[0] = L'\0';
szDomain[0] = L'\0';
memset(&si, 0, sizeof(STARTUPINFO));
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
__try
{
pszTarget = computer_name(ComputerNamePhysicalNetBIOS);
_RPT0(_CRT_WARN, "The computer name is ");
OutputDebugStringW(pszTarget != NULL ? pszTarget : L"");
_RPT0(_CRT_WARN, "\n");
lError = prompt_for_user_name_and_password(pszTarget, szUserName, CREDUI_MAX_USERNAME_LENGTH, szPassword, CREDUI_MAX_PASSWORD_LENGTH);
if(lError != NO_ERROR)
RaiseException(lError, 0, 0, 0);
if((lError = CredUIParseUserNameW(szUserName,
szUser,
CREDUI_MAX_USERNAME_LENGTH + 1,
szDomain,
CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1
)) != NO_ERROR)
{
_RPT1(_CRT_WARN, "CredUIParseUserName failed: Last Error = %ld\n", lError);
RaiseException(lError, 0, 0, 0);
}
GetStartupInfoW(&si);
si.lpDesktop = NULL;
_RPT0(_CRT_WARN, "Calling CreateProcessWithLogonW for application: ");
OutputDebugStringW(thisApp);
_RPT1(_CRT_WARN, "\nCommand Line: %s\nUser Name: ", GetCommandLineA());
OutputDebugStringW(szUser);
_RPT0(_CRT_WARN, "\nDomain: ");
OutputDebugStringW(szDomain);
_RPT0(_CRT_WARN, "\n");
if(!CreateProcessWithLogonW(szUser,
szDomain,
szPassword,
0UL,
thisApp,
GetCommandLineW(),
CREATE_UNICODE_ENVIRONMENT | CREATE_SUSPENDED,
NULL,
NULL,
&si,
&pi
))
RaiseException(GetLastError(), 0, 0, 0);
close_log_file();
if(log_file != NULL &&
_tcsnicmp(log_file, _T("CONOUT$"), 8) != 0)
_tchmod(log_file, S_IWRITE | S_IREAD);
ResumeThread(pi.hThread);
}
__finally
{
memset(&szUserName, 0, (CREDUI_MAX_USERNAME_LENGTH + 1) * sizeof(__wchar_t));
memset(&szPassword, 0, (CREDUI_MAX_PASSWORD_LENGTH + 1) * sizeof(__wchar_t));
if(pszTarget != NULL)
free(pszTarget);
if(pi.hProcess != (HANDLE)0)
CloseHandle(pi.hProcess);
if(pi.hThread != (HANDLE)0)
CloseHandle(pi.hThread);
}
return TRUE;
}