使用网络登录从 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的主要内容,如果未能解决你的问题,请参考以下文章

sql SQL从Windows创建登录并添加到服务器角色

如何从vb6代码确定登录到Windows服务器的工作站的IP地址

映射要由服务使用的网络驱动器

如何取消自动登录局域网服务器?

以 Windows 登录用户身份从服务启动进程

服务应在哪个 Windows 帐户下运行以访问网络 sql 服务器