绕过Windows会话隔离,在系统服务的用户会话中显示警告消息,Windows 7+

时间:2013-05-03 19:12:17

标签: windows service isolation

我期待实现一个功能,当一个应用程序运行作为Windows服务(作为LocalSystem)会显示一个模式的警告,类似于关机屏幕或UAC警告屏幕的东西。基本上,在不注意的情况下无法解雇的事情

有两件事我不知道如何实施:

  1. 据我了解,Windows Vista +不再允许应用程序生成系统模式窗口。是否有可能绕过它,有没有简单的方法呢?我能想到的唯一选择是打开一个全屏窗口并截取alt + tab,ctrl + alt + del等等

  2. 我还认为,无法在服务的用户会话中显示UI,因为它在另一个会话中运行。有没有允许绕过它的黑客?我能想到的一件事是:在给定会话中运行的csrss.exe或winlogon.exe中查找并​​注入代码,并调用远程线程。另一种方法是obtain handle to winlogon and CreateProcessAsUser()。还有另一种更简单的方法吗?

2 个答案:

答案 0 :(得分:2)

如果服务作为本地系统运行,WTSQueryUserToken是获取令牌以在给定会话中运行代码的最简单方法。

考虑创建新桌面(CreateDesktop)并切换到它,而不是模态窗口。你无法抑制control-alt-delete,但我相信当control-alt-delete菜单被取消时,系统通常会返回你的桌面。应该抑制所有其他特殊键序列,因为挂钩仅影响与安装它们的应用程序关联的桌面。

答案 1 :(得分:1)

  1. 我不确定“系统模态窗口”是什么意思。您是指即使在登录屏幕上也会向用户显示的消息吗?

  2. 这是事实,即使在注册表中将UserInteractive设置为true,Vista及更高版本也不允许从服务访问Windows GUI。有几种方法,我这样做是因为我有一个简单的帮助应用程序,它在后台运行(不是作为服务,只是一个连续的过程),它使用IPC over .NET远程处理来处理服务的简单消息可以轻松连接和发送。如果你愿意,我可以发布一个更具体的例子,但现在这里是如何实现这一步的一步一步(我将在这个例子中使用.NET Remoting,但同样的基本原则应适用于任何IPC解决方案你用):

    1. 使用IPC协议创建一个充当.NET远程服务器的程序(不作为服务,只是一个连续的进程)。远程接口应至少包含一个用于接受新数据的成员,在大多数情况下,字符串对我来说工作正常。实现的类还应该能够持续处理新消息。
    2. 使用步骤1中实现的远程接口连接到服务,并发送要显示给IPC服务器的消息。
    3. IPC服务应处理此消息并使用您首选的方式将其显示给用户或向用户显示消息。我个人在一个单独的线程中使用模态表单,允许最终用户根据需要复制邮件。