请教关于使用函数CreateProcessAsUser的问题 VC++ RunTime Error?详细的错误信息呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以独立运行你的那个MFC程序,看看是不是缺少MFC的动态库。对CreateProcessAsUser而言,是不是MFC的程序没有什么区别。 我来抛块砖,是我之前做这个的经验:CreateProcessAsUser这个函数的第一个参数是一个用户令牌(Token),然后这个令牌会携带很多信息。你说的报错那个问题,估计是因为Token中没有相关的GUI信息,貌似用LogonUser登录后需要做很多事情才能创建界面进程。我当时的情况是:那个地方没有使用LogonUser,而是由System账户调用CreateProcessAsUser启动线程,然后是查找系统中的explorer.exe进程,然后获取该进程的Token,然后用该Token调用CreateProcessAsUser创建新进程。还有就是环境变量的问题,可以参照如下:if(!CreateEnvironmentBlock(&lpEnvBlock, hUserToken, FALSE)) return GetLastError();if(!CreateProcessAsUser(hUserToken, strExePath, NULL, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, lpEnvBlock, strDirectory, &si, &pi)) return GetLastError();if(!DestroyEnvironmentBlock(lpEnvBlock)) return GetLastError();仅供参考! 先用hxfjb的方法看看是否是缺少库看看下面代码,以便我都这么用,没发现过有啥问题,good lucky!if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken)) { if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hNewToken)) { bRet = CreateProcessAsUser(hNewToken, NULL, szProcessName, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcInfo); CloseHandle(hNewToken); } CloseHandle(hToken); } } 我有碰到过用createprocessasuser创建的进程,虽然任务管理器看到的进程是USER的权限,但查找环境变量什么的都还是SYSTEM权限,为什么? 权限什么的由token决定,保存在内核空间,环境变量保存在用户空间的另一个地方,两者不相干createprocessasuser的Environment参数如果是0就继承父进程的环境变量 等等等等,首先,你说的正确;但是,为啥你的名字和我的一样啊??难道我不叫leeter? 但是我定义一个castring的变量 envp;然后createprocessAsUser的enveroment的值为envp,结果发现我的进程发生错误是1067,进程意外终止。 VSTO开发Word插件求助 WM_LBUTTONDOWN和WM_NCLBUTTONDOWNE有什么区别 MFC 如何在主窗口绘制的操作同时能绘制到子窗口上 [Win下实现透明打印],做过的大哥指点一下 资源描述文件????(API) 能否在VC程序中实现E_Mail功能?紧急,求救!!!!! 千分寻求配机方案 关于获得键盘的输入值! 求问摄像头的图像采集 VC编译器问题:总是提示.DSP文件是否需要checkout 谈谈我对glulookat()本质的看法,高手进来交流一下 关于实时数据采集的保存
CreateProcessAsUser这个函数的第一个参数是一个用户令牌(Token),然后这个令牌会携带很多信息。
你说的报错那个问题,估计是因为Token中没有相关的GUI信息,貌似用LogonUser登录后需要做很多事情才能创建界面进程。我当时的情况是:那个地方没有使用LogonUser,而是由System账户调用CreateProcessAsUser启动线程,然后是查找系统中的explorer.exe进程,然后获取该进程的Token,然后用该Token调用CreateProcessAsUser创建新进程。
还有就是环境变量的问题,可以参照如下:
if(!CreateEnvironmentBlock(&lpEnvBlock, hUserToken, FALSE))
return GetLastError();
if(!CreateProcessAsUser(hUserToken, strExePath, NULL, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, lpEnvBlock, strDirectory, &si, &pi))
return GetLastError();
if(!DestroyEnvironmentBlock(lpEnvBlock))
return GetLastError();仅供参考!
看看下面代码,以便我都这么用,没发现过有啥问题,good lucky!if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken))
{
if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
SecurityImpersonation, TokenPrimary, &hNewToken))
{
bRet = CreateProcessAsUser(hNewToken, NULL,
szProcessName, NULL, NULL, FALSE,
0, NULL, NULL, &StartupInfo, &ProcInfo);
CloseHandle(hNewToken);
}
CloseHandle(hToken);
}
}
等等等等,首先,你说的正确;
但是,为啥你的名字和我的一样啊??难道我不叫leeter?