java - 计算计算机 Windows 7 上的登录和注销

标签 java windows windows-7 wmi jacob

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

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

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

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

最佳答案

我找到了这个解决方案 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 接口(interface)。或者您可以做一些丑陋的事情并从 Java(或计划任务)调用批处理脚本并读取其输出,或使用绑定(bind)。

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

更新:

你可以看看Eric FitzgeraldblogTracking User Logon Activity Using Logon Events 上发帖,您有相应的代码(以及用于准确时间跟踪的完整公式)。

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

关于java - 计算计算机 Windows 7 上的登录和注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9432929/

相关文章:

java - 使用正则表达式无法仅找到一个单词

java - 创建 JsonProcessingException

c++ - 如何在C++中创建虚拟存储空间?

java - 用 Java 读取 MySQL binary(16) UUID

java - 使用 this 关键字作为 Jenkins 文件中类构造函数的参数

c++ - 创建 DLL 时导出所有符号

c++ - 一个线程写入变量,另一个线程读取该变量,我如何(C++11 之前)保护该变量?

c# - 以编程方式更改某些 Windows 用户名(重命名 Windows 用户)

java - 在Win7 64位中安装Java

delphi - 16 字节边界上手动修复 sse2 数据对齐的替代方法