C# 通过windows 服务启动exe的问题

时间:2021-06-25 08:05:57
自己写了个服务 来启动第三方程序 但是启动以后 第三方程序没有显示系统托盘图标 在任务管理器里面可以看到第三方程序的进程
 这个怎么解决 C# 通过windows 服务启动exe的问题
通过process来运行的代码:
 if (!string.IsNullOrEmpty(path))
                {
                    using (Process process = new Process())
                    {
                        try
                        {
                          
                            process.StartInfo.FileName = path;
                            process.Start();

                        }
                        catch (Exception)
                        {

                            throw;
                        }
                    }
                }

通过CMD来运行的代码:
using (Process cmd = new Process())
                {
                    
                    if (!string.IsNullOrEmpty(path))
                    {
                        try
                        {
                        cmd.StartInfo.FileName = "cmd.exe";
                        cmd.StartInfo.UseShellExecute = false;
                        cmd.StartInfo.RedirectStandardInput = true;
                        cmd.StartInfo.RedirectStandardOutput = true;
                        cmd.StartInfo.CreateNoWindow = true;
                        cmd.Start();
                        path = "\"" + path + "\"";
                           

                            cmd.StandardInput.WriteLine(path);
                        }
                        catch (Exception)
                        {

                            throw;
                        }

                    }
                }


有人说是因为XP以上的系统有UAC 所以被限制了 但是服务是以管理员身份运行的  后来我尝试用第三方dll 好像也是不行

第三方DLL写的:
 try
            {
                if (!string.IsNullOrEmpty(path))
                {
                    IntPtr usertoken = IntPtr.Zero;
                    ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref usertoken);
                    ApiDefinitions.PROCESS_INFORMATION procInfo = new ApiDefinitions.PROCESS_INFORMATION();
                    ApiDefinitions.STARTUPINFO startinfo = new ApiDefinitions.STARTUPINFO();
                    startinfo.cb= (uint)Marshal.SizeOf(startinfo);
                    ApiDefinitions.CreateProcessAsUser(
                        usertoken,
                        path,
                        "",
                        IntPtr.Zero,
                        IntPtr.Zero,
                        false,
                        0,
                        IntPtr.Zero,
                        null,
                        ref startinfo,
                        out procInfo
                        );
                    if (usertoken!=IntPtr.Zero)
                    {
                        ApiDefinitions.CloseHandle(usertoken);
                        int _currentAquariusProcessId = (int)procInfo.dwProcessId;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }

15 个解决方案

#1


有人说是因为XP以上的系统有UAC 所以被限制了 但是服务是以管理员身份运行的

是这样滴,在xp及之前的os版本,是可以写程序(比如win服务、控制台程序、exe等)启动新的exe的
win7版本,也能够启动第三方exe,只是新的exe是以管理员帐户运行的,你登录的用户,看不到界面,但是进程里面是有的。

#2


引用 1 楼 lovelj2012 的回复:
有人说是因为XP以上的系统有UAC 所以被限制了 但是服务是以管理员身份运行的

是这样滴,在xp及之前的os版本,是可以写程序(比如win服务、控制台程序、exe等)启动新的exe的
win7版本,也能够启动第三方exe,只是新的exe是以管理员帐户运行的,你登录的用户,看不到界面,但是进程里面是有的。

但是有一个问题 比如 我通过服务来启动QQ 的确是启动成功了 但是却无法显示界面 有没有办法看到界面呢 C# 通过windows 服务启动exe的问题

#3


只能切换到系统管理员帐户,才可以看到界面。

#4


我们手工打开一个程序A,操作者是当前登录你的window的用户,可能是adminstrator,可能是管理员
而用服务启动另一个程序A,相当于“服务”打开“程序A“,服务 我记得是window的Users用户,不是管理员
想法子让你的服务先拿到管理员权限,然后启动第三方软件

#5


win以来,很多软件都需要管理员权限,安装一个软件,或者更新系统时,弹出的那个对话框

#6


引用 4 楼 From_* 的回复:
我们手工打开一个程序A,操作者是当前登录你的window的用户,可能是adminstrator,可能是管理员
而用服务启动另一个程序A,相当于“服务”打开“程序A“,服务 我记得是window的Users用户,不是管理员
想法子让你的服务先拿到管理员权限,然后启动第三方软件


我的服务是用local system来运行的 被打开的第三方软件(EXE)  是以当前用户的身份运行(管理员)  后来我通过 CreateProcessAsUser 函数来提升权限(服务以system来运行) 这个时候 被打开的第三方软件 有界面了 但是被打开的第三方软件 是用system来运行 所以读取不到它自己的配置文件(第三方程序的配置文件在admin里面).......我都弄晕了....

#7


只好让第三方在administrator下运行,你可以找第三方运行后的令牌token,然后用此token调用CreateProcessAsUser启动第三方,具体你自己研究吧,记不太清了

#8


MSDN 上有篇文章,好像是获取explorer进程的用户,然后再启动用户进程

https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c0ca087-5e7b-4046-93cb-c7b3e48d0dfb/how-run-client-application-as-a-windows-service-in-c?forum=csharpgeneral

#9


引用 8 楼 assky124 的回复:
MSDN 上有篇文章,好像是获取explorer进程的用户,然后再启动用户进程

https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c0ca087-5e7b-4046-93cb-c7b3e48d0dfb/how-run-client-application-as-a-windows-service-in-c?forum=csharpgeneral


这个好像是把服务提升为system来运行 然后通过system来打开exe 这样会出现一个问题 被打开的exe 不能读取它自身的配置文件.....

#10


windows7以后,服务器系统启动的exe在session 0,而不是用户session。此会话不能显示图形界面。

#11


不显示图形界面,不仅仅安全,而且也可以彻底抛掉windows系统多年以前的那个被人诟病的毛病——图形界面的软件大量占用和消耗了服务器资源、严重影响运行效率。

你设计软件时,就应该真正先高清楚到底是给图形界面客户端编写的,还是给服务器编写的。一个winform、wpf程序员思维,不能编写那些只在windows servive启动的exe。

#12


引用 11 楼 sp1234 的回复:
不显示图形界面,不仅仅安全,而且也可以彻底抛掉windows系统多年以前的那个被人诟病的毛病——图形界面的软件大量占用和消耗了服务器资源、严重影响运行效率。

你设计软件时,就应该真正先高清楚到底是给图形界面客户端编写的,还是给服务器编写的。一个winform、wpf程序员思维,不能编写那些只在windows servive启动的exe。

感谢回答 XP以上的系统的确有session 0隔离 服务和程序不能通信  我现在已经穿透了session隔离 把服务提升到system的权限了 也就是说 现在我的服务是在session 1上运行 会出现一个问题 第三方程序启动 不能读取配置文件(第三方程序的配置文件在admin文件夹下面)  当然 你说的不显示图形界面 的确是安全  但是假如说 我通过服务来启动QQ 的确是启动了 但因为没有界面 所以我无法登陆QQ C# 通过windows 服务启动exe的问题

#13


https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c0ca087-5e7b-4046-93cb-c7b3e48d0dfb/how-run-client-application-as-a-windows-service-in-c?forum=csharpgeneral
你确定试过?
这个是用你登录用户启动的,界面也显示在你的桌面中,当然前提是登录过了

#14


https://code.msdn.microsoft.com/CSCreateProcessAsUserFromSe-b682134e/view/Discussions#content
这个demo可以解决,本地win7+vs2010  通过window服务打开了外部的一个winform程序

#15


尝试一下 :http://download.csdn.net/detail/tanggaohui0322/7789937

#1


有人说是因为XP以上的系统有UAC 所以被限制了 但是服务是以管理员身份运行的

是这样滴,在xp及之前的os版本,是可以写程序(比如win服务、控制台程序、exe等)启动新的exe的
win7版本,也能够启动第三方exe,只是新的exe是以管理员帐户运行的,你登录的用户,看不到界面,但是进程里面是有的。

#2


引用 1 楼 lovelj2012 的回复:
有人说是因为XP以上的系统有UAC 所以被限制了 但是服务是以管理员身份运行的

是这样滴,在xp及之前的os版本,是可以写程序(比如win服务、控制台程序、exe等)启动新的exe的
win7版本,也能够启动第三方exe,只是新的exe是以管理员帐户运行的,你登录的用户,看不到界面,但是进程里面是有的。

但是有一个问题 比如 我通过服务来启动QQ 的确是启动成功了 但是却无法显示界面 有没有办法看到界面呢 C# 通过windows 服务启动exe的问题

#3


只能切换到系统管理员帐户,才可以看到界面。

#4


我们手工打开一个程序A,操作者是当前登录你的window的用户,可能是adminstrator,可能是管理员
而用服务启动另一个程序A,相当于“服务”打开“程序A“,服务 我记得是window的Users用户,不是管理员
想法子让你的服务先拿到管理员权限,然后启动第三方软件

#5


win以来,很多软件都需要管理员权限,安装一个软件,或者更新系统时,弹出的那个对话框

#6


引用 4 楼 From_* 的回复:
我们手工打开一个程序A,操作者是当前登录你的window的用户,可能是adminstrator,可能是管理员
而用服务启动另一个程序A,相当于“服务”打开“程序A“,服务 我记得是window的Users用户,不是管理员
想法子让你的服务先拿到管理员权限,然后启动第三方软件


我的服务是用local system来运行的 被打开的第三方软件(EXE)  是以当前用户的身份运行(管理员)  后来我通过 CreateProcessAsUser 函数来提升权限(服务以system来运行) 这个时候 被打开的第三方软件 有界面了 但是被打开的第三方软件 是用system来运行 所以读取不到它自己的配置文件(第三方程序的配置文件在admin里面).......我都弄晕了....

#7


只好让第三方在administrator下运行,你可以找第三方运行后的令牌token,然后用此token调用CreateProcessAsUser启动第三方,具体你自己研究吧,记不太清了

#8


MSDN 上有篇文章,好像是获取explorer进程的用户,然后再启动用户进程

https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c0ca087-5e7b-4046-93cb-c7b3e48d0dfb/how-run-client-application-as-a-windows-service-in-c?forum=csharpgeneral

#9


引用 8 楼 assky124 的回复:
MSDN 上有篇文章,好像是获取explorer进程的用户,然后再启动用户进程

https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c0ca087-5e7b-4046-93cb-c7b3e48d0dfb/how-run-client-application-as-a-windows-service-in-c?forum=csharpgeneral


这个好像是把服务提升为system来运行 然后通过system来打开exe 这样会出现一个问题 被打开的exe 不能读取它自身的配置文件.....

#10


windows7以后,服务器系统启动的exe在session 0,而不是用户session。此会话不能显示图形界面。

#11


不显示图形界面,不仅仅安全,而且也可以彻底抛掉windows系统多年以前的那个被人诟病的毛病——图形界面的软件大量占用和消耗了服务器资源、严重影响运行效率。

你设计软件时,就应该真正先高清楚到底是给图形界面客户端编写的,还是给服务器编写的。一个winform、wpf程序员思维,不能编写那些只在windows servive启动的exe。

#12


引用 11 楼 sp1234 的回复:
不显示图形界面,不仅仅安全,而且也可以彻底抛掉windows系统多年以前的那个被人诟病的毛病——图形界面的软件大量占用和消耗了服务器资源、严重影响运行效率。

你设计软件时,就应该真正先高清楚到底是给图形界面客户端编写的,还是给服务器编写的。一个winform、wpf程序员思维,不能编写那些只在windows servive启动的exe。

感谢回答 XP以上的系统的确有session 0隔离 服务和程序不能通信  我现在已经穿透了session隔离 把服务提升到system的权限了 也就是说 现在我的服务是在session 1上运行 会出现一个问题 第三方程序启动 不能读取配置文件(第三方程序的配置文件在admin文件夹下面)  当然 你说的不显示图形界面 的确是安全  但是假如说 我通过服务来启动QQ 的确是启动了 但因为没有界面 所以我无法登陆QQ C# 通过windows 服务启动exe的问题

#13


https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c0ca087-5e7b-4046-93cb-c7b3e48d0dfb/how-run-client-application-as-a-windows-service-in-c?forum=csharpgeneral
你确定试过?
这个是用你登录用户启动的,界面也显示在你的桌面中,当然前提是登录过了

#14


https://code.msdn.microsoft.com/CSCreateProcessAsUserFromSe-b682134e/view/Discussions#content
这个demo可以解决,本地win7+vs2010  通过window服务打开了外部的一个winform程序

#15


尝试一下 :http://download.csdn.net/detail/tanggaohui0322/7789937