Re: Logoff current user in Windows NT

From
Alex Fedotov ()
To
Demid
Date
2001-06-07T05:13:06Z
Area
SU.WINDOWS.NT.PROG
From: "Alex Fedotov" <alexf@3cube.com>

Demid wrote:

> Дано:
> Нужно написать Windows NT Service, который, кроме всего прочего, мог бы
> разлоговывать пользователя, сидящего за консолью. Не перегружая при этом
> машину.
> Поковырявшись в MSDN придумал следующий алгоритм:
>
> 1. Service создает новый процесс;
> 2. Процесс ищет Window Station текущего пользователя на консоли;
> 3. Процесс присоединяется к найденной Window Station, выполняет
>     AdjustTokenPrivileges и ExitWindowsEx с соответствующими параметрами.

Я бы тут делал наоборот. Сервис запускает процесс, сразу присоединенный к
нужной станции, указывая имя станции и десктопа в поле lpDesktop структуры
STARTUPINFO при создании процесса. Искать ничего не надо, поскольку
интерактивная станция всегда winsta0, а десктоп пользователя всегда default.
Кроме того, ты должен запустить процесс от имени того пользователя, которого
собираешься log off. Рекомендую почитать вот эту статью про запуск процессов
от имени другого пользователя:
http://msdn.microsoft.com/library/periodic/period00/logon.htm

> 1. Я вообще в правильном направлении иду, или это не будет работать,
>     или это будет работать, но можно проще и т.д.?

Есть вариант с заменой GINA DLL. Технически, он может оказаться проще, но я
бы не стал его использовать здесь по организационным причинам.

> 2. Как создать процесс? CreateProcess и аналогичные функции хотят
>     ModuleName, т.е. код, выполняющий нужные операции, нужно помещать
>     в отдельный файл. Разве нельзя в Windows создать процесс,
>     выполняющий что-то из находящегося в памяти?

Из памяти можно только теоретически, в реальной жизни этим заниматься не
стоит. Тебе надо пользоваться функцией CreateProcessAsUser.

> 3. Я нашел только функцию OpenInputDesktop, которая возвращает handle
>     десктопа, в который передается ввод пользователя. Как по этому
>     десктопу определить, в какой Window Station он находится?

Ничего не надо определять. Интерактивная window station всегда называется
"winsta0", даже в Terminal Services, где их несколько. В качестве имени
десктопа можешь использовать "default". Большой роли это не играет, так как
программа GUI показывать не собирается.

> 4. Если пользователь не залогован или консоль заблокирована, чей
>     desktop в этом случае считается активным?

Активным будет десктоп Winlogon, но в этом случае это не важно.

Успехов.

--
Alex Fedotov


Отправлено через сервер Talk.Ru - http://www.talk.ru
--- ifmail v.2.15dev5
 * Origin: 3Cube, Inc. (www.3cube.com) (2:5020/400)