根据Blocking mouse input from a service in Vista BlockInput()需要高强制完整性级别。此外,服务无法使用该功能,因为它不在桌面上运行。每当需要偶尔与桌面交互时,我暂时使用服务ImpersonateLoggedOnUser()然后RevertToSelf() 但是,登录用户不是管理员。那么如何在一些模拟过程中将完整性级别设置为高,这样我就可以使用BlockInput()?我无法从MSDN文档中找出有关修改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 :(得分:0)
我最终通过以管理员用户身份从服务启动一个单独的进程来解决它,并且服务要求它阻止输入。