Windows电脑使用记录查看指南:事件日志与PowerShell取证实务
发布时间:2026/9/29 15:10:40来源:尧图网络
简介《如何查看电脑使用记录》是一份面向普通电脑用户与系统管理初学者的技巧型文档解决“电脑里到底做过什么”的查询难题覆盖开机、文档、上网三类常用记录。资源为单独1个doc文件压缩包仅30KB轻量易用目前已有6300人学习下载。文档从系统日志、命令提示符、预读取文件夹、最近访问目录等角度分别讲解查看开关机时间与系统运行时长、找出最近打开过的程序和文件以及定位临时网页和浏览历史的方法。除了常规路径还给出了事件查看器筛选、运行指令、缓存目录等具体操作思路方便读者按图索骥在日常维护或隐私排查中快速了解电脑使用痕迹。整体篇幅精简、步骤清晰适合不需要复杂工具、希望几分钟内掌握查看电脑记录技巧的入门用户也可在个人电脑管理时作为快速自查参考。1. 如何查看电脑使用记录先分清你要查的是哪一层很多人搜“如何查看电脑使用记录”第一反应是装第三方监控软件、开屏幕截图其实 Windows 自己就存着一整套账本谁在什么时候登录过、运行过哪些程序、打开过什么文件、连过哪些 Wi-Fi全都有痕迹只是散落在事件日志、注册表、Prefetch 和浏览器数据库里平时没人翻。这篇笔记按“登录时段 → 程序与文件 → 网络与应用”三层把查看方法一次讲清覆盖普通用户自查、家长还原电脑使用情况和 IT 管理员合规审计三种场景。整套方案不装收费软件全部用系统自带机制加少量脚本就能跑通适合不想把个人数据交给第三方服务的从业者。2. 从系统日志看登录与使用时段事件查看器里最值钱的三张表Windows 事件查看器里与“人用过电脑”这件事直接相关的主要是安全日志、系统日志和应用程序日志三块。安全日志负责记录登录、注销和凭据验证系统日志记录关机、休眠、意外断电应用程序日志则保留了程序崩溃、服务异常这类间接线索。很多人在这个环节就翻车打开事件查看器发现安全日志一片空白不是没记录而是“审核登录事件”策略没开系统默认根本不记。所以第一步不是查日志而是先把策略打开让系统从今天开始记账。2.1 先把“审核登录事件”打开不记录策略后面全是白看按Win R输入secpol.msc打开本地安全策略依次进入“本地策略 → 审核策略”找到“审核登录事件”勾选“成功”和“失败”。“成功”记录正常登录“失败”记录暴力破解或输错密码两个都勾上。这个操作需要管理员权限改完立即生效但只影响之后的登录行为不会把之前没记的账补回来。也可以用命令行的方式开启适合在多台电脑上批量操作。用管理员权限打开 PowerShell执行auditpol /set /subcategory:登录 /success:enable /failure:enable参数说明/subcategory:登录指登录/注销这类子类别中文系统里叫“登录”英文系统叫“Logon”/success:enable和/failure:enable分别打开成功事件和失败事件的记录。执行后可以用auditpol /get /subcategory:登录验证策略确实是“成功和失败”均已启用。提示组策略gpedit.msc里的“审核策略”也可以配置但secpol.msc对单机用户更快域环境则由域策略统一下发本机设置可能被覆盖。加入域后又想本机额外记录要在“高级审核策略配置”里单独开或者直接在域策略里加一条。2.2 看懂事件的 ID 与 Logon Type4624、4634、4647 和 2/7/10 的关系开启审核之后安全日志每天会攒下大量事件。过滤时不需要懂全部核心只认四个事件 ID事件 ID含义典型场景4624登录成功用户输对密码进入桌面、远程桌面连入4625登录失败密码错误、账户锁定、暴力破解尝试4634注销用户主动注销或关机前注销4647用户发起的注销与 4634 配合还原使用区间只看 4624 是不够的因为 Windows 会把好几种“登录”都记成 4624但性质完全不同。区分它们要看事件里的 Logon Type 字段关键值就三个2是本地键盘输入密码的交互登录7是睡眠唤醒或锁屏解锁10是远程桌面RDP登录。如果只是统计“这台电脑被人打开用过多久”要过滤掉7否则你统计出来的登录次数会虚高——每一次合上盖子和打开盖子都会多一条“登录”。2.3 用 PowerShell 把安全日志导成 CSV最小命令与参数逐行解释手动在事件查看器里点七天的事件眼睛会看瞎。把事件导出来用 Excel 或脚本分析才是正经做法。下面这段 PowerShell 读取最近七天的安全日志把时间、用户、登录类型、事件 ID 导出到 CSV$events Get-WinEvent -FilterHashtable {LogNameSecurity; Id4624,4625,4634,4647; StartTime(Get-Date).AddDays(-7)} -ErrorAction SilentlyContinue $rows foreach ($e in $events) { $xml [xml]$e.ToXml() $data $xml.Event.EventData.Data [PSCustomObject]{ Time $e.TimeCreated EventId $e.Id User ($data | Where-Object { $_.Name -eq TargetUserName }).#text LogonType ($data | Where-Object { $_.Name -eq LogonType }).#text } } $rows | Export-Csv -NoTypeInformation -Encoding UTF8 $env:PUBLIC\login-record.csv逻辑说明Get-WinEvent -FilterHashtable比-FilterXPath好写三个常用键是LogName日志名、Id事件 ID支持数组、StartTime起始时间。-ErrorAction SilentlyContinue让脚本在没有日志时不会报红中断。取值这一步是最大的坑很多教程直接写$e.Properties[4].Value但Properties按 XML 节点顺序索引不同版本系统字段顺序不完全一致我吃过一次亏。用[xml]$e.ToXml()转成 XML 再按Name取字段不依赖索引顺序换机器不会翻车。#text是 PowerShell 取 XML 节点文本内容的标准写法。导出的 CSV 用 Excel 打开按Time排序就能看到某一天几点几分有账户登录、登录类型是什么。2.4 关机与睡眠事件也记在系统日志里用 1074、42、41 补全时间线安全日志只能说明“登录了”不能说明“关机了”。要还原一段完整的使用区间还得看系统日志。1074是用户主动关机或重启含原因记录42是进入休眠41是内核事件出现它通常意味着上次是非正常断电6008是异常关机前的最后日志。组合起来看就能判断一段使用是正常结束还是直接拔电跑路。查看方法同样用 PowerShellGet-WinEvent -FilterHashtable {LogNameSystem; Id1074,42,41,6008; StartTime(Get-Date).AddDays(-7)} -ErrorAction SilentlyContinue | Select-Object TimeCreated, Id, ProviderName | Sort-Object TimeCreated参数说明这里没取消息文本因为中文系统的事件消息是中文、英文系统是英文脚本里按Id过滤最稳定。ProviderName是事件来源比如User32表示用户界面操作Microsoft-Windows-Kernel-Power表示内核电源模块。看到大量41且有6008基本能确定这台电脑被硬断电过这在二手电脑验机时是很实用的判断依据。3. 程序与文件维度把“用过什么、打开过什么”翻出来登录日志能还原时间线却还原不了内容。想知道某天晚上这台电脑是打开 Office 写文档到凌晨还是把游戏挂在后台需要另查三层痕迹注册表里的 UserAssist、系统盘的 Prefetch 和用户目录下的 Recent 快捷方式。这三层分别对应“启动过的 GUI 程序”“程序加载痕迹”和“最近打开的文件”。常见做法是把三层交叉验证单看一层很容易被清理工具误导——比如 CCleaner 清掉 Prefetch但 UserAssist 还在。3.1 UserAssist注册表里记着 GUI 程序的启动次数和最后运行时间UserAssist 是 Windows 隐藏的“程序使用账本”位于注册表当前用户下记录资源管理器里启动过的 GUI 程序带窗口的程序不覆盖纯命令行的启动次数和最后运行时间。位置是HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count。里面的键名不是明文路径而是 ROT13 编码过需要解码。用 PowerShell 读出并解码$path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\*\Count Get-ChildItem $path | ForEach-Object { $props Get-ItemProperty $_.PSPath $props.PSObject.Properties | Where-Object { $_.Name -like *:\* } | ForEach-Object { $name $_.Name $decoded -join ($name.ToCharArray() | ForEach-Object { if ($_ -ge a -and $_ -le z) { [char](([int][char]$_ - 97 13) % 26 97) } elseif ($_ -ge A -and $_ -le Z) { [char](([int][char]$_ - 65 13) % 26 65) } else { $_ } }) $raw $props.$name [PSCustomObject]{ Program $decoded RunCount $raw[0] LastRun [datetime]::FromFileTime($raw[1]) } } } | Sort-Object LastRun -Descending | Select-Object -First 30逻辑说明先遍历所有UserAssist子键拿到每个键下的属性集合Where-Object { $_.Name -like *:\* }过滤出带盘符路径的程序键把实际文件路径过滤出来。ROT13 的规则是字母偏移 13 位解密就是再偏移 13 位。数据的两个关键字段$raw[0]是运行次数计数的低位$raw[1]是FILETIME类型用[datetime]::FromFileTime()可以转成可读时间。需要留意的是不同 Windows 版本的数据结构略有差异脚本跑出来后先用一两个已知程序核对再用于判断。3.2 Prefetch 与 Recent用 .pf 文件和 .lnk 快捷方式找回打开记录Prefetch 目录C:\Windows\Prefetch里存着系统为加快启动而生成的.pf文件文件名格式是“程序名-哈希.pf”文件的最后修改时间近似等于最后一次运行时间。优点是能覆盖很多后台服务和安装程序缺点是文件只保留最近一段时间且系统盘清理工具默认会清理它。Get-ChildItem C:\Windows\Prefetch\*.pf | Sort-Object LastWriteTime -Descending | Select-Object -First 20 Name, LastWriteTimeRecent 文件夹则位于%APPDATA%\Microsoft\Windows\Recent里面是你打开过的 Office 文档、图片、压缩包生成的快捷方式。逐个解析.lnk的目标路径能精确到“打开过哪个文件、最后打开时间是什么时候”。解析快捷方式要借助 COM 对象$shell New-Object -ComObject WScript.Shell Get-ChildItem $env:APPDATA\Microsoft\Windows\Recent\*.lnk | ForEach-Object { $link $shell.CreateShortcut($_.FullName) [PSCustomObject]{ File $link.TargetPath Opened $_.LastWriteTime } } | Sort-Object Opened -Descending | Select-Object -First 20说明WScript.Shell 的CreateShortcut不是用来“创建”而是用来读取快捷方式属性$link.TargetPath才是真实文件位置。Recent 文件夹里快捷方式名称可能被系统截断成“xxx - 快捷方式”不影响判断关键是打开时间与目标路径。注意这部分很依赖用户的系统盘和用户目录是否清理过作为辅助证据可以别当唯一证据用。3.3 开启 NTFS“最后访问时间”文件访问痕迹不再失真Windows Vista 之后NTFS 默认关闭了“最后访问时间”更新目的是减少磁盘写操作。带来的直接恶果是查文件的“访问时间”属性时看到的值和创建时间几乎一致根本看不出文件被读过多少次。要恢复这个能力先查当前状态再关闭限制fsutil behavior query disablelastaccess返回值1表示已禁用默认状态2表示仅禁用对目录的更新但仍更新文件访问时间0表示完整记录。建议设成0fsutil behavior set disablelastaccess 0参数说明0会让 NTFS 记录所有文件访问时间代价是频繁读写文件的盘会有少量性能开销普通机械硬盘尤其明显SSD 无所谓。这个设置需要管理员权限且对后续访问生效过去的文件如果没有记录补不出来。对于要长期审计文件操作的人来说这个是必选项否则文件时间戳会让所有分析结论失真。4. 网络与浏览器取证查 Wi-Fi 连接历史和 Chrome 访问记录程序与文件维度回答“这台电脑被用来干什么”网络维度则能补充“这台电脑当时在什么环境里”。Windows 自带一条冷门命令能一次导出所有人连接过的 Wi-Fi 热点的详细时间轴Chrome 系列浏览器则把访问历史写进本机 SQLite 数据库。这两块数据都是只读的不需要任何第三方软件。4.1 netsh wlan show wlanreport一键导出 Wi-Fi 连接时间轴的隐藏命令netsh wlan show wlanreport是 Windows 8 以后自带的无线报告生成器运行时要求管理员权限。它会收集最近 30 天左右的无线连接记录、信号质量、断连原因生成一份 HTML 报告默认保存在C:\ProgramData\Microsoft\Windows\WlanReport\wlan-report-latest.html。用浏览器打开能看到每天连接了哪个 SSID、连接持续时间、何时断开的可视化时间轴。netsh wlan show wlanreport参数说明没有额外参数执行后直接去看 HTML 文件。这个命令的价值在于它连“连接持续了多久”都有记录能回答“凌晨两点到三点这台电脑是不是一直连着网络”。但要注意报告只统计无线网卡有信号的时段如果网卡被禁用或机器没插网线这段时间会缺失不代表使用者没开电脑。有线网络的连接历史不在此列需要走 DHCP 日志或路由器查询。4.2 从 Chrome History 这个 SQLite 库里读出网页访问记录Chrome、Edge 的浏览历史存在同一个结构的 SQLite 数据库里路径是%LOCALAPPDATA%\Google\Chrome\User Data\Default\History。查询前要先复制出来再读因为数据库文件被浏览器占用直接连接大概率报“database is locked”。用 Python 的方式最省事import os import shutil import sqlite3 from datetime import datetime, timedelta src os.path.expandvars(r%LOCALAPPDATA%\Google\Chrome\User Data\Default\History) dst os.path.expandvars(r%TEMP%\history_copy.db) shutil.copy2(src, dst) conn sqlite3.connect(dst) cur conn.cursor() cur.execute(SELECT url, title, last_visit_time FROM urls ORDER BY last_visit_time DESC LIMIT 20) for url, title, visit_time in cur.fetchall(): dt datetime(1601, 1, 1) timedelta(microsecondsvisit_time) print(dt, title or url, url) conn.close()逻辑说明Chrome 的last_visit_time不是 Unix 时间戳而是从 1601 年 1 月 1 日Windows FILETIME 基准开始的微秒数转换公式就是datetime(1601,1,1) timedelta(microsecondsvisit_time)。把数据复制到%TEMP%再读不会干扰正在运行的浏览器也不容易触发数据库锁。这条命令还有一个附加用途如果 History 文件体积异常大通常说明这台电脑长期重度上网侧面辅助判断使用强度。注意读取浏览器历史只适用于自己的电脑或公司合规审计场景。拿到别人电脑上偷查隐私是越界行为技术在边界里用才有价值。这篇笔记只讨论合法场景下的自查与审计。4.3 域环境里的合规审计用事件转发把多台电脑日志归集到一处如果是公司场景十几台电脑逐台去查就太低效了。常见做法是在域控上开启“计算机配置 → Windows 设置 → 安全设置 → 高级审核策略 → 登录/注销 → 审核登录”节点下的子策略再配置 Windows 事件转发Windows Event Forwarding让客户端把安全日志实时推送到收集服务器。收集端通过wecutil qc启用收集器然后配置订阅。这样所有电脑的 4624/4625 登录事件会集中在一个服务器上查询时按时间排序即可全局还原“谁在哪台机器上什么时候登录过”。这块配置偏运维向但原理和单机查看完全一致区别只是数据不落在本机事件日志里而是落在订阅服务器的 Forwarded Events 日志里。域策略覆盖后客户端本地再改审核策略也不会生效这一点容易被忽略。5. 电脑使用记录避坑指南5 个常见误判与排查办法使用记录类查询的翻车率不低但几乎都集中在几个固定环节。下面按“现象 → 原因 → 解决”的套路记五笔账都是我实际踩过或帮人排查过的坑。5.1 安全日志被清空只能看到最近一两条记录现象按 2.3 的脚本导出 CSV发现数据只有几十条或者 7 天前的记录全部消失。原因安全日志默认最大大小很小多数系统约 20MB事件多的时候会被自动覆盖也可能被清理工具手动清除。解决在事件查看器里右键“安全”日志 → 属性 → 把“最大日志大小”改为 1024000KB1GB并选择“存档日志但不覆盖事件”。同时用组策略里的“事件日志服务 → 安全 → 配置日志自动备份”做归档。这属于一次性配置配完以后历史数据才可查。5.2 统计登录次数虚高睡眠唤醒也算一次登录现象某台电脑明明只开机一次统计 4624 却有十几条。原因LogonType 7的事件也会写入安全日志。睡眠唤醒、锁屏解锁都会记录为登录成功。解决在 2.3 的脚本里加一行过滤$_.LogonType -ne 7只保留2本地交互和10远程桌面。判断“有人真正坐在电脑前用”时也优先看这两个类型的分布。5.3 文件的访问时间全部等于创建时间现象查看某个重要文档的“访问时间”发现和“创建时间”“修改时间”相同完全不像被翻阅过的样子。原因NTFS 默认关闭最后访问时间更新。解决按 3.3 的fsutil behavior set disablelastaccess 0开启完成后重启系统。注意只对开启后的访问行为生效旧文件过去是否被访问过翻不回来。5.4 WLAN 报告的时间和本机时间对不上现象Wi-Fi 报告里显示的连接开始时间是上午 10 点而系统事件日志显示当时用户已经登录中间差了几小时。原因netsh wlan show wlanreport生成的报告同时混用了 UTC 和本地时间部分图表用 UTC 呈现。解决看到报告里的时间先确认是否差 8 小时如果差 8 小时就是 UTC 未转换。用事件日志时间作为基准WLAN 报告只参考连接持续时长和断连原因。5.5 计划任务脚本在注销时没有执行现象自建的使用记录脚本在登录时正常写文件注销时却什么都不记。原因注销触发器的计划任务默认在用户会话收尾阶段执行如果用户选择“关机”而非“注销”系统留给任务的时间极短脚本还没跑完进程就被结束。解决在任务计划程序里设置“如果任务运行时间超过 3 天则停止”取消勾选并且把任务设置为“不管用户是否登录都要运行”脚本执行时用$env:USERNAME主动获取当前用户名不依赖计划任务的“运行用户”字段。6. 自己搭一个“每日使用报告”自动记录登录注销并汇总与其每次手查日志不如让电脑每天自己记账。这个方案不依赖任何第三方软件用任务计划程序加一个 PowerShell 脚本把每次登录、注销的时间追加到 CSV 文件。之后想复盘某天“用了几次、每次多久”一行命令就能统计出来。6.1 一个脚本同时伺候登录和注销两个触发器把下面脚本保存为C:\Scripts\usage-recorder.ps1param([string]$Action) $dir Join-Path $env:USERPROFILE Documents\UsageRecords New-Item -ItemType Directory -Force -Path $dir | Out-Null $csv Join-Path $dir usage.csv if (-not (Test-Path $csv)) { Time,User,Action | Set-Content -Encoding UTF8 $csv } $time Get-Date -Format yyyy-MM-dd HH:mm:ss $time,$env:USERNAME,$Action | Add-Content -Encoding UTF8 $csv逻辑说明param([string]$Action)让同一个脚本通过参数区分登录还是注销。New-Item -Force确保目录存在。首次运行时创建 CSV 并写入表头之后每次都追加一行记录不覆盖旧数据。$env:USERNAME直接取当前登录用户比计划任务的“运行用户”配置更可靠。中文系统下-Encoding UTF8防止 CSV 被 Excel 打开时乱码。6.2 注册任务计划用 schtasks 还是用任务计划程序界面两条schtasks命令分别注册登录触发和注销触发schtasks /create /tn Usage-Logon /tr powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File C:\Scripts\usage-recorder.ps1 -Action logon /sc onlogon /f schtasks /create /tn Usage-Logoff /tr powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File C:\Scripts\usage-recorder.ps1 -Action logoff /sc onlogoff /f参数说明/sc onlogon和/sc onlogoff是任务计划程序原生的登录/注销触发器不需要额外写时间条件。-WindowStyle Hidden让 PowerShell 窗口不闪现避免每次开机跳黑框。/f表示任务已存在时强制覆盖。不习惯命令行的可以用任务计划程序界面触发器选“登录时”和“注销时”操作里程序填powershell.exe参数填-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File C:\Scripts\usage-recorder.ps1 -Action logon。6.3 用 CSV 把“每天用了几次、用了多久”算出来记录攒到几天后汇总命令非常简单$rows Import-Csv (Join-Path $env:USERPROFILE Documents\UsageRecords\usage.csv) $rows | Where-Object { $_.Time -like 2025-* } | Format-Table Time, User, Action更实用的做法是计算每次登录到下次注销的时间差给 CSV 按时间排序遇到logon记下开始时间遇到logoff记下结束时间两条时间一减就是单次使用时长。参数不再赘述这个计算逻辑用 Excel 的透视表也能完成。我现在做二手电脑验机时会先跑这个脚本连续记录一周再看 CSV 里的登录密度和时长分布比凭直觉判断“这台机器天天在用还是吃灰”靠谱得多。自己电脑上如果怀疑深夜被人用过也可以直接翻同一份 CSV不必再进事件查看器一层层找。有一点切身经验供参考脚本第一次上线时把它单独放一个目录开机后两天内别急着分析先确认usage.csv里登录、注销两条记录都正常落盘再回去调整汇总逻辑。日志类工具最怕的不是不准而是默默不工作——第二周才发现脚本没触发那时候连补记的机会都没了。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网