День добрый профессионалы и любители.
Столкнулся с интересной необходимостью, излагаю суть.
Необходимо чтобы запускаемый процесс (если быть точным - запускаю его от SYSTEM) получил окружение от другого пользователя (если быть точным - то окружение не от SYSTEM, а от работающей учетки условно обзовем ADMIN), а именно:
- блок переменных окружения (сделал)
- загруженный куст HKCU от ADMIN (не получилось, это и есть вопрос).
Процесс порождаю этим способом:
все замечательно, порождается, работает. И даже подставленый блок lpEnvironment взятый от процесса который работает от учетки ADMIN - действительно подставил набор переменных окружения от ADMIN
как видно из параметров запуска процесса (dwLogonFlags: "dword", 0) - я не использую процесс загрузки профиля (нам ведь не нужно грузить профиль SYSTEM).
на MSDN( CreateProcessWithTokenW ) сказано, что профиль можно грузить единичкой в параметре dwLogonFlags или самостоятельно, предварительно перед вызовом CreateProcessWithTokenW вызвать функцию LoadUserProfile.
Чтож, ок.
Делаем вызов:
п.с. $token - взят процесса, работающего от ADMIN
Вроде все сделано корректно, вот только LoadUserProfileW не срабатывает, и профиль не подгружается.
Может кто натолкнуть на идею, как правильно сделать так, чтобы порождаемый процесс от SYSTEM стал использовать уже загруженый в пользовательском сеансе профиль ADMIN?
Столкнулся с интересной необходимостью, излагаю суть.
Необходимо чтобы запускаемый процесс (если быть точным - запускаю его от SYSTEM) получил окружение от другого пользователя (если быть точным - то окружение не от SYSTEM, а от работающей учетки условно обзовем ADMIN), а именно:
- блок переменных окружения (сделал)
- загруженный куст HKCU от ADMIN (не получилось, это и есть вопрос).
Процесс порождаю этим способом:
Код:
DllCall(DllOpen("advapi32.dll"), "bool", "CreateProcessWithTokenW", "handle", сдублированый_токен_от_system_процесса, "dword", 0, "ptr", 0, "wstr", "команда_запуска_с_параметрами", "dword", $dwCreationFlags, "ptr", указатель_на_блок_lpEnvironment, "wstr", "рабочая_папка", "ptr", DllStructGetPtr($SI), "ptr", DllStructGetPtr($PI))
все замечательно, порождается, работает. И даже подставленый блок lpEnvironment взятый от процесса который работает от учетки ADMIN - действительно подставил набор переменных окружения от ADMIN
как видно из параметров запуска процесса (dwLogonFlags: "dword", 0) - я не использую процесс загрузки профиля (нам ведь не нужно грузить профиль SYSTEM).
на MSDN( CreateProcessWithTokenW ) сказано, что профиль можно грузить единичкой в параметре dwLogonFlags или самостоятельно, предварительно перед вызовом CreateProcessWithTokenW вызвать функцию LoadUserProfile.
Чтож, ок.
Делаем вызов:
Код:
$Ret = DllCall("Userenv.dll", "int", "LoadUserProfileW", "ptr", $token, "ptr", DllStructGetPtr($PROFILEINFO))
п.с. $token - взят процесса, работающего от ADMIN
Вроде все сделано корректно, вот только LoadUserProfileW не срабатывает, и профиль не подгружается.
Может кто натолкнуть на идею, как правильно сделать так, чтобы порождаемый процесс от SYSTEM стал использовать уже загруженый в пользовательском сеансе профиль ADMIN?