尝试在会话0中显示GUI

时间:2012-07-19 16:12:32

标签: c# windows

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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