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);
私は実行時にエラーを取得していない、それは右のそれを設定する必要があります示しています。しかし、入力はまだブロックされません!