我期待实现一个功能,当一个应用程序运行作为Windows服务(作为LocalSystem)会显示一个模式的警告,类似于关机屏幕或UAC警告屏幕的东西。基本上,在不注意的情况下无法解雇的事情
有两件事我不知道如何实施:
据我了解,Windows Vista +不再允许应用程序生成系统模式窗口。是否有可能绕过它,有没有简单的方法呢?我能想到的唯一选择是打开一个全屏窗口并截取alt + tab,ctrl + alt + del等等
我还认为,无法在服务的用户会话中显示UI,因为它在另一个会话中运行。有没有允许绕过它的黑客?我能想到的一件事是:在给定会话中运行的csrss.exe或winlogon.exe中查找并注入代码,并调用远程线程。另一种方法是obtain handle to winlogon and CreateProcessAsUser()。还有另一种更简单的方法吗?
答案 0 :(得分:2)
如果服务作为本地系统运行,WTSQueryUserToken是获取令牌以在给定会话中运行代码的最简单方法。
考虑创建新桌面(CreateDesktop)并切换到它,而不是模态窗口。你无法抑制control-alt-delete,但我相信当control-alt-delete菜单被取消时,系统通常会返回你的桌面。应该抑制所有其他特殊键序列,因为挂钩仅影响与安装它们的应用程序关联的桌面。
答案 1 :(得分:1)
我不确定“系统模态窗口”是什么意思。您是指即使在登录屏幕上也会向用户显示的消息吗?
这是事实,即使在注册表中将UserInteractive设置为true,Vista及更高版本也不允许从服务访问Windows GUI。有几种方法,我这样做是因为我有一个简单的帮助应用程序,它在后台运行(不是作为服务,只是一个连续的过程),它使用IPC over .NET远程处理来处理服务的简单消息可以轻松连接和发送。如果你愿意,我可以发布一个更具体的例子,但现在这里是如何实现这一步的一步一步(我将在这个例子中使用.NET Remoting,但同样的基本原则应适用于任何IPC解决方案你用):