简介:这份doc文档面向需要了解电脑使用痕迹的普通用户与办公人员,系统梳理了查看电脑使用记录的常见途径,涵盖开机记录、文档操作记录与上网记录三大方向,适合希望掌握基础排查方法、了解系统日志与历史记录存放位置的读者。资源包内含1个doc文件,约30KB,以图文步骤说明为主,轻量易读,无需额外工具即可对照操作。目前已有6304人学习下载,说明该主题在日常电脑管理与维护中需求较高。文档具体展开的内容包括:通过计划任务日志与事件查看器定位开关机时间,借助Prefetch目录、Recent文件夹及History记录还原程序运行与文件打开历史,以及利用Temporary Internet Files与IE历史记录查看上网痕迹,并附有cmd下systeminfo等快捷查询方式。读者可据此快速建立一套查看电脑使用记录的完整思路,用于个人设备自查、家庭电脑管理或基础运维场景。
1. 如何查看电脑使用记录:从开机到关机,一台机器到底留下了多少痕迹
很多人第一次认真想“如何查看电脑使用记录”,都不是为了查别人,而是自己踩了坑。比如笔记本借给同事用了半天,回来发现浏览器里多了一堆陌生站点、某个软件被装到了 D 盘、系统设置被改得面目全非;又或者家里孩子趁你不在,用你的账号登录了游戏平台,充值记录藏在某个你根本想不到的角落。这时候你才意识到,Windows 和 macOS 其实一直在默默记账,只是账本分散在事件日志、注册表、浏览器数据库、文件系统时间戳这些地方,没有一个“一键查看全部”的按钮。
这篇文章面向的是需要做本机使用痕迹排查的普通用户和一线运维:你可能要确认一台公用电脑最近被谁动过,也可能只是想知道自己昨天到底把文件存哪了。我会按“系统级日志 → 应用级痕迹 → 文件级证据”的顺序,把 Windows 和 macOS 两条线都讲清楚,每一步都给可复制的命令或路径,并告诉你哪些记录默认关闭、哪些会被自动清理、哪些参数改了会翻车。看完你至少能独立完成一次完整的本机使用记录梳理,而不是对着“事件查看器”里几万条日志发呆。
2. Windows 系统级记录:事件日志、开关机与登录审计怎么查
Windows 的使用记录最权威的来源是事件查看器,但它默认只保留有限类别,很多关键审计项需要提前开启。这一章先把系统层面的记录讲透,包括开关机时间、登录类型、程序执行痕迹,以及怎么用命令行快速导出而不是在 GUI 里一页页翻。
2.1 用 wevtutil 和 PowerShell 导出开关机与登录记录
图形界面的事件查看器适合浏览,但要做时间线梳理,命令行效率高得多。下面这条 PowerShell 命令把系统日志里最近 7 天的开关机事件导成 CSV,方便你用 Excel 排序:
# 导出最近7天的系统启动/关闭事件(ID 6005 启动, 6006 关闭, 6008 异常关机) $start = (Get-Date).AddDays(-7) Get-WinEvent -FilterHashtable @{ LogName='System' ID=6005,6006,6008 StartTime=$start } | Select-Object TimeCreated, Id, Message | Export-Csv -Path "$env:USERPROFILE\Desktop\boot_shutdown.csv" -NoTypeInformation -Encoding UTF8逻辑说明:Get-WinEvent的FilterHashtable比Where-Object过滤快一个数量级,尤其在日志几十万条时差别明显。ID=6005表示事件日志服务启动(即开机),6006表示正常关机,6008表示上次关机异常。参数上StartTime建议不要超过 30 天,否则单次查询可能卡住十几秒;如果机器日志被循环覆盖过,更早的记录根本不存在,查了也是空。
登录记录在安全日志里,默认只有登录失败(4625)和部分成功登录(4624)会被记录,且需要本地安全策略开启“审核登录事件”。查最近登录:
# 查询安全日志中的登录事件,需要管理员权限运行 Get-WinEvent -FilterHashtable @{ LogName='Security' ID=4624,4625 StartTime=(Get-Date).AddDays(-3) } -MaxEvents 200 | Select-Object TimeCreated, Id, @{n='User';e={$_.Properties[5].Value}}, @{n='LogonType';e={$_.Properties[8].Value}} | Format-Table -AutoSizeLogonType是关键参数:2 表示本地交互登录,3 表示网络登录,10 表示远程桌面。如果你只关心“有没有人坐在这台机器前用过”,过滤LogonType=2即可;10则说明有人从别处连过来,这个区别在排查时经常被忽略。
2.2 程序执行痕迹:Prefetch、UserAssist 与最近打开的文件
事件日志不一定记录每个程序的启动,但 Windows 为了加速启动,会在C:\Windows\Prefetch下留下.pf文件,文件名就是可执行程序名,修改时间接近最后一次运行时间。直接看目录:
# 列出 Prefetch 目录中最近修改的 20 个执行痕迹 Get-ChildItem "C:\Windows\Prefetch\*.pf" | Sort-Object LastWriteTime -Descending | Select-Object -First 20 Name, LastWriteTime, Length注意:Prefetch 默认开启,但 SSD 上部分系统会关闭它以延长寿命;如果目录为空,不代表没人运行过程序,只代表这项记录没开。另一个来源是注册表里的 UserAssist,它记录通过资源管理器启动过的程序及运行次数,路径在HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist,键名是 ROT13 编码的,需要解码才能读。常见做法是用 PowerShell 解码:
# 读取 UserAssist 并解码 ROT13 键名 $base = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist' Get-ChildItem $base | ForEach-Object { $guid = $_.PSChildName Get-ItemProperty "$base\$guid\Count" -ErrorAction SilentlyContinue | Get-Member -MemberType NoteProperty | Where-Object { $_.Name -notmatch '^PS' } | ForEach-Object { $decoded = -join ($_.Name.ToCharArray() | ForEach-Object { if ($_ -match '[A-Za-z]') { [char](([int][char]$_ - 13)) } else { $_ } }) [PSCustomObject]@{ Program = $decoded } } } | Select-Object -First 30这段代码的坑在于 ROT13 只对字母生效,路径里的数字和反斜杠要原样保留,否则解码出来是乱码。UserAssist 只记录通过 Explorer 启动的程序,命令行直接跑cmd再执行 exe 不会进这个列表,所以它只能作为辅助证据,不能当唯一依据。
2.3 最近访问文件与跳转列表的读取边界
Windows 的“最近使用的文件”存在%APPDATA%\Microsoft\Windows\Recent,快捷方式文件名就是原文件名,但指向路径需要解析.lnk。用 PowerShell 调 WScript.Shell 可以批量解析:
# 解析 Recent 目录下所有快捷方式的目标路径 $shell = New-Object -ComObject WScript.Shell Get-ChildItem "$env:APPDATA\Microsoft\Windows\Recent\*.lnk" | ForEach-Object { $target = $shell.CreateShortcut($_.FullName).TargetPath [PSCustomObject]@{ Shortcut = $_.Name; Target = $target; LastWrite = $_.LastWriteTime } } | Format-Table -AutoSize参数上没什么可调的,但要注意:如果用户用了清理工具或手动清空“最近使用”,这个目录会空;另外 OneDrive 同步的文件可能只留一个云占位符,TargetPath会指向本地缓存路径而不是真实云端路径。跳转列表(Jump List)存在%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations,是二进制格式,普通用户不建议硬解,用工具如 JumpLister 更稳,但本文不展开第三方工具,只讲系统自带可查的部分。
3. 浏览器与应用层痕迹:历史记录、账号活动与缓存数据库
系统日志告诉你“什么时候有人用了电脑”,浏览器和应用数据才告诉你“他看了什么、登了什么”。这一章覆盖 Chrome/Edge 的 History 数据库、Windows 活动历史,以及常见办公软件的最近文档记录。
3.1 直接读 Chrome/Edge 的 History SQLite 数据库
Chrome 和 Edge 都把浏览历史存在 SQLite 文件里,路径分别是:
- Chrome:
%LOCALAPPDATA%\Google\Chrome\User Data\Default\History - Edge:
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\History
如果浏览器正在运行,文件会被锁定,直接复制会失败。常见做法是先复制到临时目录再查:
# 在 PowerShell 中复制并查询 Chrome 历史记录(需先关闭浏览器或复制副本) $src = "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\History" $tmp = "$env:TEMP\chrome_history_copy" Copy-Item $src $tmp -Force # 使用 sqlite3 查询,如果没有 sqlite3 可用 Python 的 sqlite3 模块 sqlite3 $tmp "SELECT datetime(last_visit_time/1000000-11644473600,'unixepoch','localtime') AS visit_time, title, url FROM urls ORDER BY last_visit_time DESC LIMIT 50;"这里的关键参数是 Chrome 的时间戳:它用 1601-01-01 起的微秒数,所以要除以 1000000 再减去 11644473600 秒才能转成 Unix 时间。很多人直接拿这个数字当 Unix 时间戳,结果查出来是 1600 多年,这就是翻车点。如果没有 sqlite3 命令,用 Python 三行就能替代:
import sqlite3, datetime conn = sqlite3.connect(r"C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Default\History") for row in conn.execute("SELECT last_visit_time, title, url FROM urls ORDER BY last_visit_time DESC LIMIT 20"): ts = datetime.datetime(1601,1,1) + datetime.timedelta(microseconds=row[0]) print(ts, row[1], row[2])注意:如果用户开了“无痕模式”,这些记录不会写入 History;如果用了多用户配置文件,Default只是其中一个,Profile 1、Profile 2要分别查。
3.2 Windows 活动历史与时间线:默认保留多久
Windows 10/11 的“活动历史”记录你在哪些应用里打开了哪些文件,路径在%LOCALAPPDATA%\ConnectedDevicesPlatform下的数据库,但微软从某个版本起默认只保留本机活动且不跨设备同步。查看入口是“设置 → 隐私和安全性 → 活动历史”,但更直接的是查注册表:
# 查看活动历史相关策略是否开启 Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\ActivityHistory" -ErrorAction SilentlyContinue如果这个键不存在或EnableActivityFeed为 0,说明活动历史没开,时间线里也不会显示。很多用户以为“时间线”一定在记录,其实默认可能只保留 30 天且可被清理,所以查不到不代表没发生,只代表记录被关了或过期了。
3.3 Office 最近文档与微信/QQ 文件接收记录
Office 的最近文档存在%APPDATA%\Microsoft\Windows\Recent和注册表HKCU\Software\Microsoft\Office\16.0\Word\File MRU等处,版本号 16.0 对应 Office 2016 及以上。直接读注册表:
# 读取 Word 最近文档列表 Get-ItemProperty "HKCU:\Software\Microsoft\Office\16.0\Word\File MRU" | Get-Member -MemberType NoteProperty | Where-Object { $_.Name -match '^Item' } | ForEach-Object { $_.Name + ' = ' + (Get-ItemProperty "HKCU:\Software\Microsoft\Office\16.0\Word\File MRU").($_.Name) }微信和 QQ 的接收文件默认在Documents\WeChat Files和Documents\Tencent Files下,按账号分目录,文件修改时间就是接收时间。这里没有数据库可查,只能靠文件系统时间戳,所以如果用户手动改过系统时间,时间戳就不可信——这是所有基于时间戳排查的共同边界。
4. macOS 使用记录:统一日志、知识库与终端历史
macOS 的记录方式和 Windows 差异很大,它更依赖log命令和~/Library下的知识库文件。这一章按“系统日志 → 应用痕迹 → 终端命令历史”的顺序讲,命令都可以直接在终端里跑。
4.1 用 log show 查开关机、登录与进程启动
macOS 从 10.12 起用统一日志系统,log show是主要查询工具。查最近一天的开关机事件:
# 查询最近24小时的开关机与登录相关日志 log show --last 24h --predicate 'eventMessage CONTAINS "login" OR eventMessage CONTAINS "shutdown" OR eventMessage CONTAINS "boot"' --style compact参数说明:--last 24h可以换成--start "2025-01-01 00:00:00"指定时间范围;--predicate是过滤表达式,支持AND、OR,但写得太宽会输出几万行,建议先用--style compact减少字段。注意:统一日志默认只保留几天到几周,具体取决于磁盘空间和系统版本,查太久之前的记录会提示无数据。
4.2 知识库文件:应用使用、下载与 Wi-Fi 连接记录
macOS 把很多使用痕迹存在~/Library/Application Support/Knowledge/knowledgeC.db,这是一个 SQLite 数据库,记录应用启动、文件打开等事件。查询前先复制一份避免锁库:
# 复制知识库并查询最近的应用使用记录 cp ~/Library/Application\ Support/Knowledge/knowledgeC.db /tmp/knowledgeC_copy.db sqlite3 /tmp/knowledgeC_copy.db "SELECT datetime(ZSTARTDATE+978307200,'unixepoch','localtime') AS start_time, ZVALUESTRING FROM ZOBJECT WHERE ZSTREAMNAME='/app/usage' ORDER BY ZSTARTDATE DESC LIMIT 30;"这里的时间戳转换是 macOS 知识库的经典坑:它用 2001-01-01 起的秒数,所以要加 978307200 才能转成 Unix 时间。如果不加,查出来是 2001 年附近的日期。ZSTREAMNAME还可以换成/app/activity、/display/isBacklit等,分别对应不同事件类型,但字段结构不固定,建议先.schema ZOBJECT看列名再写查询。
Wi-Fi 连接记录在/Library/Preferences/SystemConfiguration/com.apple.wifi.plist和com.apple.wifi-networks.plist里,用plutil转成可读格式:
# 查看已知 Wi-Fi 网络列表 plutil -p /Library/Preferences/SystemConfiguration/com.apple.wifi.plist | grep -A2 SSID注意:新版 macOS 对这些文件权限收紧,普通用户可能读不了,需要sudo;而且系统可能把部分记录迁移到其他地方,查不到时不要死磕这一个文件。
4.3 终端历史与 shell 记录:.zsh_history 的读取与限制
macOS 默认 shell 是 zsh,命令历史在~/.zsh_history,但默认可能只记录部分命令且带时间戳格式。直接看:
# 查看 zsh 历史,带时间戳 cat ~/.zsh_history | tail -50如果历史文件里出现: 1672531200:0;ls -la这种格式,说明开了EXTENDED_HISTORY,冒号中间的数字是 Unix 时间戳。如果没开,就只有命令没有时间。另外,如果用户在命令前加了空格且设置了HIST_IGNORE_SPACE,这条命令不会进历史;history -c也会清空当前会话记录。所以终端历史只能作为参考,不能当作完整审计。
5. 避坑与排查:查不到记录时先看这 5 个地方
这一章集中讲实际排查中最容易翻车的 5 种情况,每条按“现象 → 原因 → 解决”写,都是我在帮人看机器时反复遇到的。
现象一:事件查看器里安全日志是空的,一条登录记录都没有。原因:Windows 默认不审核登录事件,安全日志只记录系统自带的部分事件,4624/4625 需要本地安全策略开启“审核登录事件”。 解决:运行secpol.msc→ 本地策略 → 审核策略 → 审核登录事件,勾选“成功”和“失败”,然后重启或等策略生效。已经过去的时间段不会补录,只能从开启之后开始记。
现象二:Chrome 历史数据库复制出来是 0 字节或打不开。原因:浏览器正在运行,SQLite 文件被独占锁定,Copy-Item有时会复制出一个空文件而不报错。 解决:先完全退出 Chrome/Edge(检查任务管理器里有没有残留进程),或者用sqlite3的只读模式直接打开原文件:sqlite3 "file:...History?mode=ro" "SELECT ...",但只读模式在文件被锁时也可能失败,最稳的还是复制副本。
现象三:Prefetch 目录是空的,但明明有人运行过程序。原因:SSD 上部分 Windows 版本默认关闭 Prefetch,或者被优化工具清理过;另外服务器版系统默认也不开。 解决:检查注册表HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters下的EnablePrefetcher,值为 0 表示关闭。如果关了,只能靠事件日志里的程序启动记录或 UserAssist 补,但两者覆盖范围都有限。
现象四:macOS 的 log show 查不到一周前的记录。原因:统一日志有保留策略,默认按磁盘空间滚动,通常只留几天到几周,旧日志会被自动删除。 解决:如果提前知道要排查,可以调整/etc/asl.conf或使用log config修改保留策略,但已经删掉的无法恢复。日常排查建议把时间范围先设成--last 3d,查不到再往前推,不要一上来就--last 30d,那样输出量太大反而看不清。
现象五:文件时间戳和实际使用时间对不上。原因:用户手动改过系统时间、文件被复制时保留了原时间戳、或者云同步工具重写了修改时间。 解决:不要只信一个时间戳,交叉比对创建时间、修改时间、访问时间,以及事件日志里的对应时间点。如果系统时间被改过,事件日志里的时间也会跟着偏,这时候只能靠外部证据(比如网络登录记录、打印机日志)来校准。
6. 把零散记录串成时间线:一个可复用的排查习惯
查使用记录最怕的不是没数据,而是数据太多、时间对不上。我自己的习惯是先把所有来源的时间统一成一张表,按时间排序,再挑出异常点。具体做法:用 PowerShell 或 Python 把事件日志、浏览器历史、Recent 文件、Prefetch 的修改时间都导出成时间, 来源, 描述三列,合并后按时间排序。下面是一个最小示例,把 Chrome 历史和 Recent 文件合并:
import sqlite3, datetime, os, glob events = [] # Chrome 历史 conn = sqlite3.connect(r"C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Default\History") for ts, title, url in conn.execute("SELECT last_visit_time, title, url FROM urls"): t = datetime.datetime(1601,1,1) + datetime.timedelta(microseconds=ts) events.append((t, "Chrome", url)) # Recent 快捷方式 for f in glob.glob(os.path.expanduser(r"~\AppData\Roaming\Microsoft\Windows\Recent\*.lnk")): t = datetime.datetime.fromtimestamp(os.path.getmtime(f)) events.append((t, "Recent", os.path.basename(f))) # 按时间排序输出 for t, src, desc in sorted(events): print(t.strftime("%Y-%m-%d %H:%M:%S"), src, desc[:80])这段代码的价值在于把不同时间基准统一成 Python 的 datetime,避免手动换算出错。参数上唯一要改的是用户名和浏览器配置文件路径;如果 Chrome 有多个 Profile,把每个 History 都加进去。跑完你会得到一张按时间排列的列表,哪段时间密集、哪段时间空白,一眼就能看出来。
验证方法:拿一个你确定发生过的时间点(比如你记得某天下午装了个软件),看它有没有出现在合并后的时间线里。如果没出现,说明对应来源没记录或时间偏了,再单独去查那个来源。这个交叉验证习惯比任何单一工具都可靠。
最后说个我自己的教训:早期我帮人查记录,只看了浏览器历史就下结论,结果漏了系统日志里明显的远程登录记录,差点误判。从那以后我固定按“系统日志 → 应用痕迹 → 文件时间戳”三层过一遍,哪怕多花十分钟,也比返工强。希望帮到你。
本文还有配套的精品资源,点击获取