Winapi 阻止Vista中服务的鼠标输入

Winapi 阻止Vista中服务的鼠标输入,winapi,windows-vista,Winapi,Windows Vista,我在大学校园中维护各种托管用户实验室。这些机器目前都运行Windows XP,我们有一个Windows服务,用于通过阻止任何键盘或鼠标输入来“锁定”机器。锁定发生在我们的脚本操作系统安装过程中,因此用户不能意外地停止或中断进程。它还用于阻止用户登录到机器,直到他们在给定实验室的前台签出。Ctrl+Alt+Del通过键盘过滤器驱动程序被阻止,其余的键和鼠标当前使用user32.dll中的函数被阻止 在XP中,服务作为本地系统运行,必须通过BlockInput()调用启用“允许服务与桌面交互”复选框

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

在XP中,服务作为本地系统运行,必须通过BlockInput()调用启用“允许服务与桌面交互”复选框才能成功。在Vista下,由于这些变化,我猜这不再有效。调用成功,但输入实际上未被阻止

键盘过滤器驱动程序仍然可以正常工作,我们可以使用它来阻止整个键盘,而不仅仅是Ctrl+Alt+Del。但我不知道我们现在该如何阻止鼠标。我甚至不能完全确定会话0隔离是否应该受到责备


有谁能推荐一个修复或解决方案,让我们在Vista及更高版本中阻止来自服务的鼠标输入?我一直在寻找没有运气的替代win32 API。假设是会话0隔离造成的,那么是否有合法的方式从会话1调用函数,或者这种方式会破坏隔离的目的?我是否必须依赖于在用户登录时运行并与服务通信的提升的companion exe?

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

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


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

我还没有机会实际测试这一点。问题可能最终是控制台用户不是特权帐户,BlockInput调用将失败。BlockInput仍然可以工作,我认为它不需要特权。我编写了一个简单的控制台应用程序,在Vista中作为受限用户测试调用,但它不起作用。我忘记了电话是彻底失败了,还是成功了,只是不起作用。运行这个应用程序可以很好地工作。嗯,非控制台可能可以工作-可能有一些好的地方,因为consle窗口有点特殊。今天晚些时候我会尝试一下。是的,需要高度的强制性诚信所有者。扩展的答案涵盖了这一点。