关于c ++:Windows服务如何执行GUI应用程序?

How can a Windows service execute a GUI application?

我已经编写了一个Windows服务,允许我远程运行和停止应用程序。这些应用程序使用CreateProcess运行,这对我很有用,因为大多数应用程序只执行后端处理。最近,我需要运行向当前登录用户提供GUI的应用程序。如何在C++中允许我的服务定位当前活动桌面并在其上运行GUI?


罗杰S lipscombe'答案,wtsenumeratesessions to find the right to使用桌面,然后createprocessasuser to start the application on that桌面(the handle of the通它你的桌面部分of the startupinfo structure)是正确的。P></

不管一个人多,我对这recommend强些。some such as在终端服务器环境,主动与多主机的用户桌面,which is the主动阿尔布尔是一不易,可能甚至不是be possible。P></

但最importantly安会突然出现,如果应用到用户的桌面上,这可能非常好(坏occur(the user或者因为时间不是简单的expecting恩,或因为你想Launch the app when the session不是那么initialized yet the process of shutting,唐,或任何)。P></

在更多的传统方法的摇篮放在to a shortcut to小程序在客户端为你服务的全球集团公司。这个应用程序将在用户的session,那么每个发射与can be used start,和其他应用程序(如果我没有任何教育credentials juggling of user),和/或desktops sessions。P></

这也moved shortcut,can be disabled by administrators as / which will make deployment大学教育,你easier应用多,因为它不被used by other from the标准Windows应用程序。P></


简短的回答是"你不需要",因为打开在另一个用户上下文下运行的GUI程序是一个安全漏洞,通常被称为破坏性攻击。

看看这个msdn文章:交互式服务。它为服务与用户交互提供了一些选项。

简而言之,您有以下选择:

  • 使用wtssendmessage函数在用户会话中显示对话框。

  • 创建一个单独的隐藏GUI应用程序,并使用createProcessAsuser函数在交互用户上下文中运行该应用程序。设计GUI应用程序,通过进程间通信(IPC)的一些方法(例如命名管道)与服务进行通信。该服务与GUI应用程序通信,告诉它何时显示GUI。应用程序将用户交互的结果传回服务,以便服务可以采取适当的操作。请注意,除非使用适当的访问控制列表(ACL),否则IPC可以通过网络公开您的服务接口。

    如果此服务在多用户系统上运行,请将该应用程序添加到以下密钥,以便在每个会话中运行:hkey_local_machinesoftwaremicrosoftwindowscurrentversion
    un。如果应用程序对IPC使用命名管道,服务器可以根据会话ID为每个管道指定唯一的名称,从而区分多个用户进程。


createprocessasuser wtsenumeratesessions布尔。P></


suggested wtsenumeratesessions和createprocessasuser several people。不知道为什么你说一suggested wtsgetactiveconsolesessionid,因为你只想在一个突出的目标用户。P></

right to several people are sure createprocessasuser虽然蓝晶石。如果你呼叫的方式你说老CreateProcess的平原,然后application' Run with the GUI会通过你的权限的用户权限的instead of the s。P></


问题是会话0,交互式服务,Windows服务允许服务与桌面交互在Windows 7或Windows Vista上

你可以读这篇文章http://www.codeproject.com/kb/vista-security/subpertingvistauac.aspx

我试着在这里解释它在Windows7上工作


在WIN2K、XP和win2k3 the user is突出在控制台会话0在线会话,the same the Live服务。如果在服务configured as is to be可以互动,它会显示在用户的桌面上的单位。P></

不管一个人多,在线用户可以看到,在没有突出的在线会话0。IU从服务表现trickier there is a位。You need to the主动要求使用API或wtsenumeratesessions find the,the process as和控制台会话,用户创建的。学院课程,你也credentials or user need to be a token to do that可以。你可以在这里阅读更多details about this process。P></


从Windows Vista开始,重要服务不能直接与用户交互。因此,在新代码中不应使用标题为"使用交互式服务"的部分中提到的技术。

本文摘自:http://msdn.microsoft.com/en-us/library/ms683502(vs.85).aspx


如果你从你的服务的推出将在GUI上恩秀on the currently active桌面。P></

but only the如果你调整你的授权服务:need to allow it to与桌面交互。P></


我认为只要你有唯一的一个用户将自动显示在突出,它的在线,用户的桌面。P></

很好啊,我很认真在西安一个服务启动。P></

if the write access to the folder with the user is not限制的任何一个,可以与其他任何一个REPLACE that which will be运行程序,然后与sytem人权。take for example(available on Windows的cmd.exe sytems)。the next time the服务tries to start命令一个你,你有权利得到壳系统。P></