Re: Как запустить юзеру процесс из NT сервис а?
- From
- Alex Fedotov ()
- To
- Crusader Mike
- Date
- 2002-07-29T18:56:31Z
- Area
- SU.WINDOWS.NT.PROG
From: "Alex Fedotov" <me@alexfedotov.com>
Crusader Mike wrote:
> >> как запустить процесс из NT сервиса, запущенного как LocalSystem, так,
> >> чтобы он был все равно что запущен интерактиывным юзером (т.е. та же
> >> winstation, desktop, access rights, environment, registry hive)? и
> >> получить соотв. error if нет интерактивного юзера.
> AF> http://www.microsoft.com/MSJ/0200/logon/logon.asp
>
> Не помогло :):
> 1. Надо получить access token Interactive User'а. Как?
Существует несколько методов разной степени корректности, я уже перечислял
их здесь и на rsdn.ru, поэтому повторяться не буду. Вот один из методов,
который а) прост в реализации, б) надежно работает в системе с terminal
services.
1. Пишем маленькую программу.
2. Регистрируем эту программу для автозапуска для каждого пользователя в
HKLM\Software\Microsoft\CurrentVersion\Run.
3. При запуске программа соединяется к службе посредством named pipe, RPC
или DCOM.
4. Служба имперсонирует вызывающего пользователя и сохраняет его токен
посредством OpenThreadToken.
5. Служба преобразовывает impersonation token в primary token посредством
DuplicateTokenEx.
6. Программа может теперь завершаться.
Имей в виду, что в системе с terminal services может быть более одного
интерактивного пользователя, соответственно служба может получить более
одного токена. Это уже задача твоей службы решить, под каким пользователем
запускать процесс.
> 2. Ну вызвал LoadUserProfile... И куда мне его деть? Как скормить
> стартуемому процессу так, чтобы его Registry функции лезли именно туда
> куда надо?
Ничего с ним не делать. Ассоциация происходит по primary SID, который
записан в токене. Просто используй один и тот же токен для LoadUserProfile и
для создания процесса.
Более того, в твоем случае этот шаг вообще можно пропустить, потому что
профиль интерактивного пользователя уже загружен.
-- Alex Fedotov
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)