java - Tæl logoner og logoffs på computer Windows 7

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil tælle antallet af logoner og logoffs på brugere af deres computere. Jeg tager oplysningerne til logons/logoffs fra Windows-logfilerne (fra Win32\_NTLogEvent WMI-klassen). For eksempel med følgende forespørgsel:


select * from Win32\_NtLogEvent
where EventCode = 4648 and TimeGenerated > '20120224000000.000000-***'


Men når computeren er genstartet eller startet, tæller den 3 logoner, når brugeren har klikket på logoff eller lås (fra startmenuen), og derefter logon den tæller 1 logon. Brugeren godkendes via Windows Active Directory. Har det indflydelse på antallet af logoner? Kan jeg kun tælle antallet af logoner med eksplicitte legitimationsoplysninger til brugere?


Jeg fandt EventCode: 4608 og 4609 til at starte og lukke Windows, men jeg har også brug for antallet af logoner, når brugeren har logget eller låst computeren.

Bedste reference


Jeg fandt denne løsning her: [3]


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

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

Wscript.Echo colEvents.Count


Du skal blot erstatte værdierne med dem, du ønsker.


Nu er det ikke Java, men VB-kode. Det bruger dog tilsyneladende WMI-grænsefladen, som du kan bruge fra dit Java-program. Eller du kan gøre noget grimt og påberåbe et batch script fra Java (eller planlagt opgave) og læse dens output , eller brug en binding.


Dette forudsætter selvfølgelig, at du vil tjekke dette på brugerens computer, som dit spørgsmål antydes. Hvis du vil tælle logoner på et mere globalt plan og fra forskellige maskiner, skal du spørge Active Directory (eller andre mekanisme den netværksbaserede infrastruktur bruger), den linkede tråd tilbyder også løsninger til dette.


Opdatering:


Du kan se på Eric Fitzgeralds blogpost på Tracking User Logon Activity ved hjælp af Logon Events, hvor du har de tilsvarende koder (samt komplette formler til præcis tidssporing). [4] [5] [[[6]


Tilsyneladende vil du have begivenhedskoder 4624 (LOGON) og 4634 (LOGOFF) plus andre der er angivet der, hvis du planlægger at bruge Fitzgeralds formler til at beregne den eksakte aktivitets tid.

Andre referencer 1


En bedre tilgang ville være at bruge en systemtjeneste. [7]


Funktionen HandlerEx-tilbagekaldelse, defineret af RegisterServiceCtrlHandlerEx, kan konfigureres til at modtage meddelelser om ændring af sessionen, herunder logon, logoff, lås og låse op. [8] [9]


Jeg er ikke helt sikker på, om logoff-begivenhederne, der modtages af HandlerEx, er pålidelige, eller hvis de udviser de samme problemer som hændelsesloggen. Som backup gør SetConsoleCtrlHandler dig i stand til at definere en tilbagekaldsfunktion for at modtage logoff-meddelelser. Disse meddelelser er pålidelige. [10]


API-funktionerne til fjernbetjeningstjenester, såsom WTSEnumerateSessions, kan også være nyttige, så du kan liste de brugere, der er logget på, til enhver tid, eller få yderligere oplysninger om en given session. Kun en delmængde af disse funktioner er tilgængelige på arbejdsstationer, men de er de, du har brug for. [11]