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



我想统计用户计算机上的登录和注销次数。我从Windows事件日志(从Win32_NTLogEventWMI类)。例如以下查询:

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

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

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

我在这里找到了这个解决方案:

strComputer = "."
Set objWMIService = GetObject("winmgmts:{(Security)}\" & _
    strComputer & "rootcimv2")
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关于使用登录事件跟踪用户登录活动的博客文章,其中有相应的代码(以及准确时间跟踪的完整公式)。

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

更好的方法是使用系统服务。

由RegisterServiceCtrlHandlerEx定义的HandlerEx回调函数可以配置为接收会话更改通知,包括登录、注销、锁定和解锁事件。

我不完全确定HandlerEx接收到的注销事件是否可靠,或者它们是否表现出与事件日志相同的问题。作为备份,SetConsoleCtrlHandler允许您定义一个回调函数来接收注销通知。这些通知是可靠的。

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

最新更新