在Windows 7上统计登录和注销次数

7

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

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

但是当计算机重新启动或启动时,它会计算3个登录次数。当用户点击注销或锁定(从开始菜单)然后再登录时,它会计算1个登录次数。用户通过Windows Active Directory进行身份验证。这会影响登录次数吗?我能否仅使用用户显式凭据计算登录次数?
我发现EventCode:4608和4609用于启动和关闭Windows,但我还需要在用户注销或锁定计算机时的登录次数。

不知道这是否有帮助:http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms676845(v=vs.85).aspx - Simon
你是想要计算解锁工作站的次数,还是想要避免计算它? - Harry Johnston
我正在尝试计算用户在电脑上花费的时间。 - Svetoslav Marinov
你能发布一些示例输入(日志)吗? - Pragalathan M
@HarryJohnston 你认为哪种机制比较好? - Ventsislav Marinov
显示剩余4条评论
2个回答

4

我在这里找到了解决方案(链接)

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(或网络基础架构使用的其他机制);链接的线程也提供了这方面的解决方案。

更新:

您可以查看Eric Fitzgerald博客文章“使用登录事件跟踪用户登录活动”,其中包含相应的代码(以及准确时间跟踪的完整公式)。

显然,您想要事件代码4624(登录)和4634(注销),以及在那里列出的其他代码,如果您计划使用Fitzgerald的公式来计算确切的活动时间。


1
更好的方法是使用系统服务
由RegisterServiceCtrlHandlerEx定义的HandlerEx回调函数可以配置为接收包括登录、注销、锁定和解锁事件在内的会话更改通知
我不确定HandlerEx接收到的注销事件是否可靠,或者它们是否像事件日志一样存在问题。作为备份,SetConsoleCtrlHandler允许您定义一个回调函数来接收注销通知。这些通知是可靠的。
远程桌面服务 API 函数,例如 WTSEnumerateSessions,也可能很有用,允许您在任何给定时间列出当前登录的用户,或获取有关给定会话的其他信息。这些函数仅在工作站上提供子集,但它们是您所需的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接