2015-10-15 76 views
-1

對於我的應用程序,需要在應用程序運行時阻止任何用戶輸入。我正在使用User32.dll的「BlockInput」功能來實現此目的。在沒有管理員帳戶的情況下調用BlockInput

問題是如果用戶沒有管理員權限,則該功能不起作用。我現在已經實現了一項服務(使用本地系統權限運行)來完成這項工作,即使用戶沒有管理員權限。

不幸的是,函數調用現在只鎖定服務會話的輸入設備,而不鎖定用戶會話的輸入設備。

如何爲當前用戶會話調用User32.dll函數(來自服務)?

+1

似乎是一個非常重的手段。你爲什麼有這個要求? –

+0

我的應用程序執行不允許普通用戶完成的關鍵操作。 – gorootde

+0

服務在會話0中運行,用戶在會話1中工作。在一個會話中阻塞輸入不會影響另一個,這應該是顯而易見的。這聽起來很像XY問題。您需要執行哪些關鍵操作才能禁用像這樣的用戶輸入? –

回答

2

如何爲當前用戶會話調用User32.dll函數(來自服務)?

您的服務需要使用CreateProcessAsUser()在用戶會話的上下文中啓動一個新的進程,那麼該過程可以調用BlockInput()

該服務可以使用WTSQueryUserToken()獲取CreateProcessAsUser()所需的用戶令牌。

要獲得用戶令牌,服務需要知道用戶正在運行的會話ID。您的Java應用程序可以使用OpenProcessToken()GetTokenInformation()發現自己的會話ID,然後通過IPC將該ID發送到服務機制。或者服務可以使用WTSEnumerateSessions()WTSQuerySessionInformation()來尋找會話。

+0

好的,我已經實現了。我現在可以在用戶會話中執行任何進程 - 但不幸的是只有當前登錄用戶的權限(這是不夠的)。如何使用管理員權限執行? – gorootde

+0

請參閱http:// stackoverflow。com/questions/33212984/createprocessasuser-with-elevated-priviledges如何做到這一點 – gorootde

0

如何爲當前用戶的會話調用user32.dll函數(來自服務)?

你不行。 BlockInput的限制是有原因的,系統沒有辦法讓你繞過它們。如果是這樣,首先限制的意義何在?

這很簡單。如果你想撥打BlockInput,那麼你需要足夠的權利。

+0

準確而言:應用程序不會與管理權限一起運行,但應用程序的設置確實如此。我現在將應用程序分成一個服務(包含需要管理權限的部分)和應用程序本身(它調用服務)。 – gorootde

+0

安排您從運行在所需桌面的進程調用'BlockInput',並使用足夠的進程。這真的很簡單。 –

相關問題