У меня есть служба, которая будет работать на уровне СИСТЕМЫ. Теперь я хочу отслеживать вошедшего в него пользователя. Раньше я пытался получить имя пользователя, вошедшего в систему, из API GetUserName, но в моем случае он каждый раз возвращал «СИСТЕМА».
Есть ли способ войти в систему под именем пользователя в моем случае? или есть какой-нибудь крючок, который я могу установить, чтобы узнать, какой пользователь вошел в систему?
P.S: Я в основном работаю в Delphi 2007, но эти вопросы относятся к Win32 API.





Вы можете использовать SENS для прослушивания и подписки на уведомления о входе в систему.
Вы должны быть более конкретными в своих требованиях. В любой момент времени могут быть зарегистрированы несколько пользователей, локально или удаленно. Вы заботитесь только об интерактивных пользователях?
Самый распространенный запрос - как получить локально вошедшего в систему интерактивного пользователя, то есть человека, который физически сидит за клавиатурой и экраном. Есть различные вопросы, которые вы должны рассмотреть, прежде чем решить, как действовать дальше. В MSDN есть хорошая запись на Оконные станции, которая лучше меня объяснит ситуацию.
Я не знаком с реализацией служб Windows в Delphi, но где бы вы ни устанавливали элементы управления, принятые службой, вы должны добавить SERVICE_ACCEPT_SESSIONCHANGE. Затем в вашей функции обратного вызова HandlerEx параметр dwEventType будет одним из значений WM_WTSSESSION_CHANGE, а lpEventData будет указателем на структуру WTSSESSION_NOTIFICATION, которая содержит идентификатор сеанса события.
Вы можете использовать эту информацию вместе с API служб терминалов, чтобы определить, кто что сделал.
Чтобы найти имя пользователя из идентификатора сеанса, используйте WTSQuerySessionInformation со значением WTS_INFO_CLASS WTSUserName.
Собственно сервисная структура Delphi не поддерживает расширенные уведомления, которые были введены в Win2000 и позже.
ну, я почти уверен, что меня интересует только интерактивный пользователь. Мне нужно отслеживать активность пользователя (сотрудник-трекер), и мне нужно сохранить данные для «текущего пользователя, вошедшего в систему». вот почему я ищу имя пользователя, вошедшего в систему. В настоящее время я делаю это для имени компьютера.