新建的进程的window station 和desktop 指定为了winsta0\\default了,
但是只有在单用户登陆的情况下才可以显示,否则显示出来的只能为第一个登陆的用户所见。如果要另一用户可见,则必须注销当前的用户登陆新用户再创建。注:是在用户登陆以后给服务程序发消息创建进程。
但是只有在单用户登陆的情况下才可以显示,否则显示出来的只能为第一个登陆的用户所见。如果要另一用户可见,则必须注销当前的用户登陆新用户再创建。注:是在用户登陆以后给服务程序发消息创建进程。
调试欢乐多
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpTitle = NULL;
si.lpDesktop = "WinSta0\\Default";
si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
si.dwFlags = 0;;
si.wShowWindow = SW_SHOW;
si.lpReserved2 = NULL;
si.cbReserved2 = 0;
if(!CreateProcess(NULL, "C:\\Test.exe",
NULL, NULL,false, 0,
NULL, NULL, &si, &pi))
ShowMessage("Start Program Error");
else
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
从编程的角度来看,需要分两种情况来讨论。服务器进程接收到客户机进程的直接请求。
在这种情况下,可能会通过 LPC 或 RPC 传送消息。无论是通过 LPC 还是 RPC,都由 API 来获取客户端令牌。一旦获得客户端令牌,服务器就可调用 advapi32!CreateProcessAsUser。假设客户端用户令牌具有会话标记(应该如此),则将在正确的窗口站调用进程。注意:advapi32!CreateProcessAsUser 当前不支持各会话间的句柄继承。服务器进程接收到某种形式的通知,需要显示用户界面,但它不必位于当前用户的环境中。
在这种情况下,服务器进程可以复制其主进程令牌,并将会话标识符更改为当前的会话标识符。要检索控制台上当前会话的会话 ID,请使用公共 API WTSGetActiveConsoleSessionID()。注意:为了设置令牌会话 ID,您需要具有 SE_TCB_PRIVILEGE。它只能作为在 NT AUTHORITY\SYSTEM 中运行的服务来拥有。
MSDN也有相关内容~