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)