Я хочу запустить приложение с учетными данными другого пользователя (без повышенных прав), когда этот пользователь уже вошел в систему. В частности, я хочу, чтобы установщик моего приложения (работающий под любой учетной записью администратора) порождал процессы в каждом сеансе рабочего стола вошедшего в систему пользователя. Эти процессы взаимодействуют со службой и отображают окна на рабочем столе для взаимодействия с пользователем.
Обычно из службы, работающей как LocalSystem
, подход: WTSQueryUserToken
-> CreateProcessAsUser
. Однако WTSQueryUserToken
не будет работать за пределами учетной записи LocalSystem
(с привилегией SE_TCB_NAME
), что делает этот подход неудачным.
Если пользователь еще не вошел в систему, я мог бы просто зарегистрировать приложение для запуска под HKLM\...\Run
, чтобы любой вошедший в систему пользователь получал копию приложения при входе в систему. Но если пользователь уже вошел в систему, это тоже не работает (по крайней мере, пока они не выйдут и не войдут снова).
Я вижу два возможных ответа:
Вы не можете этого сделать. К сожалению.
Вы можете получить токен откуда-то еще (может быть, перечислить процессы explorer.exe и извлечь токен доступа у каждого из них?), Вызвать DuplicateTokenEx
, а затем перейти к CreateProcessAsUser
. Я попробовал этот подход и постоянно получал «доступ запрещен» при попытке OpenProcessToken
для процесса, запущенного в другой пользовательской сессии, даже с включенной привилегией отладки и процессом, открытым с PROCESS_ALL_ACCESS
.
Что вы думаете?
Если ответ # 1 («вы не можете сделать это»), то каков рекомендуемый наилучший метод для порождения невыгруженных процессов для посредничества между службой и пользователем? Рекомендуется ли службе порождать эти процессы в каждом сеансе с помощью CreateProcessAsUser? Или лучше не запускать процессы без повышенных прав (например, через HKLM\...\Run
или HKCU\...\Run
)?