Здравствуйте, 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.