获取Windows机器指定时间段的活跃时长及应用使用时长
Windows系统状态及应用使用时长统计方案
一、指定时间段内系统状态(锁定/睡眠/活跃)时长统计
不管机器是否连续多日未关机,只要系统事件日志未被覆盖(可在事件查看器中调整日志大小限制),都能回溯获取状态切换记录,进而计算各状态时长。
核心事件ID参考
Windows安全日志和系统日志中记录了关键状态切换事件:
- 工作站锁定:事件ID 4800(安全日志)
- 工作站解锁:事件ID 4801(安全日志)
- 系统进入睡眠:事件ID 42(系统日志)
- 系统唤醒:事件ID 1(系统日志)
用PowerShell提取并计算时长
- 提取指定时间段的状态切换事件:
# 替换为目标时间段 $startTime = Get-Date "2024-05-20 09:00:00" $endTime = Get-Date "2024-05-20 21:00:00" # 获取锁定/解锁事件 $lockEvents = Get-WinEvent -FilterHashtable @{ LogName='Security'; ID=4800,4801; StartTime=$startTime; EndTime=$endTime } | Sort-Object TimeCreated # 获取睡眠/唤醒事件 $sleepEvents = Get-WinEvent -FilterHashtable @{ LogName='System'; ID=1,42; StartTime=$startTime; EndTime=$endTime } | Sort-Object TimeCreated
- 手动或编写脚本计算各状态时长:
比如锁定时长=所有锁定到解锁的时间差之和;活跃时长=总时间段减去锁定、睡眠的总时长。
睡眠状态快速统计
用powercfg命令生成睡眠分析报告:
powercfg /sleepstudy
该命令会在系统临时目录生成HTML报告,包含详细的睡眠/唤醒时间点、时长及原因。
二、指定应用使用时长统计
方法1:通过安全日志的进程事件计算
安全日志的事件ID 4688记录进程创建,ID 4689记录进程退出,结合这两个事件可计算单进程的运行时长,累加后得到应用总使用时长。
示例:提取Chrome的进程事件
$startTime = Get-Date "2024-05-20 09:00:00" $endTime = Get-Date "2024-05-20 21:00:00" $processEvents = Get-WinEvent -FilterHashtable @{ LogName='Security'; ID=4688,4689; StartTime=$startTime; EndTime=$endTime } | Where-Object { $_.Properties[5].Value -like "*chrome.exe*" } | Sort-Object TimeCreated
之后可按进程ID(PID)关联创建和退出事件,计算每个PID的运行时长并累加。
方法2:查看当前运行应用的启动时长
如果应用仍在运行,可通过WMI快速获取启动时间:
Get-CimInstance Win32_Process | Where-Object { $_.Name -in @("chrome.exe", "Teams.exe", "devenv.exe") } | Select-Object Name, ProcessId, CreationDate, @{Name='运行时长'; Expression={(Get-Date) - $_.CreationDate}}
该命令会直接输出当前运行进程的已运行时长,但无法统计已退出的进程。
方法3:利用Windows活动历史记录
Windows 10及以上系统开启「活动历史记录」(设置-隐私和安全性-活动历史记录)后,系统会自动记录应用使用情况。可通过以下PowerShell命令提取相关日志:
Get-WinEvent -LogName "Microsoft-Windows-Shell-Core/Operational" | Where-Object { $_.Message -match "chrome.exe|Teams.exe|devenv.exe" } | Sort-Object TimeCreated
内容的提问来源于stack exchange,提问作者Aditya Ch
相关产品推荐
相关产品推荐

