Как узнать текущее количество интерактивных пользовательских сессий в Windows? - PullRequest
3 голосов
/ 06 июня 2011

Я пишу службу Windows, которая должна знать, есть ли какие-либо пользователи, вошедшие в систему в данный момент.

До сих пор я пробовал Win32_LogonSession (WMI) и LsaEnumerateLogonSessions/ LsaGetLogonSessionData (secur32.dll).

Оба работают и, похоже, возвращают одни и те же данные, но они слишком медленны для обновления при выходе пользователя из системы:

  • Когдасистема запускается, они возвращают «0 интерактивных пользователей».(ОК)
  • Когда я вхожу, они возвращают «1 интерактивного пользователя».(ОК)
  • Но когда я выйду из системы, число пользователей останется равным 1. После нового входа в систему число будет равно 2 и т. Д.

Таким образом, Win32_LogonSession или LsaEnumerateLogonSessions достаточно хороши. Служба должна знать об этом в течение 5 минут после того, как ушел последний интерактивный пользователь.

Даже SysInternals 'LogonSessions.exe не дает актуальных ответов.
Кроме того, ответ не можетбыть «отслеживать события входа и выхода из системы и иметь переменную счетчика», потому что служба может быть запущена в любое время.

1 Ответ

8 голосов
/ 08 июня 2011

Я получил следующий подход: подсчитать количество интерактивных сеансов, в которых запущен хотя бы один процесс.

1) Получить идентификатор сеанса входа в систему для каждого интерактивного сеанса.

2) Получите идентификатор сеанса входа в систему для каждого запущенного процесса.

[Для начала нам нужно включить SeDebugPrivilege для текущего приложения.]

[Затем получите нужные данные.]

3) Устанавливает мощность пересечения

interactiveSessionsCount = | { sessionData.LoginID } ∩ { accessTokenStatistics.AuthenticationId } |

Объекты: sessionData.LoginID и accessTokenStatistics.AuthenticationId оба имеют тип LUID .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...