无管理员帐户调用BlockInput

时间:2015-10-15 10:57:32

标签: java winapi

对于我的应用程序,需要在应用程序运行时阻止任何用户输入。我正在使用User32.dll的“BlockInput”函数来实现这一目标。

问题是如果用户没有管理员权限,则该功能不起作用。我现在已经实现了一项服务(使用本地系统权限运行)来完成这项工作,即使用户没有管理员权限。

不幸的是,函数调用现在只锁定服务会话的输入设备,而不是用户会话的输入设备。

如何为当前用户会话调用User32.dll函数(来自服务)?

2 个答案:

答案 0 :(得分:2)

  

如何为当前用户会话调用User32.dll函数(来自服务)?

您的服务需要使用CreateProcessAsUser()在用户会话的上下文中启动新流程,然后该流程可以调用BlockInput()

该服务可以使用WTSQueryUserToken()获取CreateProcessAsUser()所需的用户令牌。

要获取用户令牌,服务需要知道用户正在运行的会话ID。您的Java应用程序可以使用OpenProcessToken()GetTokenInformation()发现自己的会话ID,然后发送通过IPC机制向服务提供ID。或者,该服务可以使用WTSEnumerateSessions()WTSQuerySessionInformation()来搜索会话。

答案 1 :(得分:0)

  

如何为当前用户的会话调用user32.dll函数(来自服务)?

你做不到。对BlockInput的限制是有原因的,系统没有提供绕过它们的方法。如果确实如此,首先是限制的重点是什么。

这很简单。如果您想致电BlockInput,那么您需要足够的权利。