通过网络登录从Windows服务创建GUI

时间:2009-02-12 17:18:19

标签: c# winapi windows-services windows-xp

我一直在阅读很多关于从Windows服务执行GUI应用程序的内容。当服务以SYSTEM用户身份运行时(我使用的是Windows XP),“允许服务与桌面交互”复选框对我有用。 现在我需要服务作为域(在网络中)中定义的用户运行。一切正常(即使没有用户登录到机器),但未显示GUI(即使登录了相同的网络用户!)。 我知道GUI正在运行,只是它们被隐藏了。这是为什么?有没有办法在用户登录时显示它们(比如由SYSTEM用户创建并允许与桌面交互!)? 如果是这样,如果登录的用户与运行该服务的用户不同,它会起作用吗?


编辑:

@casperOne:我看到了你的解决方案,而且人们(甚至你)一直在发帖。在我的情况下,我确信我在一个安全的环境中运行,一次只有一个用户将登录到一台机器。简单地取消隐藏GUI是不是可以做任何事情?为什么这适用于用户SYSTEM允许与桌面交互而不与其他用户交互?

3 个答案:

答案 0 :(得分:7)

您的方法完全错误,在Vista上部署时无效。

服务不应该假设与桌面进行登录会话以进行交互。

相反,您应该拥有第二个应用程序,该应用程序在用户登录时(或其他某个时间点)运行,并与服务进行通信,然后在接收到来自服务的通知/响应时显示UI元素。

有关详细信息,请参阅此其他问题(和答案):

How to detect if a Window can be Shown?

答案 1 :(得分:0)

简短回答:不,你不能这样做

答案很长:Noooooo。

基本上,微软正在进行更改以进一步防止这种情况发生。正如casperOne所说,您需要将UI组件与服务分开。

答案 2 :(得分:0)

即使在XP上,它也无法在非域名加入的计算机上运行(如果您有多个用户使用快速用户切换,弹出窗口会显示在错误的桌面上或根本没有桌面上。)

至于为什么微软改变了这一点,快速搜索“破碎攻击” - 通过将服务代码与桌面隔离,他们完全切断了整个系列的安全漏洞。