读书人

CreateProcessAsUser调用有关问题

发布时间: 2013-03-21 10:08:17 作者: rapoo

CreateProcessAsUser调用问题
为了实现远程连接也能和服务程序交互,以下是我实现的代码,但是执行完既没报错也没看到服务程序启动,连任务管理器里面都没有该进程(把显示所有用户的进程勾起来也是一样)。原先直接用CreateProcess创建进程倒是可以,但是就是只能本机本地交互,其它登入用户都没办法交互,我的服务程序本身是可以允许交互的(CreateService参数有设置SERVICE_INTERACTIVE_PROCESS,且在控制面板里面的服务--登入也看过了,是允许交互的)。

代码如下:
BOOL RunProcess(int ProcessIndex)
{
char* pProcessNames;
pProcessNames = ProcessNames[ProcessIndex];
if (pProcessNames[strlen(pProcessNames)-1] == '\\')
return false;

//获取服务进程Token
HANDLE hTokenThis = NULL;
HANDLE hTokenDup = NULL;
BOOL bResult = GetTokenByName(hTokenThis, "EXPLORER.EXE");
if (!bResult)
{
WriteLog(pLogFile, "Failed to GetTokenByName!");
return FALSE;
}
//复制服务进程的Token然后修改其中的SessionId,用于在用户桌面上创建一个具有SYSTEM权限的新进程
bResult = DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED,NULL, SecurityIdentification, TokenPrimary, &hTokenDup);
if (!bResult)
{
CloseHandle(hTokenThis);
WriteLog(pLogFile, "Failed to DuplicateTokenEx!");
return FALSE;
}

//遍历出活动SessionId
DWORD dwSessionId = 0;
WTS_SESSION_INFO* sessionInfo = NULL;
DWORD ndSessionInfoCount;
bResult = WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessionInfo, &ndSessionInfoCount);
if (!bResult)
{
CloseHandle(hTokenDup);
CloseHandle(hTokenThis);
WriteLog(pLogFile, "Failed to WTSEnumerateSessions!");
return FALSE;
}
for(unsigned int i=0; i<ndSessionInfoCount; i++)
{
if( (sessionInfo[i].State == WTSActive) || (sessionInfo[i].State == WTSDisconnected) )
{
//修改Token中的SessionId
dwSessionId = sessionInfo[i].SessionId;
bResult = SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD));
if (!bResult)
{
CloseHandle(hTokenDup);
CloseHandle(hTokenThis);
WriteLog(pLogFile, "Failed to SetTokenInformation!");
return FALSE;
}

//创建进程
STARTUPINFO startUpInfo;
ZeroMemory(&startUpInfo, sizeof(STARTUPINFO));
startUpInfo.cb = sizeof(STARTUPINFO);
startUpInfo.lpDesktop = "WinSta0\\Default";
LPVOID pEnv = NULL;
bResult = CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE); //创建进程环境块
if (!bResult)
{
CloseHandle(hTokenDup);
CloseHandle(hTokenThis);
WriteLog(pLogFile, "Failed to CreateEnvironmentBlock!");
return FALSE;
}
bResult = CreateProcessAsUser(
hTokenDup,
NULL,
ProcessNames[ProcessIndex],
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,
pEnv,
NULL,
&startUpInfo,
&pProcInfo[ProcessIndex]);
if (!bResult)
{
CloseHandle(hTokenDup);
CloseHandle(hTokenThis);
DestroyEnvironmentBlock(&pEnv);
WriteLog(pLogFile, "Failed to CreateProcessAsUser!");
return FALSE;
}
}
}

//关闭句柄
CloseHandle(hTokenDup);
CloseHandle(hTokenThis);
return TRUE;
}

照理来说这样处理后应该是在活动Session中创建进程了,但是事实上却是没有,不知道谁可以帮我看下是不是参数或则哪里不对,感激不尽。。


[解决办法]
童鞋这么晚了还在钻研C++,俺很汗颜~~等待学习
[解决办法]
我只随便copy了个代码过来. 具体你要做什么需要你自己去判断.

关于API的使用建议你直接用分类法看MSDN肯定能找到你需要的API.

读书人网 >C++

热点推荐