在计算机上计数登录和注销Windows 7

问题描述:

我想统计他们计算机用户的登录和注销次数。我从Windows事件日志(从Win32_NTLogEvent WMI类)获取登录/注销信息。例如有以下查询:在计算机上计数登录和注销Windows 7

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

但是,当计算机重新启动或启动它计算3个登录,当用户点击注销或锁定(从开始菜单),然后登录其计数1名登录。用户通过Windows Active Directory进行身份验证。它是否影响登录次数?我可以只计算在用户上使用显式凭证的登录次数吗?

我发现EventCode:4608和4609用于启动和关闭Windows,但我还需要用户注销或锁定计算机时的登录次数。

+0

不知道这是否有帮助:http://msdn.microsoft.com/en-us/library/windows/desktop/ms676845(v=vs.85).aspx – Simon 2012-02-27 00:31:57

+0

您是否试图计算解锁工作站,还是试图避免数呢? – 2012-02-27 20:43:28

+0

我正在计算用户在计算机上的消耗时间。 – 2012-02-28 12:02:15

我发现这个解决方案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 

只要你想要的那些替换值。

现在,这不是一个Java,但VB代码...但它显然使用您可以使用从您的Java程序的WMI接口。或者你可以做一些丑陋的事情,并从Java(或计划任务)调用批处理脚本并读取其输出或使用绑定。

这当然假设您想在用户的计算机上检查此问题,正如您的问题所暗示的那样。如果要计算更全局和不同机器的登录次数,则需要查询Active Directory(或联网基础架构正在使用的其他机制);链接的线程也为此提供了解决方案。

更新:

你可以看看Eric Fitzgeraldblog岗位上Tracking User Logon Activity Using Logon Events,在那里你有相应的代码(以及完整的公式准确的时间跟踪)。

显然,如果您计划使用Fitzgerald公式计算确切的活动时间,您希望事件代码4624(LOGON)和4634(LOGOFF)以及其中列出的其他人。

+0

Windows 7不会生成代码为528的事件... – 2012-03-02 12:17:09

+0

@VentsislavMarinov:查看更新。 – haylem 2012-03-02 13:00:28

更好的方法是使用system service

由RegisterServiceCtrlHandlerEx定义的HandlerEx回调函数可以配置为接收session change notifications,包括登录,注销,锁定和解锁事件。

我不完全确定HandlerEx收到的注销事件是可靠的还是与事件日志显示相同的问题。作为备份,SetConsoleCtrlHandler允许您定义回调函数来接收注销通知。这些通知是可靠的。

远程桌面服务API函数(如WTSEnumerateSessions)也可能很有用,允许您在任何给定时间列出当前登录的用户,或获取有关给定会话的其他信息。工作站上只有这些功能的一部分可用,但它们是您需要的功能。