【问题标题】:Trying to display a GUI in Session 0尝试在会话 0 中显示 GUI
【发布时间】:2012-07-19 16:12:32
【问题描述】:

我到处搜索并尝试了几乎所有东西,但我开始认为这是不可能的。 我有一个在会话 0 (win7) 中作为 SYSTEM 运行的服务。我需要启动一个外部应用程序。如果我只是以 SYSTEM 身份启动外部应用程序,应用程序就会启动并且我可以看到 GUI(如果我使用 UI0Detect 单击会话 0)。除了我能够看到它之外,我启动应用程序的服务实际上可以截取 GUI 的屏幕截图并将其发送回我的服务器。 - 在这一点上一切都很好。

问题 - 在某些情况下,外部应用程序不允许在 SYSTEM 上下文下运行。在这些情况下,我必须以其他用户身份启动。我在会话 0 中以实际用户身份运行另一个服务。然后我以该其他用户身份启动外部应用程序。外部应用程序在会话 0 中启动,我指定 WinSta0\Default 以确保应用程序 GUI 在我的 SYSTEM 服务可以看到的同一桌面上启动。当这种情况发生时 UI0Detect 弹出给我的印象是我将点击并查看我的窗口。当我进入会话 0 或当我的服务尝试截屏时,只有一个小黑匣子。几乎就像只有 SYSTEM 帐户可以在会话 0 中呈现窗口 - 这是真的吗?有人知道会话 0 中运行的用户帐户是否能够呈现 GUI?

我不是在寻找有关如何将应用程序从会话 0 启动到活动用户桌面的代码。这是有据可查的。我需要知道的是如何实现反向(有点)。我需要从 SYSTEM 以外的帐户在会话 0 中启动 GUI。

【问题讨论】:

  • 您为什么要这样做?服务可以在没有可视化桌面的情况下运行——在这种情况下,没有任何可视化桌面,并且没有用户可以与 UI 交互。在这种情况下,您的应用程序会做什么?

标签: c# windows


【解决方案1】:

来自MSDN:“如果服务类型指定SERVICE_INTERACTIVE_PROCESS,则服务必须在LocalSystem帐户中运行。”

所以没有支持的方式来做你想做的事。但是,可以通过让以 SYSTEM 身份运行的服务来更改相关桌面(可能还有窗口站)上的权限来使其工作。请记住,以这种方式共享桌面意味着如果有问题的应用程序或用户帐户遭到入侵,它可能会破坏系统帐户。

或者,您可以尝试在会话 0 中创建一个新桌面(具有适当的权限)并在那里启动应用程序。我不确定交互式用户是否能够看到此桌面,但您可以通过在同一桌面(最好在同一用户上下文中)启动另一个应用程序来代表您截取屏幕截图。

【讨论】:

  • 我很确定我会得到这个答案。至少现在我可以停止怀疑了。对我来说,Windows 编程的学习体验非常棒。
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2012-11-11
  • 2018-02-21
相关资源
最近更新 更多