对VISTA不熟悉.找来找去都是类似下面的代码,
能不能不需要CreateProcessAsUser创建进程副本,直接把当前进程的session id替换成别的?
"SeDebugPrivilege
WTSGetActiveConsoleSessionId  用这个能实现替换自身服务进程的session 吗?
WinSta0\\Default"HANDLE hThisProcess = GetCurrentProcess(); // 获取当前进程句柄// 打开当前进程令牌
HANDLE hTokenThis = NULL;
OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);// 复制一个进程令牌,目的是为了修改session id属性,以便在其它session中创建进程
HANDLE hTokenDup = NULL;
DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED,NULL, SecurityIdentification, TokenPrimary, &hTokenDup);
DWORD dwSessionId = WTSGetActiveConsoleSessionId(); // 获取活动session id,这里要注意,如果服务器还没有被登录而使用了远程桌面,这样用是可以的,如果有多个session存在,不能简单使用此函数,需要枚举所有session并确定你需要的一个,或者干脆使用循环,针对每个session都执行后面的代码
SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD)); // 把session id设置到备份的令牌中// 好了,现在要用新的令牌来创建一个服务进程。注意:是“服务”进程!如果需要以用户身份运行,必须在前面执行LogonUser来获取用户令牌
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = "WinSta0\\Default";LPVOID pEnv = NULL;
DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE; // 注意标志
CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE); // 创建环境块
// 创建新的进程,这个进程就是你要弹出窗口的进程,它将工作在新的session中
CreateProcessAsUser(hTokenDup, NULL, _T("D:\\GetUserName.exe"), NULL, NULL, FALSE, dwCreationFlag, pEnv, NULL, &si, &pi);

解决方案 »

  1.   

    http://www.cnblogs.com/lifeengines/archive/2008/08/26/1277054.html
    自己找到了个...就是上面说的.不需要以Session用户创建进程,只需要替换令牌就可以了
      

  2.   

    你要替换令牌是为了什么?
    一般都是拿当前的explorer.exe的token,然后以当前session创建进程
      

  3.   

    需要程序与桌面交互.是屏幕抓图的功能.
    本来在XP下正常了.但是到了VISTA都是抓不到图.是服务启动的.
    但是看到的资料都是以Session用户创建进程.比较少直接替换的不要新建立进程的那种
      

  4.   


    为什么需要创建进程??替换自身的服务进程的session不行吗?
      

  5.   

    好像不行吧,session是在进程创建前设置了,你服务已经在运行了,怎么设置它的session呀,还有vista下启动服务得是在session0上运行的,除非你有办法使服务启动前把它的session设为当前登陆的session