2010-12-21 4 views
1

Blocking mouse input from a service in Vistaによると、BlockInput()には高い必須の完全性レベルが必要です。また、サービスはデスクトップ上で実行されないため、この機能を使用することはできません。ときどきデスクトップとのやりとりが必要な場合は、サービスを一時的にImpersonateLoggedOnUser()、次にRevertToSelf() にしていますが、ログオンしているユーザーは管理者ではありません。では、偽装中に完全性レベルを高く設定するにはどうすれば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

最終的には、サービスとは別のプロセスを管理者ユーザーとして起動して解決し、サービスは入力をブロックするよう要求します。

関連する問題