2010-12-21 145 views
1

根據Blocking mouse input from a service in Vista BlockInput()需要很高的強制完整性級別。此外,服務不能使用該功能,因爲它不能在桌面上運行。每當偶爾需要與桌面進行交互時,我都會暫時使用該服務ImpersonateLoggedOnUser()然後RevertToSelf() 但是,登錄用戶不是管理員。那麼如何在一些模擬中將完整性級別設置爲高,以便BlockInput()?我無法從MSDN文檔中找到有關修改ImpersonateLoggedOnUser()所採用的令牌的信息。任何幫助?如何使服務ImpersonateLoggedOnUser具有較高的強制性完整性級別?

感謝

[編輯:]試圖修改我的模擬代碼如下:

以前,我有這樣的代碼是冒充用戶訪問用戶的註冊表和文件(並在稍後的點開始具有CreateProcessAsUser()的用戶程序):

if (!WTSQueryUserToken(sid, &token)) throw "ERROR: Could not get logged on user token"; 
if (!DuplicateTokenEx(token, TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_IMPERSONATE, 0, SecurityImpersonation, TokenPrimary, &userTok)) 
{ 
    CloseHandle(token); 
    throw "ERROR: Could not duplicate user token"; 
} 
CloseHandle(token); 
if (!ImpersonateLoggedOnUser(userTok)) throw "ERROR: Could not impersonate logged on user"; 
... // Do stuff needing impersonation 
if (!RevertToSelf()) throw "ERROR: Could not revert to self"; 

做BlockInput(1);睡眠(5000);在ImpersonateLoggedOnUser()不會阻止輸入之後。所以,我想ImpersonateLoggedOnUser()之前加入以下權利:

PSID sid(0); 
if (!ConvertStringSidToSid(SDDL_ML_HIGH, &sid)) throw "ERROR: Could not convert string to SID"; 
TOKEN_MANDATORY_LABEL tml; 
tml.Label.Attributes = SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED; 
tml.Label.Sid = sid; 
if (!SetTokenInformation(userTok, TokenIntegrityLevel, &tml, sizeof(tml) + GetLengthSid(sid)))) throw "ERROR: Could not set token information"; 
LocalFree(sid); 

我在執行過程中沒有錯誤,表示它不應該被正確設置它。但輸入仍然沒有被阻止!

回答

0

我最終通過以管理員用戶身份從服務中啓動一個單獨的進程並且服務要求它阻止輸入來解決此問題。

相關問題