Перехватывать события входа/выхода из Windows

У меня есть служба, которая будет работать на системном уровне. Теперь я хочу отслеживать в нем пользователя, вошедшего в систему. Раньше я пытался получить имя пользователя, вошедшего в систему, из API GetUserName, но в моем случае он каждый раз возвращает «SYSTEM».

Есть ли способ войти в систему под именем пользователя в моем случае? или есть ли какой-нибудь хук, который я могу установить, чтобы я мог узнать, какой пользователь вошел в систему?

PS: я в основном работаю в Delphi 2007, но эти вопросы относятся к Win32 API.


person x.509    schedule 14.01.2009    source источник


Ответы (3)


Я не знаком с реализацией служб Windows в Delphi, но везде, где вы устанавливаете элементы управления, принимаемые службой, вы должны добавить SERVICE_ACCEPT_SESSIONCHANGE. Затем в вашей функции обратного вызова HandlerEx параметр dwEventType будет одним из значений WM_WTSSESSION_CHANGE, а lpEventData будет указателем на структуру WTSSESSION_NOTIFICATION, которая содержит идентификатор сеанса события.

Вы можете использовать эту информацию вместе с API служб терминалов, чтобы определить, кто что сделал.

person Stephen Martin    schedule 14.01.2009
comment
Чтобы найти имя пользователя по идентификатору сеанса, используйте WTSQuerySessionInformation со значением WTS_INFO_CLASS, равным WTSUserName. - person Stephen Martin; 14.01.2009
comment
Собственная сервисная среда Delphi не поддерживает расширенные уведомления, появившиеся в Win2000 и более поздних версиях. - person Remy Lebeau; 04.06.2009

Вы можете использовать SENS для прослушивания и подписки на уведомления о входе в систему.

person On Freund    schedule 14.01.2009

Вы должны быть более конкретными в своих требованиях. В любой момент времени может быть несколько пользователей, зарегистрированных локально или удаленно. Вас интересуют только интерактивные пользователи?

Самый распространенный запрос — как получить локального интерактивного пользователя, то есть человека, который физически сидит за клавиатурой и экраном. Существуют различные вопросы, которые вы должны рассмотреть, прежде чем решить, как действовать дальше. В MSDN есть хорошая запись о Window Stations, объяснит ситуацию лучше, чем я.

person Stu Mackellar    schedule 14.01.2009
comment
ну, я почти уверен, что меня интересует только интерактивный пользователь. Мне нужно отслеживать активность пользователя (сотрудник-трекер), и мне нужно сохранить данные для текущего вошедшего в систему пользователя. вот почему я ищу зарегистрированное имя пользователя. В настоящее время я делаю это для имени компьютера. - person x.509; 14.01.2009