首页
社区
课程
招聘
[求助]CreateProcessAsUser创建进程出错
发表于: 2012-1-13 11:53 9662

[求助]CreateProcessAsUser创建进程出错

2012-1-13 11:53
9662
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <winnt.h>

using namespace std;

void Start(char *user,char *pass,char *path)
{
    HANDLE Token=NULL;
    if(LogonUser(user,NULL,pass,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&Token))
    {
        printf("Token Ok!\n");
        STARTUPINFO StartupInfo;
        memset(&StartupInfo,0,sizeof(StartupInfo));
        StartupInfo.cb = sizeof(StartupInfo);
        //StartupInfo.lpDesktop = "winsta0\\default";
        PROCESS_INFORMATION ProcInfo;
        memset(&ProcInfo,0,sizeof(ProcInfo));
        if(CreateProcessAsUser(Token,path,NULL, NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE , NULL, NULL, &StartupInfo, &ProcInfo))
        {
            printf("Start Ok!\n");
        }
        else
        {
            printf("%d\n",GetLastError());  
        }
    }     
}

int main(int argc, char* argv[])
{
    Start("ceshi","123456","C:\\Temps.exe");
    system("pause");
    return 0;
}


提示temps.exe的错误:应用程序正常初始化失败

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
干嘛要用这个创建进程呢。。
2012-1-13 13:23
0
雪    币: 101
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我知道有其他方法,我只是想知道这个为什么出错了
2012-1-13 13:47
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个问题微软讲的很详细了,
具体内容见
http://support.microsoft.com/kb/165194
就是新登录的用户令牌没有当前桌面的访问权,
这样创建进程无法成功,成功了也无法绘制UI
你仿照文中的方法,给用户令牌授予当前桌面的访问权限就行了
我用你的代码,可以运行控制台程序,果然UI绘制不出来
就是这个原因,会提示初始化失败,或者user32无法加载,或者不显示界面!!
下图为证:

a.exe是运行的控制台程序,运行成功,输出helloword
但是弹出的MessageBox,却绘制失败,显示为空白
上传的附件:
2012-1-13 18:34
0
雪    币: 101
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
问题是我添加了:
StartupInfo.lpDesktop = "winsta0\\default";还是不行,有图有真相
上传的附件:
  • 1.png (15.08kb,107次下载)
2012-1-13 20:55
0
雪    币: 101
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呀咩的,实在是没找到原因
2012-1-14 02:24
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵,看来你还是没看明白,不是简单的一句
StartupInfo.lpDesktop = "winsta0\\default";
就能解决

你仔细看看例子,要象微软给的最后例子一样写,很复杂的
不是简单的一句话能解决的
呵呵
如果真的看不明白,我再帮你写出完整代码吧
2012-1-14 19:49
0
游客
登录 | 注册 方可回帖
返回
//