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,但我还需要用户注销或锁定计算机时的登录次数。

4

2 回答 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 代码......但是它显然使用了您可以从 Java 程序中使用的 WMI 接口。或者您可以做一些丑陋的事情并从 Java(或计划任务)调用批处理脚本并读取其输出,或使用绑定。

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

更新:

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

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

于 2012-03-01T12:24:16.043 回答
1

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

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

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

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

于 2012-03-03T23:00:55.363 回答