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

问题描述 投票:1回答:2

当作为Windows服务运行的应用程序(如localsystem)将显示模式警告时,我希望实现一个功能,类似于关闭屏幕或UAC警告屏幕。基本上,在没有注意的情况下不可能解雇的事情

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

  1. 据我了解,Windows Vista +不再允许应用程序生成系统模式窗口。是否有可能绕过它,有没有简单的方法呢?我能想到的唯一选择是打开一个全屏窗口并拦截alt + tab,ctrl + alt + del等等
  2. 我还认为,无法在服务的用户会话中显示UI,因为它在另一个会话中运行。有没有允许绕过它的黑客?我能想到的一件事是:在给定会话中运行的csrss.exe或winlogon.exe中查找并​​注入代码,并调用远程线程。另一种方法是obtain handle to winlogon and CreateProcessAsUser()。还有另一种更简单的方法吗?
windows service isolation
2个回答
2
投票

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

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


1
投票
  1. 我不确定你的“系统模态窗口”是什么意思。您是指甚至在登录屏幕上显示给用户的消息吗?
  2. 这是事实,即使在注册表中将UserInteractive设置为true,Vista及更高版本也不允许从服务访问Windows GUI。有几种方法,我这样做是因为我有一个简单的帮助应用程序,它在后台运行(不是作为服务,只是一个连续的过程),它使用IPC over .NET远程处理来处理服务的简单消息可以轻松连接和发送。如果你愿意,我可以发布一个更具体的例子,但现在这里是如何实现这一步的一步一步(我将在这个例子中使用.NET Remoting,但同样的基本原则应适用于任何IPC解决方案你用): 使用IPC协议创建一个充当.NET远程服务器的程序(不作为服务,只是一个连续的进程)。远程接口应至少包含一个用于接受新数据的成员,在大多数情况下,字符串对我来说工作正常。实现的类还应该能够连续处理新消息。 使用步骤1中实现的远程接口连接到服务,并将要显示的消息发送到IPC服务器。 IPC服务应处理此消息并使用您的首选方式将其显示给用户或向用户显示消息。我个人在一个单独的线程中使用模态表单,允许最终用户根据需要复制邮件。
© www.soinside.com 2019 - 2024. All rights reserved.