2016-09-09 5 views
0

Я запускаю WindowsService в Windows Server 2012 и должен выдавать себя за пользователя домена администратора (который также добавлен в группу локальных администраторов на машине).Как вызвать LogonUser(), чтобы получить неограниченный полный токен в службе Windows с включенным UAC?

UAC включен в системе, а вызов LogonUser с использованием учетных данных с LogonType из LOGON32_LOGON_INTERACTIVE, кажется, возвращает ограниченный токен вместо полного токена.

Это вызывает административную задачу, которую я пытаюсь сделать, чтобы потерпеть неудачу.

Каков правильный способ вызова LogonUser в этой ситуации, чтобы получить полный токен вместо ограниченного токена?

PS: Я столкнулся с связанным с этим вопросом How can I get elevated permissions (UAC) via impersonation under a non-interactive login? , но он не показывает точные вызовы, которые необходимо выполнить, чтобы получить полный токен.

ответ

4

Вы можете получить нефильтрованный токен из LogonUser(), используя опцию LOGON32_LOGON_BATCH вместо опции LOGON32_LOGON_INTERACTIVE.

В коде this answer приведен пример кода, который показывает использование LOGON32_LOGON_BATCH и функции LogonUser() для получения административного токена.


Добавление:

Если у вас есть SeTcbPrivilege, у вас есть еще один вариант: вы можете использовать LOGON32_LOGON_INTERACTIVE при вызове LogonUser(), а затем использовать опцию TokenLinkedToken в GetTokenInformation(), чтобы получить дескриптор повышенный токен, связанный с фильтрованным токеном.

SeTcbPrivilege также известен как «действовать как часть операционной системы» и обычно доступен только при работе в локальном системном контексте.

Если у вас нет SeTcbPrivilege, вы все равно можете вызвать GetTokenInformation(), чтобы получить копию связанного токена, но в этом случае вы получите маркер олицетворения на уровне SecurityIdentification, поэтому он бесполезен, если вы хотите создать новый процесс. (Кредит RbMm за указание этого.)

+0

Будет ли это основным маркером или импровизацией? – Dev28

+0

Только «LOGON32_LOGON_NETWORK» создает маркер олицетворения. Все остальные параметры, включая 'LOGON32_LOGON_BATCH', производят первичный токен. (Конечно, вы всегда можете преобразовать токен олицетворения в первичный токен или наоборот.) –

+0

См. Также http://stackoverflow.com/a/35027525/886887 –