解决方案 »

  1.   

    Process.Start可以啊,你看看你的那个exe能直接双击打开看到gui吗?http://msdn.microsoft.com/zh-cn/library/53ezey2s.aspx
      

  2.   

    正常情况下Process 类可以直接调用的,有可能是其他地方的问题
      

  3.   

    这个是你的exe的问题吧
    什么exe
      

  4.   

    比如: Process.Start("explorer.exe", "http://www.baidu.com"); 这样就可以直接打开一个浏览器并且导航到百度首页。
      

  5.   

    不行的,根本不是一个SESSION,UI不可能出现的。可以考虑随用户登录时自动启动一个无UI的程序来做这件事。
      

  6.   


    Process.Start这个方法在普通窗体应用上是可以实现打开别一个exe 程序的窗体的,但在window服务里
    无法show出窗体,只能启动了exe程序的进程!
      

  7.   

    实际上windows service都可以在没有用户登录的情况下工作,你让它执行的程序显示在哪里呢?
      

  8.   


    Process.Start这个方法在普通窗体应用上是可以实现打开别一个exe 程序的窗体的,但在window服务里
    无法show出窗体,只能启动了exe程序的进程!
    晕,答题太快,没注意你是windows service程序。http://www.cnblogs.com/furenjun/archive/2009/05/14/windowsservice.html
      

  9.   


    对的根本不是一个session 所以UI没出现,只是后台进程启动了,
    请问随用户登录时启动一个无UI的程序来做这事?是什么意思另外我之所以要用服务来启动exe是因为 exe设置在自动启动里,要用户登录了桌面才能显示窗体
    所以我想在用户没有登录的情况下就把窗体给启动,或者说我在服务里看见那窗体进程死了,我得把它启动起来
      

  10.   

    无UI的后台进程要么是服务要么是控制台还有其它的什么无UI的进程吗?
    你是不是想说启动一个线程,线程再去启动那应用程序
      

  11.   

    呵呵,一个普通的WIN FORM程序,可以ShowWindow(SW_HIDE)也可以在启动时指定无UI的
                ProcessStartInfo ps = new ProcessStartInfo();
                ps.CreateNoWindow = true;
                ps.UseShellExecute = false;
                ps.LoadUserProfile = true;
                ps.WindowStyle = ProcessWindowStyle.Hidden;
                Process.Start(ps);
      

  12.   


    问题是你这个无UI的程序被system用户启动了,再在这个无UI的程序里能启动起带窗体的吗?
    我试一试先
      

  13.   

    前提:在服务的属性中勾选“允许与用户桌面交互”(可以用注册表或者WMI)
    //写在服务的安装类中  protected override void OnCommitted(IDictionary savedState)
      {
           base.OnCommitted(savedState);            
           try
           {               
                    base.OnCommitted(savedState);            
                using (ManagementObject wmiService = new ManagementObject(string.Format("Win32_Service.Name='{0}'", serviceName)))
                {
                    using (ManagementBaseObject changeMethod = wmiService.GetMethodParameters("Change"))
                    {
                        changeMethod["DesktopInteract"] = true;
                        using (ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", changeMethod, null))
                        { }
                    }
                }
                //安装后由命令行启动,不需要自启动
                //StartService(this.serviceInstaller.ServiceName, 2);
            }
            catch //(Exception exp)
            {
                    //WriteEventLog(exp);
            }
        }在此前提下,Process.Start在XP系统的第一个登陆的用户下可以直接弹出窗口
    在Vista以上系统均不行(会弹出警告并且导致服务被挂起直至用户响应)
      

  14.   

    不过也不是完全不可以,对于System服务是完全可以的。不过不推荐
    参考 http://bbs.csdn.net/topics/390508459
    最后那个方法小改下,先用API查,再用explore查,双保险public static bool CreateProcess(int sessionId, string appFullName, string args)
            {
                if (!System.IO.File.Exists(appFullName))
                {
                    throw new System.IO.FileNotFoundException(appFullName);
                }
                bool sucess = false;
                IntPtr hToken = IntPtr.Zero,
                       hDupedToken = IntPtr.Zero,
                       lpEnvironment = IntPtr.Zero;
                Process_Information pi = new Mapper.Process_Information();
                SecurityAttributes sa;
                try
                {
                    //获取指定会话的用户令牌,须具备System权限
                    sucess = WTSQueryUserToken(sessionId, out hToken);
                    if(!sucess)
                    {
                        //服务程序中,获取指定会话的桌面进程
                        var explorer = Process.GetProcesses().FirstOrDefault(p => p.SessionId == sessionId && string.Equals(p.ProcessName, Setting.ExplorerProcess, StringComparison.OrdinalIgnoreCase));
                        if (explorer == null)
                        {
                            return false;
                        }
                        sucess = OpenProcessToken(explorer.Handle, TokenAccessLevels.AllAccess, ref hToken);
                        if (!sucess)
                        {
                            TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "WTSQueryUserToken");
                            return false;
                        }
                    }
                    //复制桌面进程的句柄
                    sa = new SecurityAttributes();
                    sa.Length = Marshal.SizeOf(sa);
                    var si = new StartUpInfo();
                    si.cb = Marshal.SizeOf(si);
                    sucess = DuplicateTokenEx(
                          hToken,
                          GENERIC_ALL_ACCESS,
                          ref sa,
                          (int)Mapper.SecurityImpersonationLevel.SecurityIdentification,
                          (int)Mapper.TokenType.TokenPrimary,
                          ref hDupedToken
                    );
                    if (!sucess)
                    {
                        TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "DuplicateTokenEx");
                        return false;
                    }
                    //利用复制的句柄在指定的会话中初始化运行环境                
                    sucess = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false);
                    if (!sucess)
                    {
                        TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "CreateEnvironmentBlock");
                        return false;
                    }
                    //在指定会话中开启进程
                    if (!string.IsNullOrEmpty(args))
                    {
                        args = string.Format("\"{0}\" {1}", appFullName, args);
                        appFullName = null;
                    }
                    sucess = CreateProcessAsUser(
                        hDupedToken,
                        appFullName,
                        args,
                        ref sa, ref sa,
                        false, 0, IntPtr.Zero,
                        null,
                        ref si,
                        ref pi
                    );
                    if (!sucess)
                    {
                        TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "CreateProcessAsUser");
                    }
                    return sucess;
                }
                catch (Exception exp)
                {
                    TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), exp.Message);
                    return false;
                }
                finally
                {
                    if (hDupedToken != IntPtr.Zero) CloseHandle(hDupedToken);
                    if (lpEnvironment != IntPtr.Zero) DestroyEnvironmentBlock(lpEnvironment);
                    if (pi.hProcess != INVALID_HANDLE_VALUE) Mapper.CloseHandle(pi.hProcess);
                    if (pi.hThread  != INVALID_HANDLE_VALUE) Mapper.CloseHandle(pi.hThread);
                }//调用
    int sessionId = WTSGetActiveConsoleSessionId();
    CreateProcess(sessionId, @"D:\abc.exe", "参数列表")
      

  15.   

    PsExec
    http://technet.microsoft.com/en-us/sysinternals/bb897553后台运行这个批处理脚本 path\psexec.exe \\cn -d -i console SESSION ID  -s xxxx