使用网络登录从 Windows 服务创建 GUI
Posted
技术标签:
【中文标题】使用网络登录从 Windows 服务创建 GUI【英文标题】:Create GUI from Windows Service with a Network Log on 【发布时间】:2010-10-07 05:49:57 【问题描述】:我已经阅读了很多关于从 Windows 服务执行 GUI 应用程序的信息。当服务以 SYSTEM 用户身份运行时(我使用的是 Windows XP),“允许服务与桌面交互”复选框对我有用。 现在我需要服务作为域中定义的用户(来自网络)运行。一切正常(即使没有用户登录机器),但没有显示 GUI(即使同一个网络用户登录!)。 我知道 GUI 正在运行,只是它们被隐藏了。这是为什么?如果用户登录(例如由 SYSTEM 用户创建并允许与桌面交互!),有没有办法显示它们? 如果是这样,如果登录的用户与运行服务的用户不同,它会起作用吗?
编辑:
@casperOne:我看到了您的解决方案,人们(甚至您)一直在发布相同的解决方案。不过,就我而言,我确信我在一个安全的环境中运行,并且一次只有一个用户会登录到一台机器上。没有什么可以简单地取消隐藏 GUI 吗?为什么这适用于允许与桌面交互而不是与其他用户交互的用户 SYSTEM?
【问题讨论】:
【参考方案1】:您的方法完全错误,部署在 Vista 上时将无法正常工作。
服务不应假设与桌面进行交互的登录会话。
相反,您应该有第二个应用程序,它在用户登录(或其他时间点)时运行,它与服务通信,然后在收到来自服务的通知/响应时显示 UI 元素。
有关更多信息,请参阅其他问题(和答案):
How to detect if a Window can be Shown?
【讨论】:
【参考方案2】:简短回答:不,你不能这样做
长答案:Noooooo。
基本上,Microsoft 正在进行更改以进一步防止这种情况发生。正如 casperOne 所说,您需要将 UI 组件与服务分开。
【讨论】:
【参考方案3】:即使在 XP 上,它也无法在未加入域的计算机上运行(如果您有多个用户使用快速用户切换,弹出窗口会显示在错误的桌面或根本没有桌面)。
至于微软为何改变这一点,请快速搜索“Shatter Attack”——通过将服务代码与桌面隔离,他们完全切断了整个安全漏洞系列。
【讨论】:
以上是关于使用网络登录从 Windows 服务创建 GUI的主要内容,如果未能解决你的问题,请参考以下文章