CreateProcessAsUser не из службы - PullRequest
       26

CreateProcessAsUser не из службы

3 голосов
/ 12 марта 2012

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

Обычно из службы, работающей как LocalSystem, подход: WTSQueryUserToken -> CreateProcessAsUser. Однако WTSQueryUserToken не будет работать за пределами учетной записи LocalSystem (с привилегией SE_TCB_NAME), что делает этот подход неудачным.

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

Я вижу два возможных ответа:

  1. Вы не можете этого сделать. К сожалению.

  2. Вы можете получить токен откуда-то еще (может быть, перечислить процессы explorer.exe и извлечь токен доступа у каждого из них?), Вызвать DuplicateTokenEx, а затем перейти к CreateProcessAsUser. Я попробовал этот подход и постоянно получал «доступ запрещен» при попытке OpenProcessToken для процесса, запущенного в другой пользовательской сессии, даже с включенной привилегией отладки и процессом, открытым с PROCESS_ALL_ACCESS.

Что вы думаете?

Если ответ # 1 («вы не можете сделать это»), то каков рекомендуемый наилучший метод для порождения невыгруженных процессов для посредничества между службой и пользователем? Рекомендуется ли службе порождать эти процессы в каждом сеансе с помощью CreateProcessAsUser? Или лучше не запускать процессы без повышенных прав (например, через HKLM\...\Run или HKCU\...\Run)?

...