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

8
当我使用LocalSystem账户运行服务时,我可以使用以下代码在当前登录账户下启动GUI程序:
WTSGetActiveConsoleSessionId->WTSQueryUserToken->CreateProcessAsUser 然而,当我以个人账户运行服务时,GUI程序将不会显示出来。尽管我可以在任务管理器中看到它。
那么,当服务在我的个人账户下运行时,我应该怎样做才能启动GUI程序呢?
4个回答

2

从我的理解来看,John和jdigital都是正确的 - 服务通常可以有桌面访问权限(您必须使用localsystem)或网络访问权限(您需要指定一个帐户来运行)。

您需要将应用程序分成两个部分 - 一个用于与桌面交互,另一个用于通过网络进行通信。然后,这两个部分可以相互通信以向最终用户传递信息。


我计划通过我的账户运行服务,以便它可以访问本地和网络资源。一个“客户端”将与它通信以接收信息并控制它。但是一个奇怪的事情,就像我下面写的那样,生成的文件属于“管理员”,而不是我的账户(Vista操作系统)。这让我感到困惑。 - trudger

0

这一切都与权限有关。

LocalSystem具有足够的特权来模拟当前用户,但您的帐户没有。

您必须想办法将权限扩展到您的服务,可以通过提示凭据或连接到作为LocalSystem运行的辅助服务。

(为什么要使用您的帐户而不是LocalSystem运行?)

我相信有更详尽的答案来解决这个问题,但在高层次上,我认为这就是问题所在。


谢谢John,有两个原因: 1)LocalSystem在Vista中没有访问网络共享文件夹的权限 2)由LocalSystem服务生成的所有文件都归“管理员”所有。我希望这些文件归属于我的个人账户。 - trudger

0

该服务正在我的个人帐户下运行,并且我当前已登录。 我刚刚检查过,程序正在运行,但没有显示出来。 - trudger
如果您查看链接,您会发现这不是权限问题。微软使用窗口站和桌面来提供不同级别的进程隔离。有一些解决方法,例如SetProcessWindowStation和SwitchDesktop,但将应用程序拆分为两个部分是通常推荐的解决方案。 - jdigital
是的,客户端/服务器模式是我计划要做的。它将解决这个问题。但奇怪的是,虽然服务是由我的个人帐户运行的,但它生成的文件却属于“管理员”,而不是我的帐户。您可以在“文件属性->详细信息->所有者”中检查此属性。难道它不应该归我的帐户所有吗? - trudger

0
我认为你所尝试的操作可能会被视为安全漏洞。而且,在某些情况下,它也不太可能成功。我认为jdigital是正确的,这与窗口工作站有关,你试图获取当前用户窗口工作站及其桌面的访问权限。当你在终端服务服务器下时,这会导致很多混淆,因为存在多个当前窗口工作站。微软真的不希望你做你想做的事情,并且他们每次发布新的Windows版本都会让它变得更加困难。
我认为你最好从另一个角度解决问题,只需创建一个GUI应用程序供用户手动或自动登录后运行,并与你的服务进行交互。

如果这样做,用户关闭GUI应用程序后将无法收到通知。但似乎我别无选择。 :( - trudger
@trudger:不是的。如果用户站起来离开电脑,他们也不会收到通知,但这并不意味着你要在软件中附带手铐。 - Aric TenEyck
是的,这很有道理。我已经决定使用管道来在GUI和服务之间进行通信。也许我还可以缓存这些事件,并在用户登录时向他们显示。 - trudger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接