Java 不使用管理员帐户调用BlockInput

Java 不使用管理员帐户调用BlockInput,java,winapi,Java,Winapi,对于我的应用程序,需要在应用程序运行时阻止任何用户输入。我正在使用User32.dll的“BlockInput”函数来实现这一点 问题是,如果用户没有管理员权限,该函数将无法工作。我现在已经实现了一个服务(使用本地系统权限运行)来完成这项工作,即使用户没有管理员权限 不幸的是,函数调用现在只锁定服务会话的输入设备,而不锁定用户会话的输入设备 如何为当前用户会话调用User32.dll函数(从服务中) 如何为当前用户的会话调用user32.dll函数(从服务中) 你不能。BlockInput上的限

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

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

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

如何为当前用户会话调用User32.dll函数(从服务中)

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

你不能。
BlockInput
上的限制是有原因的,系统无法让您绕过这些限制。如果它这样做了,那么限制首先有什么意义呢

这很简单。如果要调用
块输入
,则需要足够的权限

如何为当前用户会话调用User32.dll函数(从服务中)

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

该服务可用于获取
CreateProcessAsUser()
所需的用户令牌


要获取用户令牌,服务需要知道用户正在运行的会话ID。您的Java应用程序可以通过使用和发现自己的会话ID,然后通过IPC机制将ID发送给服务。或者,服务可以使用and搜索会话。

似乎是一种非常严厉的方法。为什么有此要求?我的应用程序执行正常用户不允许执行的关键操作。服务在会话0中运行,用户在会话1中工作。在一个会话中阻塞输入不会影响另一个会话,这应该是显而易见的。这听起来很像一个XY问题。您正在执行哪些关键操作需要禁用这样的用户输入?它用于类似VNC的远程桌面操作。远程用户可以访问标准用户看不到的UI组件。因此,在活动的远程会话期间,本地用户必须被“锁定”。确切地说,应用程序不具有管理权限,但应用程序的设置具有管理权限。现在,我已经将应用程序拆分为一个服务(包含需要管理权限的部分)和应用程序本身(调用该服务)。安排从所需桌面上运行的进程调用
BlockInput
,并提供足够的进程。其实很简单。好的,我已经实现了。我现在可以在用户会话中执行任何进程,但不幸的是,只能使用当前登录用户的权限(这是不够的)。如何使用管理员权限执行?请参阅如何执行