BOOL CreateProcessAsLogonUser(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandle,
DWORD dwCreateFlags,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
)
{
BOOL bRet = FALSE;
HANDLE hToken = NULL;
HANDLE hDuplicatedToken = NULL;
LPVOID lpEnvironment = NULL;
__try
{
DWORD dwSessionId = WTSGetActiveConsoleSessionId();
if
(dwSessionId == 0xffffffff)
{
return
FALSE;
}
bRet = WTSQueryUserToken(dwSessionId, &hToken);
if
(!bRet)
{
__leave;
}
bRet = DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hDuplicatedToken);
if
(!bRet)
{
__leave;
}
bRet = CreateEnvironmentBlock(&lpEnvironment, hDuplicatedToken, FALSE);
if
(!bRet)
{
__leave;
}
bRet = CreateProcessAsUser(
hDuplicatedToken,
lpApplicationName,
lpCommandLine,
lpProcessAttributes,
lpThreadAttributes,
bInheritHandle,
dwCreateFlags | CREATE_UNICODE_ENVIRONMENT,
lpEnvironment,
lpCurrentDirectory,
lpStartupInfo,
lpProcessInformation
);
if
(!bRet)
{
__leave;
}
bRet = TRUE;
}
__finally
{
if
(lpEnvironment)
{
DestroyEnvironmentBlock(lpEnvironment);
lpEnvironment = NULL;
}
if
(hDuplicatedToken)
{
CloseHandle(hDuplicatedToken);
hDuplicatedToken = NULL;
}
if
(hToken)
{
CloseHandle(hToken);
hToken = NULL;
}
}
return
bRet;
}