Мне нужно отслеживать текущий пользователь (тот, который использует консоль) в Windows XP SP3.
Я попробовал следующее:
-
Microsoft.Win32.SystemEvents.SessionSwitch: работает для одиночных событий входа/выхода из системы, но не может обнаружить пользователя коммутатора.
Если происходит следующее:
- Вход пользователя
- Пользователь userA
- userB login
- выход из системы пользователя
- сеанс восстановления userA
События 3 и 4 не распознаются SystemEvents.SessionSwitch
-
Мониторинг журнала событий "Безопасность": события несовместимы и выходят из строя. Например, если список выше воспроизводится, я получаю идентификатор события 528 (вход в систему), за которым следуют два 538 (выход из системы) для пользователя А после восстановления его сеанса. Проверка события .TimeGenerated не помогает. Этот метод также не работает, если аудит отключен в SecPol.msc.
-
P/Invoking WTSRegisterSessionNotification: работает нормально. Мне пришлось создать скрытую форму, переопределить ее WndProc для обработки сообщений WM_WTSSESSION_CHANGE, а затем вызвать WTSQuerySessionInformation, чтобы получить имя пользователя, связанное с событием. Этот метод выглядит слишком сложным, есть ли более простой способ?
Edit:
- Вызов WTSGetActiveConsoleSessionId также работает каждый миллисекунды, но я ищу метод, основанный на событиях.