Проблемы CreateProcessWithLogonW () - необходимо запустить подпроцессы с одним и тем же пользователем - PullRequest
1 голос
/ 27 февраля 2009

У меня есть исполняемый файл Windows, который запускается из службы, вызывая CreateProcessWithLogonW () с набором указанных сведений о пользователе.

Это работает нормально, и процесс начинается, как и ожидалось. Однако, когда этот процесс пытается запустить другие процессы сам, в настоящее время просто используя CreateProcess (), они запускаются и сразу же умирают - это исполняемые файлы, требующие доступа к рабочему столу.

После прочтения статьи Microsoft о CreateProcess () - http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

Я думаю, могу понять, почему это происходит, и это имеет смысл в некоторой степени. CreateProcess () знает, что вызывающий процесс олицетворяет пользователя, поэтому он использует родительский процесс, который в данном случае является учетной записью локальной системы. Но, конечно, все, что выполняется в локальной системной учетной записи, не имеет необходимого нам доступа, поэтому запущенный процесс завершается.

Как ни странно, когда я ранее использовал LogonUser () и CreateProcessAsUser () для запуска исходного исполняемого файла внутри службы, он работал нормально. Но мне пришлось изменить это на CreateProcessWithLogonW () из-за проблем с отсутствием правильных привилегий.

Кто-нибудь знает решение этой проблемы? Я видел разговоры об этом где-то в Интернете, но не с каким-то определенным решением. Похоже, мне может понадобиться токен пользователя, с которым я вхожу в CreateProcessWithLogonW (), чтобы я мог использовать его для запуска других процессов позже? Но у меня нет никакого способа получить этот токен, можно ли каким-либо образом получить его для текущего пользователя?

Любая помощь будет принята с благодарностью, спасибо:)

Ответы [ 4 ]

2 голосов
/ 02 марта 2009

Мы решили проблему с помощью кода, который я нашел давно. Раздел «Авторское право» одного из исходных модулей содержит следующее:

/////////////////////////////////////////////////////////////
// CreateProcessAsUser.cpp
// 
// Written by Valery Pryamikov (1999)
// 
// Command line utility that executes a command under specified user identity 
// by temporarily installing itself as a service.
//
// Based on Keith Brown's AsLocalSystem utility (http://www.develop.com/kbrown)
// Uses some code from Mike Nelson's dcomperm sample utility 
//   and from tlist sample (Microsoft Source Code Samples)
//
// Use:
//  CreateProcessAsUser.exe [-i[nteractive]]|[-s[ystem]]|
//       [-u"UserName" -d"DomainName" -p"Password"]|[-a"AppID"] command
//  Command must begin with the process (path to the exe file) to launch
//  -i        process will be launched under credentials of the 
//            "Interactive User" (retrieved from winlogon\shell process)
//  -a        process will be launched under credentials of the user 
//            specified in "RunAs" parameter of AppID.
//  -s        process will be launched as local system
//  -u -d -p  process will be launched on the result token of the 
//            LogonUser(userName,domainName,password,LOGON32_LOGON_BATCH...)
//
// either (-s) or (-i) or (-a) or (-u -d -p) parameters must supplied
// 
// Examples:
// CreateProcessAsUser -s cmd.exe
// CreateProcessAsUser -a"{731A63AF-2990-11D1-B12E-00C04FC2F56F}" winfile.exe
//
/////////////////////////////////////////////////////////////

Возможно, эта информация даст вам хиты в ваших поисках в Google - я попытался сделать несколько быстрых попыток, но пришел с пустыми руками. Мы разложили внутренние компоненты на набор API, который дал нужные нам результаты.

1 голос
/ 27 февраля 2009

Есть ли у вас код, запущенный с использованием CreateProcessWithLogonW (и который, в свою очередь, вызывает CreateProcess)? Если вы этого не сделаете, то вам может потребоваться выполнить IAT (или API) перехват для него (т.е. во время выполнения), чтобы заменить любые вызовы на CreateProcess соответствующими процедура, которая также использует CreateProcessWithLogonW или CreateProcessWithTokenW. См. APIHijack , Обходы .

После этого дочернему процессу может потребоваться доступ к HKCU. Если вы этого еще не сделали, вам следует загрузить профиль каждого олицетворенного пользователя, один раз для каждого пользователя, прежде чем вызывать CreateProcessWithLogonW.

По умолчанию CreateProcessWithLogonW не загружает указанного пользователя профиль в реестр HKEY_USERS ключ. Это означает, что доступ к информация в HKEY_CURRENT_USER ключ реестра может не дать результатов которые соответствуют нормальному интерактивный вход. Это твое ответственность за загрузку пользователя реестр Hive в HKEY_USERS перед вызывая CreateProcessWithLogonW, используя LOGON_WITH_PROFILE или вызов функции LoadUserProfile.

0 голосов
/ 06 марта 2009

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

То, где вы застряли, находится не в CreateProcess, а в CreateService. Если вы хотите, чтобы ваш сервис мог взаимодействовать с рабочим столом, вы должны указать SERVICE_INTERACTIVE_PROCESS в качестве одного из флагов аргумента dwServiceType. Этот параметр наследуется дочерними процессами службы.

Вы также можете изменить настройки существующей службы с помощью инструмента «Службы», выбрать «Свойства» для службы, нажать вкладку «Вход в систему» ​​и установить флажок «Разрешить службе взаимодействовать с рабочим столом».

0 голосов
/ 27 февраля 2009

Нет ли возможности для служб, позволяющих им взаимодействовать с рабочим столом? Если установка этой опции для вашего сервиса возможна, это, вероятно, будет самым простым решением.

...