SendInput() from Windows Service
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 28.09.18 12:16
Оценка:
Нужен сабж.
Как я понял, это не то чтобы совсем невозможно, но нормального решения нет. Нужно создавать дочерний процесс. У кого-то есть опыт? Спасибо
С уважением, Владислав Полищук
Re: SendInput() from Windows Service
От: okman Беларусь https://searchinform.ru/
Дата: 28.09.18 13:07
Оценка: 66 (1)
Здравствуйте, vladpol, Вы писали:

V>Нужен сабж.

V>Как я понял, это не то чтобы совсем невозможно, но нормального решения нет.

Для начала нужно как-то определить ID сессии залогиненного пользователя, кому
предназначен этот SendInput. А пользователей может быть несколько. "Наихудший" сценарий:
сервер терминалов с NN параллельно залогиненных и активных пользователей.

V>Нужно создавать дочерний процесс. У кого-то есть опыт? Спасибо


Из службы: WTSQueryUserToken, DuplicateTokenEx и затем SetTokenInformation + TokenSessionId.
Подразумевается, что служба запущена с учеткой LocalSystem (у других не хватит прав).
На выходе получаем access token нужного пользователя с установленным ID сессии.
Далее CreateProcessAsUser с этим токеном. В STARTUPINFO нужно записать имя десктопа: "WinSta0\Winlogon".

Если нужно полное "сходство" с процессом пользователя, следует в CreateProcessAsUser еще
указать правильные переменные окружения, см. CreateEnvironmentBlock.

Если нужен 'elevated-токен' (т.е. как бы запущенный от имени администратора, а не стандартного юзера),
тогда можно WTSQueryUserToken и GetTokenInformation + TokenLinkedToken.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.