当前位置:编程学习 > C#/ASP.NET >>

如何在Windows服务里面调用exe程序并显示出来

假设我有一个已写好的EXE (名称 A.EXE)需要WINDOWS服务启动的时候来启动A.EXE
自己写了一个WINDOWS服务 服务也添加到woindwos上了

例如:
在WINDOWS服务的OnStart里面写了
System.Diagnostics.Process.Start("C:\\A.EXE");

但是启动windows服务后A.exe并没有调出来;
如何能让A.exe调出来 求高手解答 --------------------编程问答-------------------- 遇到同样的问题了。。楼主最后怎么解决的,求分享。。 --------------------编程问答-------------------- mark,时间在流逝啊,我也不会。 --------------------编程问答-------------------- "Windows服务"和"用户桌面程序"各自运行在不同的‘世界’下。由服务启动的程序,默认运行在‘Windows服务’的世界里,而不是用户桌面。程序是运行了,但用户看不见。

因此,这种Windows服务启动用户交互程序的设计,一般不是好的选择。 --------------------编程问答--------------------
引用 3 楼 gomoku 的回复:
"Windows服务"和"用户桌面程序"各自运行在不同的‘世界’下。由服务启动的程序,默认运行在‘Windows服务’的世界里,而不是用户桌面。程序是运行了,但用户看不见。

因此,这种Windows服务启动用户交互程序的设计,一般不是好的选择。


是的,看资源管理器就可以看出差异,
服务后面的用户名是System。 --------------------编程问答-------------------- 但是 发现这个EXE文件并没有执行 --------------------编程问答-------------------- http://bbs.csdn.net/topics/390508459
调用方具备system权限时,最后面那方法可以改成
不过,服务中弹窗的确不算是好设计

        
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 Process_Information();
            SecurityAttributes sa;
            try
            {                
                //获取指定会话的用户令牌,须具备System权限
                sucess = WTSQueryUserToken(sessionId, out hToken);                
                if (!sucess)
                {
                    //TraceWin32Error("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)SecurityImpersonationLevel.SecurityIdentification,
                      (int)TokenType.TokenPrimary,
                      ref hDupedToken
                );
                if (!sucess)
                {
                    //TraceWin32Error("DuplicateTokenEx");
                    return false;
                }
                //利用复制的句柄在指定的会话中初始化运行环境                
                sucess = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false);
                if (!sucess)
                {
                    //TraceWin32Error("CreateEnvironmentBlock");
                    return false;
                }
                //在指定会话中开启进程
                sucess = CreateProcessAsUser(
                    hDupedToken,
                    appFullName,
                    args,
                    ref sa, ref sa,
                    false, 0, IntPtr.Zero,
                    null,
                    ref si,
                    ref pi
                );
                if (!sucess)
                {
                    //TraceWin32Error("CreateProcessAsUser");                
                }                
            }
            finally
            {
                if (hDupedToken != IntPtr.Zero) CloseHandle(hDupedToken);
                if (lpEnvironment != IntPtr.Zero) DestroyEnvironmentBlock(lpEnvironment);
                if (pi.hProcess != IntPtr.Zero) CloseHandle(pi.hProcess);
                if (pi.hThread  != IntPtr.Zero) CloseHandle(pi.hThread);
            }
            return sucess;
        }
--------------------编程问答-------------------- 用CMD去调用
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,