首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

CreateProcessAsUser调用有关问题

2013-03-21 
CreateProcessAsUser调用问题为了实现远程连接也能和服务程序交互,以下是我实现的代码,但是执行完既没报错

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.

热点排行