在计算机上计数登录和注销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,但我还需要用户注销或锁定计算机时的登录次数。
我发现这个解决方案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 Fitzgerald的blog岗位上Tracking User Logon Activity Using Logon Events,在那里你有相应的代码(以及完整的公式准确的时间跟踪)。
显然,如果您计划使用Fitzgerald公式计算确切的活动时间,您希望事件代码4624(LOGON)和4634(LOGOFF)以及其中列出的其他人。
Windows 7不会生成代码为528的事件... – 2012-03-02 12:17:09
@VentsislavMarinov:查看更新。 – haylem 2012-03-02 13:00:28
更好的方法是使用system service。
由RegisterServiceCtrlHandlerEx定义的HandlerEx回调函数可以配置为接收session change notifications,包括登录,注销,锁定和解锁事件。
我不完全确定HandlerEx收到的注销事件是可靠的还是与事件日志显示相同的问题。作为备份,SetConsoleCtrlHandler允许您定义回调函数来接收注销通知。这些通知是可靠的。
远程桌面服务API函数(如WTSEnumerateSessions)也可能很有用,允许您在任何给定时间列出当前登录的用户,或获取有关给定会话的其他信息。工作站上只有这些功能的一部分可用,但它们是您需要的功能。
不知道这是否有帮助:http://msdn.microsoft.com/en-us/library/windows/desktop/ms676845(v=vs.85).aspx – Simon 2012-02-27 00:31:57
您是否试图计算解锁工作站,还是试图避免数呢? – 2012-02-27 20:43:28
我正在计算用户在计算机上的消耗时间。 – 2012-02-28 12:02:15