在windows2008下
用 logonUser 获得Token 然后用这个Token 去 CreateProcessAsUser 现在的问题是 利用logonUser 获得的Token  是在session 0 下面的,不可以和用户交互,需要setTokenInformation 将Token 中的Session ID 改为 1(当前用户Session ID),但这样一来 调用的外部应用程序 无法正常显示。如下图:但如果利用“explorer.exe” 获取Token,此Token的Session ID 不是0(应该是当前用户的 Session),利用这个Token CreateProcessAsUser 就可正常显示 exe程序的界面 如图
我觉得是用LogonUser 获得Token 应该是不完整吧(与“explorer.exe”获得Token相比)
但不知道应该如何修改,还请高人 指点!! 
代码如下:   IntPtr hToken = IntPtr.Zero;
            Boolean result = false;
           result = LogonUser(
                   strName,
                   strDomain,
                   strPwd,
                   LogonType.LOGON32_LOGON_INTERACTIVE,
                   LogonProvider.LOGON32_PROVIDER_DEFAULT,
                   out hToken
               );
//
 IntPtr hDupedToken = IntPtr.Zero;            PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
            SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
            sa.Length = Marshal.SizeOf(sa);            STARTUPINFO si = new STARTUPINFO();
            si.cb = Marshal.SizeOf(si);            int dwSessionID = 1;
            result = DuplicateTokenEx(
                  hToken,
                  GENERIC_ALL_ACCESS,
                  ref sa,
                  (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
                  (int)TOKEN_TYPE.TokenPrimary,
                  ref hDupedToken
               );            if (!result)
            {
                ShowMessageBox("DuplicateTokenEx failed", "AlertService Message");
            }
  result = SetTokenInformation(hDupedToken, TOKEN_INFORMATION_CLASS.TokenSessionId,     ref dwSessionID, (UInt32)IntPtr.Size);
            if (!result)
            {
                ShowMessageBox("SetTokenInformation failed", "AlertService Message");
            }
      IntPtr lpEnvironment = IntPtr.Zero;            //
            Int32 dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
            result = CreateEnvironmentBlock(ref lpEnvironment, hDupedToken, true);
            if (result)
            {
                    dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
            }            if (!result)
            {
                ShowMessageBox("CreateEnvironmentBlock failed", "AlertService Message");
            }
//
         result = CreateProcessAsUser(
                                 hDupedToken,
                                 path + app,
                                 String.Empty,
                                 ref sa, ref sa,
                                 false, dwCreationFlags, lpEnvironment,
                                 path, ref si, ref pi);            if (!result)
            {
                int error = Marshal.GetLastWin32Error();
                string message = String.Format("CreateProcessAsUser Error: {0}", error);
                message = GetLastErrorMessage(error);
                ShowMessageBox(message, "AlertService Message");
            }
            //string testX = si.lpDesktop;
            if (pi.hProcess != IntPtr.Zero)
                CloseHandle(pi.hProcess);
            if (pi.hThread != IntPtr.Zero)
                CloseHandle(pi.hThread);
            if (hToken != IntPtr.Zero)
                CloseHandle(hToken);
            if (hDupedToken != IntPtr.Zero)
                CloseHandle(hDupedToken);
        }win2008 LogOnUserCreateProcessAsUser