请教关于使用函数CreateProcessAsUser的问题

coolcorner 2008-01-11 02:03:02
最近通过使用logonuser及CreateProcessAsUser函数在服务中启动某应用程序。当此应用程序是MFC程序时,不能启动,报“VC++ RunTime Error...”错误,如果程序是非MFC程序就可启动,有没有哪位老大知道是怎么回事,谢谢!
...全文
2628 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
九州剑王 2012-11-02
  • 打赏
  • 举报
回复
MFC用静态库编译试试啊
bingkehanfeng 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
权限什么的由token决定,保存在内核空间,环境变量保存在用户空间的另一个地方,两者不相干

createprocessasuser的Environment参数如果是0就继承父进程的环境变量
[/Quote]但是我定义一个castring的变量 envp;然后createprocessAsUser的enveroment的值为envp,结果发现我的进程发生错误是1067,进程意外终止。
Lactoferrin 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 leeter 的回复:]

引用 6 楼 leeter 的回复:
我来抛块砖,是我之前做这个的经验:
CreateProcessAsUser这个函数的第一个参数是一个用户令牌(Token),然后这个令牌会携带很多信息。
你说的报错那个问题,估计是因为Token中没有相关的GUI信息,貌似用LogonUser登录后需要做很多事情才能创建界面进程。

我当时的情况是:那个地方没有使用LogonUser,而是由Syst……
[/Quote]
你们不是同一个号吗?
quwei197874 2011-05-11
  • 打赏
  • 举报
回复
不懂帮顶
青稞 2011-05-11
  • 打赏
  • 举报
回复
什么情况??
幻觉??
leeter 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 leeter 的回复:]
我来抛块砖,是我之前做这个的经验:
CreateProcessAsUser这个函数的第一个参数是一个用户令牌(Token),然后这个令牌会携带很多信息。
你说的报错那个问题,估计是因为Token中没有相关的GUI信息,貌似用LogonUser登录后需要做很多事情才能创建界面进程。

我当时的情况是:那个地方没有使用LogonUser,而是由System账户调用CreateProcessAs……
[/Quote]

等等等等,首先,你说的正确;
但是,为啥你的名字和我的一样啊??难道我不叫leeter?
Lactoferrin 2011-05-10
  • 打赏
  • 举报
回复
权限什么的由token决定,保存在内核空间,环境变量保存在用户空间的另一个地方,两者不相干

createprocessasuser的Environment参数如果是0就继承父进程的环境变量
minggo1981 2011-05-10
  • 打赏
  • 举报
回复
我有碰到过用createprocessasuser创建的进程,虽然任务管理器看到的进程是USER的权限,但查找环境变量什么的都还是SYSTEM权限,为什么?
wangweixing2000 2008-01-15
  • 打赏
  • 举报
回复
先用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);
}
}
leeter 2008-01-15
  • 打赏
  • 举报
回复
我来抛块砖,是我之前做这个的经验:
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();

仅供参考!
飞天舞 2008-01-14
  • 打赏
  • 举报
回复
???
junheng 2008-01-14
  • 打赏
  • 举报
回复
你这是不是在调试期间报的错?
你直接执行编译出来的程序试试,这种情况我以前也遇到过。
hxfjb 2008-01-14
  • 打赏
  • 举报
回复
你可以独立运行你的那个MFC程序,看看是不是缺少MFC的动态库。对CreateProcessAsUser而言,是不是MFC的程序没有什么区别。
DentistryDoctor 2008-01-13
  • 打赏
  • 举报
回复
VC++ RunTime Error?
详细的错误信息呢?
shelliu 2008-01-11
  • 打赏
  • 举报
回复
不知道,但很感兴趣,帮顶并关注中。。。。。。。。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧