2010-12-21 1 views
1

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); 

내가 실행 중에 오류를 얻을, 그것은 바로 설정해야 나타내는. 그러나 입력은 여전히 ​​차단되지 않습니다!

답변

0

필자는 결국 관리자 사용자로 서비스와 별도의 프로세스를 시작하여이를 해결하고 서비스가 입력을 차단하도록 요청합니다.