【问题标题】:Blocking mouse input from a service in Vista在 Vista 中阻止来自服务的鼠标输入
【发布时间】:2009-03-16 18:58:39
【问题描述】:

我在大学校园内维护着各种托管用户实验室。这些机器目前都运行 Windows XP,我们有一个 Windows 服务,用于通过阻止任何键盘或鼠标输入来“锁定”机器。锁定发生在我们的脚本操作系统安装期间,因此用户无法意外停止或中断该过程。它还用于防止用户在给定实验室的前台签出之前登录机器。 Ctrl+Alt+Del 通过键盘过滤器驱动程序被阻止,其余的键和鼠标当前被使用来自 user32.dll 的BlockInput() 函数阻止。

在 XP 中,服务作为本地系统运行,并且必须从 BlockInput() 调用中启用“允许服务与桌面交互”复选框才能成功。在 Vista 下,我猜这不再有效,因为 Session 0 isolation 发生了变化。调用成功,但输入实际上并没有被阻塞。

键盘过滤驱动程序仍然可以正常工作,我们可以使用它来阻止整个键盘,而不仅仅是 Ctrl+Alt+Del。但是我不知道我们现在要如何阻止鼠标。我什至不完全确定 Session 0 的隔离是罪魁祸首。

谁能推荐一个修复或解决方法,以允许我们阻止来自 Vista 及更高版本服务的鼠标输入?我一直在寻找替代的 win32 API,但没有运气。假设 Session 0 隔离是罪魁祸首,是否有合法的方式从 Session 1 调用该函数,或者这种方式会破坏隔离的目的?我是否必须依赖在用户登录时运行并与服务通信的提升的配套 exe?

【问题讨论】:

    标签: winapi windows-vista


    【解决方案1】:

    从服务中,您可以使用 WTSEnumerateSessions 获取所有登录的用户会话,使用 WTSQueryUserToken 获取登录用户的令牌,然后使用带有该令牌的 CreateProcessAsUser 来获取在用户桌面上运行的代码。这样做的缺点是代码将以登录用户身份运行。由于禁用了所有输入,这可能已经足够安全,并且至少与现有的 XP 解决方案一样安全。]

    编辑:BlockInput 需要较高的强制性完整性级别。您可以尝试将此组添加到令牌中,但随后您的代码会在桌面上运行具有更高权限的代码,并且可能会受到攻击。

    另一种方法可能是使用您的服务来禁用机器上的所有 HID 类设备。

    【讨论】:

    • 我还没有机会实际测试这个。问题可能最终是控制台用户不是特权帐户并且 BlockInput 调用将失败。
    • BlockInput 应该仍然可以工作,我认为它不需要特权。
    • 我编写了一个简单的控制台应用程序以在 Vista 中以受限用户身份测试调用,但它不起作用。我忘记了通话是彻底失败还是成功,只是没有奏效。运行提升的应用程序运行良好。
    • 嗯,非控制台可能会起作用 - 由于控制台窗口有点特别,可能会有一些愚蠢。我将在今天晚些时候对此进行尝试。
    • 是的,需要高度强制性的完整性所有者。扩展答案以涵盖这一点。
    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多