2012-02-24 15 views
7

Desidero contare il numero di accessi e disconnessioni sugli utenti dei loro computer. Prendo le informazioni per gli accessi/disconnessioni dai registri eventi di Windows (dalla classe WMI Win32_NTLogEvent). Ad esempio, con seguente query:Conta gli accessi e le disconnessioni sul computer Windows 7

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

Ma quando il computer è stato riavviato o avviato conta 3 accessi, quando l'utente ha fatto clic disconnessione o blocco (dal menu Start) e poi accedere conta 1 accesso. L'utente si autentica tramite Windows Active Directory. Influisce sul numero di accessi? Posso contare solo il numero di accessi utilizzando credenziali esplicite per gli utenti?

Ho trovato EventCode: 4608 e 4609 per l'avvio e l'arresto di Windows ma ho bisogno anche del numero di accessi quando l'utente ha disconnesso o bloccato il computer.

+0

Non so se questo aiuta: http://msdn.microsoft.com/en-us/library/windows/desktop/ms676845(v=vs.85).aspx – Simon

+0

Stai cercando di contare lo sblocco della workstation , o cercando di evitare di contarlo? –

+0

Sto provando a contare il tempo trascorso dagli utenti sul computer. –

risposta

4

ho trovato questa soluzione 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 

Basta sostituire i valori con quelli che si desidera.

Ora questo non è un codice Java ma VB ... Tuttavia, apparentemente utilizza l'interfaccia WMI che è possibile utilizzare dal proprio programma Java. Oppure potresti fare qualcosa di brutto e invocare uno script batch da Java (o un'attività pianificata) e leggerne l'output o utilizzare un'associazione.

Si presume ovviamente che si desideri verificarlo sul computer dell'utente, come suggerito dalla domanda. Se si desidera contare gli accessi a un livello più globale e da macchine diverse, è necessario eseguire una query su Active Directory (o su altri meccanismi utilizzati dall'infrastruttura in rete); il thread collegato offre anche soluzioni per questo.

Aggiornamento:

Si può avere uno sguardo al Eric Fitzgerald s' blog post su Tracking User Logon Activity Using Logon Events, dove si hanno i codici corrispondenti (come pure le formule complete per un accurato monitoraggio del tempo).

Apparentemente si desiderano i codici evento 4624 (LOGON) e 4634 (LOGOFF), più altri elencati se si prevede di utilizzare le formule di Fitzgerald per calcolare l'ora esatta dell'attività.

+0

Windows 7 non genera eventi con codice 528 ... –

+0

@VentsislavMarinov: vedere l'aggiornamento. – haylem

1

Un approccio migliore sarebbe utilizzare system service.

La funzione di richiamata HandlerEx, definita da RegisterServiceCtrlHandlerEx, può essere configurata per ricevere session change notifications compresi gli eventi di accesso, disconnessione, blocco e sblocco.

Non sono completamente sicuro se gli eventi di disconnessione ricevuti da HandlerEx sono affidabili o se presentano gli stessi problemi del registro eventi. Come backup, SetConsoleCtrlHandler consente di definire una funzione di callback per ricevere notifiche di disconnessione. Queste notifiche sono affidabili.

Le funzioni API di servizi di desktop remoto, come ad esempio WTSEnumerateSessions, possono anche essere utili, consentendo di elencare gli utenti attualmente connessi in un dato momento o ottenere informazioni aggiuntive su una determinata sessione. Solo un sottoinsieme di queste funzioni è disponibile sulle workstation, ma sono quelle necessarie.