1

当作为 Windows 服务(作为本地系统)运行的应用程序将显示模式警告时,我希望实现一项功能,类似于关机屏幕或 UAC 警告屏幕。基本上,在没有注意到的情况下不可能忽略的东西

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

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

  2. 我也相信不可能在服务的用户会话中显示 UI,因为它在另一个会话中运行。是否有允许绕过它的黑客?我能想到的一件事是:找到代码并将代码注入到给定会话中运行的 csrss.exe 或 winlogon.exe,然后调用远程线程。另一种方法是获取 winlogon 和 CreateProcessAsUser() 的句柄。还有其他更简单的方法吗?

4

2 回答 2

2

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

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

于 2013-05-04T06:08:20.823 回答
1
  1. 我不确定您所说的“系统模式窗口”是什么意思。您的意思是即使在登录屏幕上也会显示给用户的消息?

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

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