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)