Здравствуйте Вячеслав Мишуров, Вы писали:
ВМ>Есть работающий сервис. ВМ>В некоторый момент он выводит окно, одна из кнопок на котором ВМ>запускает Outlook Express. Но запускается он для LocalAccount, ВМ>а надо для залогиненого юзера. Как поступить ?
Надо каким-то образом заполучить токен текущего пользователя. Это можно сделать:
1) перечислив процессы и взяв токен, скажем, еxplorer.exe (более точно — процесса оболочки, зарегистрированного в системе), либо
2) иметь процесс, запускаемый в контексте пользователя (например, с помощью ключа реестра Run), который соединяется с сервисом посредством named pipe, COM или другого механизма, поддерживающего имперсонацию. В этот момент сервис может имперсонировать пользователя и получить его токен. Вспомогательный процесс может благополучно завершиться после этого.
Второй способ лучше, так как корректно работает в случае нескольких интерактивных сессий в Terminal services и XP Fast User Switching.
После того как токен получен, процесс OE создается функцией CreateProcessAsUser, причем в структуре STARTUPINFO необходимо не забыть указать lpDesktop как "winsta0\\default".
Для полной иллюзии создания интерактивного процесса, в CreateProcessAsUser нужно передать новый environment block и заполнить его переменными, исходя из списка переменных окружения пользователя: