Как получить сервис ImpersonateLoggedOnUser, но с высоким уровнем обязательной целостности? - PullRequest
1 голос
/ 21 декабря 2010

Согласно Блокировка ввода мышью из службы в Vista BlockInput () требует высокого уровня обязательной целостности. Кроме того, служба не может использовать эту функцию, поскольку она не работает на рабочем столе. Всякий раз, когда требуется случайное взаимодействие с рабочим столом, у меня есть служба временно ImpersonateLoggedOnUser () и затем RevertToSelf () Однако вошедший в систему пользователь не является администратором. Итак, как мне установить высокий уровень целостности во время некоторых олицетворений, чтобы я мог BlockInput ()? Я не смог выяснить из документации MSDN об изменении токена, который принимает ImpersonateLoggedOnUser (). Любая помощь?

Спасибо

[Edit:] Попытался изменить мой код подражания следующим образом:

Раньше у меня был подобный код, который олицетворяет пользователя для доступа к реестру и файлам пользователя (и позже запускает пользовательскую программу с 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); Sleep (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);

Я не получаю ошибок во время выполнения, указывая, что это должно быть правильно. Но ввод по-прежнему не блокируется!

1 Ответ

0 голосов
/ 14 июля 2011

Я, в конце концов, решил эту проблему, запустив отдельный процесс от службы в качестве пользователя-администратора, и служба просит его заблокировать ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...