Windows services 如何在Windows服务中启动GUI程序?

Windows services 如何在Windows服务中启动GUI程序?,windows-services,createprocess,Windows Services,Createprocess,当我以LocalSystem帐户运行服务时,我可以使用以下代码在当前登录帐户下启动GUI程序: WTSGetActiveConsoleSessionId->WTSQueryUserToken->CreateProcessAsUser 但是,当我以个人帐户运行服务时,GUI程序将不会显示。不过我可以在任务管理器中看到它 当服务在我的个人帐户下运行时,我应该如何启动GUI程序?这一切都与我相信的权限有关 LocalSystem有足够的权限模拟当前用户,但您的帐户没有 您必须找到一种方法来扩展对服务的

当我以LocalSystem帐户运行服务时,我可以使用以下代码在当前登录帐户下启动GUI程序:

WTSGetActiveConsoleSessionId->WTSQueryUserToken->CreateProcessAsUser

但是,当我以个人帐户运行服务时,GUI程序将不会显示。不过我可以在任务管理器中看到它


当服务在我的个人帐户下运行时,我应该如何启动GUI程序?

这一切都与我相信的权限有关

LocalSystem有足够的权限模拟当前用户,但您的帐户没有

您必须找到一种方法来扩展对服务的权限,可以通过提示输入凭据,也可以连接到作为LocalSystem运行的帮助器服务

(为什么要使用您的帐户而不是本地系统运行?)


我相信有很多更彻底的答案可以解决这一问题,但从高层次上讲,我认为这就是问题所在。

您可能在错误的窗口站或桌面上运行。请看这一点。

我认为您试图做的事情可能被认为是一个安全漏洞。在某些情况下,它也不太可能起作用。我认为jdigital是正确的,因为它与窗口站有关,并试图访问当前用户窗口站及其桌面。当您在一个终端服务服务器下,其中有多个当前窗口站时,这会让您感到非常困惑。微软真的不想让你随心所欲,他们让每一个windows版本都变得更加困难


我认为最好的办法是从另一个角度解决问题,只需创建一个GUI应用程序,用户可以运行(手动或在登录时自动运行)并与您的服务对话。

John和jdigital都是正确的-据我理解,服务通常可以访问桌面(您必须使用localsystem)或网络访问(您需要指定要在其下运行的帐户)


你需要两个用户将你的应用程序一分为二——一个与桌面交互,另一个通过网络交谈。然后,这两个部分可以相互交谈,将信息传递给最终用户。

谢谢John,原因有两个:1)LocalSystem无权访问Vista中的网络共享文件夹2)LocalSystem服务生成的所有文件都归“管理员”所有。我想要我的个人帐户拥有的文件。该服务由我的个人帐户运行,我当前已登录。我刚检查过,程序正在运行,但没有显示。如果您查看链接,就会发现这不是权限问题。Microsoft使用窗口站和桌面提供不同级别的进程隔离。有很多方法可以解决这个问题,比如SetProcessWindowsStation和SwitchDesktop,但通常建议将应用程序分成两部分。是的,我计划采用客户机/服务器模式。它将解决这样的问题。但奇怪的是,尽管该服务由我的个人帐户运行,但它生成的文件归“管理员”所有,而不是我的帐户。您可以在“文件属性->详细信息->所有者”中检查此属性。它不应该属于我的帐户吗?如果是这样,如果用户关闭GUI应用程序,将不会收到通知。但似乎我别无选择(@trudger:Nope。如果用户站起来离开计算机,也不会收到通知,但这并不意味着你的软件附带了手铐。是的,这很有意义。我已经决定使用管道在GUI和服务之间进行通信。也许我还可以缓冲这些事件,并在用户登录时向他们显示。我计划通过我的帐户运行该服务,以便它可以访问本地和网络资源。一个“客户端”将与它对话以接收信息并控制它。但奇怪的是,正如我在下面所写的,它生成的文件归“管理员”所有,而不是我的帐户(Vista OS)。这让我感到困惑。