根據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);
我在執行過程中沒有錯誤,表示它不應該被正確設置它。但輸入仍然沒有被阻止!