ImpersonateLoggedOnUser без SeImpersonatePrivilege

У меня есть пользователь без прав администратора (без SeImpersonatePrivilege), который должен временно выдавать себя за другого пользователя. В соответствии с статья MSDN для ImpersonateLoggedOnUser (акцент мой):

Все олицетворяющие функции, включая ImpersonateLoggedOnUser, разрешают запрошенную олицетворение, если выполняется одно из следующих условий:

• Запрошенный уровень олицетворения токена меньше, чем SecurityImpersonation,
такие как SecurityIdentification или SecurityAnonymous.
• У вызывающей стороны есть привилегия SeImpersonatePrivilege.
• Процесс (или другой процесс в сеансе входа в систему вызывающей стороны) создал токен
используя явные учетные данные через функцию LogonUser или LsaLogonUser.
• Идентифицированная личность такая же, как и у вызывающего абонента.

Я пытаюсь использовать курсив. Я могу создать токен с помощью LogonUserW:

HANDLE token = NULL;
if (::LogonUserW(user, L".", password, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, &token))
{
if (::ImpersonateLoggedOnUser(token))
{
DoOtherUserStuff();
}
}

Это вызовы успешно; Дохожу до функции DoOtherUserStuff. Тем не менее, когда я пытаюсь использовать токен, который я только что создал, для выполнения каких-либо действий, требующих проверки привилегий, он не работает. GetLastError возвращает 1346, что

Либо требуемый уровень олицетворения не был предоставлен, либо предоставленный уровень олицетворения недействителен.

Это ошибка, которая появляется, если вы пытаетесь выдать себя за другого пользователя, используя токен, полученный другим способом (OpenThreadToken и т. Д.), И не имеете SeImpersonatePrivilege. Однако я создаю токен с помощью LogonUser с явными учетными данными. Почему это не работает? Документация MSDN просто не так?

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

Система Windows 8.0 Enterprise. Вызывающая сторона — это учетная запись Microsoft, но пользователь, вошедший в систему и выдавший себя за нее, является локальной учетной записью.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]