bool
CreateUserSystemProcess(
const
wstring& procName)
{
HANDLE
hToken, hDuplicatedToken = NULL;
LPVOID
lpEnvironment = NULL;
bool
ret =
false
;
do
{
if
(!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
{
OutputTrace(L
"OpenProcessToken() error: %d\n"
, GetLastError());
break
;
}
if
(!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenPrimary, &hDuplicatedToken))
{
OutputTrace(L
"DuplicateTokenEx() error: %d\n"
, GetLastError());
break
;
}
DWORD
SessionId = WTSGetActiveConsoleSessionId();
if
(!SetTokenInformation(hToken, TokenSessionId, &SessionId,
sizeof
(
DWORD
)))
{
OutputTrace(L
"SetTokenInformation( ) error: %d\n"
, GetLastError());
break
;
}
if
(!CreateEnvironmentBlock(&lpEnvironment, hDuplicatedToken, FALSE))
{
OutputTrace(L
"CreateEnvironmentBlock() error: %d\n"
, GetLastError());
break
;
}
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
si.cb =
sizeof
(si);
if
(!CreateProcessAsUser(hToken, procName.c_str(), NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT,
lpEnvironment, NULL, &si, &pi))
{
OutputTrace(L
"CreateProcessAsUser() error: %d\n"
, GetLastError());
break
;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
OutputTrace(L
"CreateProcessAsUser() success...........\n"
);
}
while
(0);
if
(NULL != hToken)
CloseHandle(hToken);
if
(NULL != hDuplicatedToken)
CloseHandle(hDuplicatedToken);
if
(NULL != lpEnvironment)
DestroyEnvironmentBlock(lpEnvironment);
return
ret;
}