Подсчет входов и выходов из системы на компьютере Windows 7 - PullRequest
7 голосов
/ 24 февраля 2012

Я хочу посчитать количество входов и выходов из системы пользователей своих компьютеров. Я беру информацию для входов / выходов из журналов событий Windows (из класса WMI Win32_NTLogEvent). Например, с помощью следующего запроса:

select * from Win32_NtLogEvent
where EventCode = 4648 and TimeGenerated > '20120224000000.000000-***'

Но если компьютер был перезагружен или запущен, он считает 3 входа в систему, когда пользователь нажал кнопку выхода или блокировки (из меню «Пуск»), а затем вошел в систему, это означает 1 вход в систему. Пользователь проходит аутентификацию через Windows Active Directory. Влияет ли это на количество входов в систему? Могу ли я рассчитывать только количество входов в систему с использованием явных учетных данных пользователей?

Я нашел EventCode: 4608 и 4609 для запуска и завершения работы Windows, но мне также нужно количество входов в систему, когда пользователь вышел из системы или заблокировал компьютер.

Ответы [ 2 ]

4 голосов
/ 01 марта 2012

Я нашел это решение здесь :

strComputer = "."
Set objWMIService = GetObject("winmgmts:{(Security)}\\" & _
    strComputer & "\root\cimv2")

Set colEvents = objWMIService.ExecQuery _
    ("SELECT * FROM Win32_NTLogEvent WHERE LogFile = 'Security' AND " & _
        "EventCode = 528 AND User = 'fabrikam\\kmyer'") 

Wscript.Echo colEvents.Count

Просто замените значения на те, которые вы хотите.

Теперь это не Java, а код VB... Однако он, очевидно, использует интерфейс WMI, который вы могли бы использовать из вашей программы Java.Или вы можете сделать что-то уродливое и вызвать пакетный скрипт из Java (или запланированное задание) и прочитать его вывод, или использовать привязку.

Это, конечно, при условии, что вы хотите проверить это на компьютере пользователя,как подсказал твой вопрос.Если вы хотите рассчитывать входы в систему на более глобальном уровне и с разных компьютеров, вам нужно запросить Active Directory (или другой механизм, используемый сетевой инфраструктурой);связанная ветка также предлагает решения для этого.

Обновление:

Вы можете посмотреть блог Эрика Фицджеральда публикация в Отслеживание активности пользователей при входе в систему с помощью событий входа в систему , где у вас есть соответствующие коды (а также полные формулы для точного отслеживания времени).

Очевидно, вы хотите коды событий 4624 (LOGON) и 4634 (LOGOFF), а также другие, перечисленные там, если вы планируете использовать формулы Фицджеральда для расчета точного времени активности.

1 голос
/ 04 марта 2012

Лучшим подходом было бы использование системной службы .

Функция обратного вызова HandlerEx , определенная RegisterServiceCtrlHandlerEx, может быть настроена для получения сеанса уведомления об изменениях , включая события входа в систему, выхода из системы, блокировки и разблокировки.

Я не совсем уверен, являются ли события выхода из системы, полученные HandlerEx, надежными или в них присутствуют те же проблемы, что и в журнале событий.В качестве резервной копии SetConsoleCtrlHandler позволяет определить функцию обратного вызова для получения уведомлений о выходе из системы.Эти уведомления являются надежными.

Функции API служб удаленных рабочих столов, такие как WTSEnumerateSessions , также могут быть полезны, позволяя вам перечислить текущих зарегистрированных пользователей в любой момент времени или получитьдополнительная информация о данном сеансе.На рабочих станциях доступны только некоторые из этих функций, но они вам нужны.

...