2012-02-24 11 views
7

Chcę policzyć liczbę logowań i wylogowań użytkowników ich komputerów. Biorę informacje o logowaniach/wylogowaniach z dzienników zdarzeń systemu Windows (z klasy W_NI_NTLogEvent WMI). Na przykład następujące zapytanie:Policzenia logowania i wylogowania na komputerze Windows 7

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

ale gdy komputer został uruchomiony ponownie lub rozpoczęty liczy 3 logowania, gdy użytkownik kliknął wylogowania lub blokadę (z menu Start), a następnie zalogować się liczy 1 logowania. Użytkownik uwierzytelnia się za pośrednictwem usługi Active Directory systemu Windows. Czy ma wpływ na liczbę logowań? Czy mogę policzyć tylko liczbę logowań przy użyciu jawnych danych uwierzytelniających dla użytkowników?

Znalazłem kod zdarzenia: 4608 i 4609 do uruchamiania i zamykania systemu Windows, ale potrzebuję również liczby logowań, gdy użytkownik wylogował lub zablokował komputer.

+0

Nie wiem, czy to pomaga: http://msdn.microsoft.com/en-us/library/windows/desktop/ms676845(v=vs.85).aspx – Simon

+0

Czy próbujesz policzyć odblokowanie stacji roboczej , lub próbując uniknąć jej liczenia? –

+0

Próbuję policzyć czas spędzony przez użytkowników na komputerze. –

Odpowiedz

4

znalazłem to rozwiązanie here:

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 

prostu zastąpić wartości z tymi, które chcesz.

Teraz nie jest to kod Java, ale VB ... Jednak najwyraźniej korzysta z interfejsu WMI, którego można użyć z poziomu programu Java. Lub możesz zrobić coś brzydkiego i wywołać skrypt wsadowy z Java (lub zaplanowanego zadania) i odczytać jego wyniki lub użyć wiązania.

Jest to oczywiście zakładanie, że chcesz to sprawdzić na komputerze użytkownika, jak wskazuje twoje pytanie. Jeśli chcesz liczyć logowania na bardziej globalnym poziomie iz różnych komputerów, musisz wysłać zapytanie do Active Directory (lub innego mechanizmu, którego używa infrastruktura sieciowa); połączony wątek oferuje również rozwiązania.

Aktualizacja:

Można spojrzeć na Eric Fitzgerald „s blog postu na Tracking User Logon Activity Using Logon Events, gdzie masz odpowiednich kodów (jak również kompletne formuły dla dokładnego śledzenia czasu).

Wygląda na to, że potrzebujesz kodów zdarzeń 4624 (LOGON) i 4634 (LOGOFF) oraz innych wymienionych tam, jeśli planujesz używać formuł Fitzgeralda do obliczenia dokładnego czasu aktywności.

+0

Windows 7 nie generuje zdarzenia z kodem 528 ... –

+0

@VentsislavMarinov: zobacz aktualizację. – haylem

1

Lepszym rozwiązaniem byłoby użycie system service.

Funkcja oddzwaniania HandlerEx, zdefiniowana przez RegisterServiceCtrlHandlerEx, może być skonfigurowana do odbierania session change notifications, w tym zdarzeń logowania, wylogowania, blokady i odblokowania.

Nie jestem do końca pewien, czy zdarzenia wylogowania otrzymane przez HandlerEx są wiarygodne lub czy wykazują te same problemy co dziennik zdarzeń. Jako kopia zapasowa, SetConsoleCtrlHandler umożliwia zdefiniowanie funkcji oddzwaniania w celu odbierania powiadomień o wylogowaniu. Te powiadomienia są wiarygodne.

Funkcje interfejsu API usług pulpitu zdalnego, takie jak WTSEnumerateSessions, mogą być również przydatne, co pozwala w każdej chwili wyświetlić listę aktualnie zalogowanych użytkowników lub uzyskać dodatkowe informacje o danej sesji. Na stacjach roboczych dostępny jest tylko podzbiór tych funkcji, ale są one tymi, których potrzebujesz.

Powiązane problemy