新建的进程的window station 和desktop 指定为了winsta0\\default了,
但是只有在单用户登陆的情况下才可以显示,否则显示出来的只能为第一个登陆的用户所见。如果要另一用户可见,则必须注销当前的用户登陆新用户再创建。注:是在用户登陆以后给服务程序发消息创建进程。

解决方案 »

  1.   

    XP下不是可以进行用户切换吗,不注销就可以登陆其它用户,可以有多个用户同时登陆。mircosoft mstsc是怎么回事?能详细些吗?
      

  2.   

    那你用GetUserName 得到当前的用户名,如果用户名不同就建立进程吧。关键不知道你的服务进程是如何建立进程的。
      

  3.   

    我是这样创建进程的:         STARTUPINFO si;
    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);
    }
      

  4.   

    用户登陆后启动另外的一个应用程序,此应用程序通过ControlService函数来发送自定义的消息给服务程序,然后服务程序在ControlHandler中处理此消息创建进程。
      

  5.   

    系统服务交互
    从编程的角度来看,需要分两种情况来讨论。服务器进程接收到客户机进程的直接请求。
    在这种情况下,可能会通过 LPC 或 RPC 传送消息。无论是通过 LPC 还是 RPC,都由 API 来获取客户端令牌。一旦获得客户端令牌,服务器就可调用 advapi32!CreateProcessAsUser。假设客户端用户令牌具有会话标记(应该如此),则将在正确的窗口站调用进程。注意:advapi32!CreateProcessAsUser 当前不支持各会话间的句柄继承。服务器进程接收到某种形式的通知,需要显示用户界面,但它不必位于当前用户的环境中。
    在这种情况下,服务器进程可以复制其主进程令牌,并将会话标识符更改为当前的会话标识符。要检索控制台上当前会话的会话 ID,请使用公共 API WTSGetActiveConsoleSessionID()。注意:为了设置令牌会话 ID,您需要具有 SE_TCB_PRIVILEGE。它只能作为在 NT AUTHORITY\SYSTEM 中运行的服务来拥有。
      

  6.   

    用户切换的时候是会话切换,所以窗口站也会切换,所以你在WinSta0\\Default建立窗口就只能在winsta0窗口站被看到。你要在不同的窗口站建立窗口。http://www.microsoft.com/china/msdn/library/techart/fastuserswit.asp#fastuserswit_topic2
    MSDN也有相关内容~
      

  7.   

    CreateProcessAsUser,使用这个可以!给分.