OpenProcessToken завершается ошибкой после ImpersonateLoggedOnUser
У меня есть сервис, который выдает себя за пользователя. Служба работает как локальная система. Пользователь является локальным администратором и администратором домена. После олицетворения мне необходимо настроить токен привилегии процесса. Я надеялся сделать это с помощью OpenProcessToken
а потом AdjustTokenPrivileges
на возвращенной ручке токена.
После звонка LogonUser
а также ImpersonateLoggedOnUser
следующий вызов не выполняется, доступ запрещен.
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
Log("Error=%d", GetLastError());
}
Я вхожу на пользователя с помощью LOGON32_LOGON_INTERACTIVE
а также LOGON32_PROVIDER_DEFAULT
,
Настройка той же привилегии на токене пользователя выполнена успешно.
1 ответ
Это ответ из двух частей, в зависимости от того, что вы пытаетесь сделать:
1) Если вы хотите настроить привилегии для маркера олицетворения, вам нужно использовать функцию OpenThreadToken, а не OpenProcessToken. Олицетворение влияет на поток, а не на процесс в целом. Попробуй это:
OpenThreadToken(GetCurrentThread(), TOKEN_READ | TOKEN_ADJUST_PRIVILEGES, TRUE, &hToken)
2) Если вы действительно хотите настроить привилегии для токена процесса, вам, вероятно, следует сделать это в тот момент, когда вы не выдаете себя за клиента. Вы можете включать и выключать олицетворение по мере необходимости.