Blocking mouse input from a service in Vista에 따르면 BlockInput()에는 높은 필수 무결성 수준이 필요합니다. 또한 서비스는 데스크탑에서 실행되지 않으므로이 기능을 사용할 수 없습니다. 데스크톱과의 가끔 상호 작용이 필요할 때마다 서비스를 일시적으로 사용합니다. 그러나 로그온 한 사용자는 관리자가 아닙니다. 그렇다면 일부 인칭 중에 무결성 수준을 높음으로 설정하여 BlockInput()을 구현할 수 있습니까? 나는 ImpersonateLoggedOnUser()가 취하는 토큰을 수정하는 것에 대해 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";
Doing 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);
내가 실행 중에 오류를 얻을, 그것은 바로 설정해야 나타내는. 그러나 입력은 여전히 차단되지 않습니다!