LogonUser - ›CreateProcessAsUser из системной службы

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

Целевая ОС - Windows XP. У меня есть служба, работающая как «Локальная система», из которой я хочу создать процесс, работающий от имени другого пользователя. Для этого пользователя у меня есть имя пользователя и пароль, поэтому LogonUser работает нормально, и я получаю токен для пользователя (в данном случае - учетную запись администратора). Затем я пытаюсь использовать этот токен для вызова CreateProcessAsUser, но это не удается, потому что этот токен не поставляется с SeAssignPrimaryTokenPrivilege, однако у него есть SeIncreaseQuotaPrivilege. (Я использовал GetTokenInformation для сброса всех привилегий, связанных с этим токеном.) Согласно странице MSDN для CreateProcessAsUser, вам нужны обе привилегии для успешного вызова CreateProcessAsUser.

В нем также говорится, что вам не нужен SeAssignPrimaryTokenPrivilege, если токен, который вы передаете в CreateProcessAsUser (), является «ограниченной версией основного токена вызывающего процесса», который я могу создать с помощью CreateRestrictedToken (), но затем он будет связан с пользователь локальной системы, а не целевой пользователь, от имени которого я пытаюсь запустить процесс.

Итак, как мне создать токен входа в систему, который одновременно является ограниченной версией основного токена вызывающего процесса И связан с другим пользователем? Спасибо!

Обратите внимание, что здесь нет необходимости во взаимодействии с пользователем - все это без присмотра, поэтому нет необходимости делать такие вещи, как захват WINSTA0 и т. Д.


person joshk0    schedule 03.06.2010    source источник
comment
Что возвращает GetLastError после сбоя CreateProcessAsUser?   -  person Anders    schedule 03.06.2010
comment
Вы решили это? Мне тоже нужно решение :)   -  person AgentFire    schedule 31.05.2013
comment
Ребята из Google Chrome также решили эту проблему, используя недокументированный API сервера запуска, который существует вплоть до XP. Если вы можете получить токен для пользователя, которому вы хотите создать процесс, вы можете следовать этому коду здесь: src.chromium.org/chrome/trunk/ SRC / удаленного доступа / хост / победа /   -  person joshk0    schedule 20.07.2013


Ответы (1)


SE_ASSIGNPRIMARYTOKEN_NAME - это привилегия, которую вы можете включить в своем процесс / поток с OpenProcessToken / OpenThreadToken + LookupPrivilegeValue + AdjustTokenPrivileges (это легко спутать с TOKEN_ASSIGN_PRIMARY, и MSDN сообщает, что вам нужно оба присоединить основной токен к процессу)

На этой машине XP: SP2 просто вызов LogonUser (..., LOGON32_LOGON_INTERACTIVE, ...) + CreateProcessAsUser отлично работает без каких-либо привилегий (используется поддельная служба cmd.exe, но это не имеет значения)

Эта цитата в MSDN:

Если необходимые привилегии еще не включены, CreateProcessAsUser включает их на время вызова.

и тот факт, что вы работаете как СИСТЕМА и у вас должна быть возможность включить любые привилегии, заставляет меня думать, что это назначение основного материала не является проблемой.

person Anders    schedule 03.06.2010
comment
Вы правы, это оказался отвлекающий маневр. Однако это полезные знания на будущее. Спасибо. - person joshk0; 07.06.2010