
简介filemon V4.33 是一款经典系统文件监控工具面向系统管理员、运维人员与软件开发者用于实时跟踪进程对文件、文件夹及注册表的访问行为适用于排查软件冲突、定位异常占用与理解程序运行机制。资源为绿色免安装版本压缩包共 2 个文件ReadMe.html 提供使用说明、授权与更新信息FILEMONV4.33.ZIP 解压后即可运行主程序整包大小仅 77KB小巧便携。功能上支持实时监控、操作类型打开、读取、写入、删除等、进程名与路径明细、过滤搜索及完整日志记录非侵入式设计不会改动系统状态属于安全的诊断工具。目前已有 245 人学习下载。需要留意界面字体在某些系统下显示不佳且工具较老使用前应确认与当前操作系统兼容。1. 先用 Filemon V4.33 看一次“谁动了我的文件”一个排障场景你刚跑完一个升级脚本脚本退出了但磁盘上某个 .dat 文件的大小还在变或者你收到告警说一个日志文件被别的进程占着没办法轮转。第一反应是用句柄工具查“谁占着这个文件”但句柄只能看到打开瞬间的占有方回答不了“它什么时候打开的、以什么方式打开的、操作成功了没有”。要回答这些问题需要一份按时间排列的文件 I/O 流水。Filemon V4.33 就是干这个的它是一款文件系统实时监视工具把每一个打开、读、写、删除、设置属性操作连同发起进程一起记下来。这篇笔记按我自己的排查习惯写 Filemon V4.33 的捕获原理、最小操作步骤、输出阅读方法以及几个最容易翻车的现场。2. Filemon V4.33 凭什么能记录文件操作过滤驱动模型与事件来源2.1 名字里的“V4.33”一款文件系统监控工具的历史坐标“Filemon”是 File Monitor 的缩写出自 Sysinternals 工具家族。V4.33 是这条产品线的后期稳定版本那时候 Process Monitor 还没出现。它在 Windows 2000 后期到 Windows 7 早期的排障场景里几乎是标配体积小解压即用不用安装运行时就是一个窗口在滚动事件行。值得先说清楚的是Filemon 属于“文件系统过滤驱动”这一类工具不是“文件审计”。Windows 自带的审计如果要记录文件访问需要打开对象访问审计策略、配置 SACL然后在系统安全日志里查 4663/4656 这类事件。Filemon 不依赖审计策略也不要求对目标文件做额外权限配置。它只是往文件系统驱动栈上挂了一个探针所有发往某个卷的文件 I/O 请求从它面前经过它把关键字段复制一份出来。这让它在“快速查找现场是谁在访问这个文件”的场景里特别有用。那个年代并列的还有 Regmon只盯注册表。Filemon V4.33 专注文件系统后来 Sysinternals 把 Regmon 和 Filemon 合并成了 Process Monitor。理解了这个坐标你就知道Filemon 是一个功能上已被替代、但操作模型极其简单的工具。你不会拿它做长期审计但拿它做短时间定向排查和教学演示反而比 Process Monitor 更容易说清“过滤驱动”这四个字。2.2 数据从内核到界面过滤驱动、IRP 与用户态桥接Filemon 最核心的机制是安装一个内核态的文件系统过滤驱动。驱动加载后会把自己“附加”到被监视卷的设备栈上。Windows 上文件系统请求最后都以 IRPI/O Request Packet的形式出现打开文件走 IRP_MJ_CREATE读写走 IRP_MJ_READ、IRP_MJ_WRITE修改文件信息走 IRP_MJ_SET_INFORMATION查询属性走 IRP_MJ_QUERY_INFORMATION。过滤驱动挂在文件系统驱动之上就能在请求真正落到磁盘前先看到它这也是它能看到“失败操作”的原因请求还没到磁盘就已被判定拒绝Filemon 仍会记录这一次尝试和对应的结果码。这里有个容易忽略的细节Windows 还有一条 FastIO 路径一些能在内存中直接完成的读写请求不产生传统 IRP。如果只截获 IRP 路径会漏掉相当一部分由缓存命中带来的读写。Filemon 的驱动同时处理 IRP 分发例程和 FastIO 回调所以它的输出里能看到普通 ReadFile/WriteFile 之外的信息查询、目录枚举等操作。这不是玄学而是它号称能“完整”看到文件系统活动的原因。用户态部分则是典型的“生产者-消费者”模型。驱动把采到的事件填进一块环形缓冲区GUI 进程通过设备控制请求周期性地读取这块缓冲区并刷新到窗口。因此窗口里看到的“事件时间”是驱动捕获时记下的不是界面刷新时打的点界面刷新再快也不会把时间戳看晚。这个特性让它能用于分析操作顺序但要给它做精确计时则不太行因为缺少操作持续时间列。连续读写的时间戳间隔能帮你判断“某个进程是否在频繁写同一个文件”够用了。需要注意这个环形缓冲区越大窗口丢事件的概率越低但 GUI 线程读回并渲染的开销也越大。默认容量适合短时间排障长时间挂着监控后面的日志会把前面的覆盖。第 5 章会专门讲这个现象。2.3 该选 V4.33 还是 Process Monitor轻量优先与兼容边界到现在还有人搜 filemon说明大家的需求多数落在“老系统、轻量、快速看文件操作”这三件事上。动手前先做个选型判断否则会白折腾。常见做法是如果目标机器是 Windows XP / Server 2003 / Windows 7 32 位并且只需要看文件操作Filemon V4.33 依然是首选。它的驱动极小启动后不设过滤也能在较低配置的机器上吞下大量事件。如果你的系统是 64 位 Windows 7 及以后优先选 Process Monitor因为 Filemon V4.33 的驱动在 64 位内核里没有签名信任链系统会拒载强行加载的风险不值得冒。更别说 Windows 10/11 上还涉及内存完整性隔离老驱动根本没有生存空间。我把两者的选择维度列成一张表方便你在实际环境里照着判断。判断项Filemon V4.33Process Monitor目标系统Windows XP / 2003 / Vista / Win7 32 位为主Win7 至 Win11x64/x86 均可监控范围仅文件系统文件系统、注册表、网络、进程线程活动驱动签名无现代签名x64 下基本不可用微软签名可运行于新内核启动体积轻窗口秒开事件渲染快功能全占用更高首次捕获建议调大缓冲输出格式制表符文本列简洁CSV/XML/PML支持列自定义学习成本低适合理解文件 I/O 逻辑高过滤表达式更强但需要一点学习曲线这个“先判断用哪个”的步骤很关键在新系统上硬复现 Filemon不是工具不行是系统驱动政策变了。老工具有老工具的价值但价值边界必须在动手前划定。接下来的操作步骤默认你已经在 32 位或虚拟机环境里跑通了 Filemon V4.33。3. 把 Filemon V4.33 跑起来最小监控流程与三个必须设置的参数3.1 启动与协议确认/Accepteula 参数和驱动加载Filemon V4.33 不需要安装把 filemon.exe 放到目录里就能启动。第一次运行会弹出最终用户协议点同意后它会自动把过滤驱动服务加载进系统如果界面一直停在协议确认或者驱动加载报错后面什么也抓不到。我一般会在批处理里带一个参数把协议确认和启动合并掉:: 在 Filemon 根目录下执行自动接受 EULA 并启动 filemon.exe /Accepteula这段命令里的 /Accepteula 是 Sysinternals 系列工具的通用参数作用是跳过交互式协议弹窗直接进入主界面。参数不区分大小写但必须放在 filemon.exe 之后否则会被当作未知参数忽略。命令行启动还有一个额外的好处可以放进计划任务或用批处理在无人值守时准备好环境。Sysinternals 工具都支持 /? 参数查看帮助实际不确定时可以现场确认。驱动加载成功后Filemon 窗口顶部会有一排按钮第一个是捕获开关。最容易误操作的点是默认状态下捕获是开着的你把它最小化到任务栏后它仍然在抓事件等你切回窗口一看缓冲已经滚动几千行了。所以正式排障前先点暂停把窗口里的历史清空再开始捕获。清空操作一般是一个垃圾桶图标没有图标文字只看工具提示就能认出来。提示如果弹出驱动安装失败的报错不要重复尝试先到第 5.1 节确认系统位数和驱动签名兼容性。3.2 手工制造一次文件访问用 PowerShell 生成可复现的读写样本如果你的目标是“验证 Filemon 是不是真的在工作”不要直接去复现生产问题。先做 30 秒的最小实验建一个临时目录在目录里生成文件读一遍改一下属性重命名最后删掉。下面是触发样本用的 PowerShell 脚本# 生成一个临时目录与测试文件 $dir C:\tmp_filemon_probe New-Item -ItemType Directory -Path $dir -Force | Out-Null $file Join-Path $dir sample.dat Set-Content -Path $file -Value (probe: (Get-Date).Ticks) # 制造一次读、一次属性修改、一次重命名、一次删除 Get-Content -Path $file | Out-Null Set-ItemProperty -Path $file -Name LastWriteTime -Value (Get-Date).AddMinutes(-5) Rename-Item -Path $file -NewName sample_renamed.dat Remove-Item -Path (Join-Path $dir sample_renamed.dat) -Force Remove-Item -Path $dir -Force逻辑说明这里刻意按顺序制造打开、读、改属性、重命名、删除五类请求目的是让 Filemon 输出里出现不同请求类型。如果你看到输出里只有 Open/Close 而没有 Read/Write说明脚本执行时文件内容被系统缓存直接命中走的是 FastIO 路径这本身就是一种教学体验缓存命中的读操作不一定会在文件系统驱动层留下 IRP_MJ_READ。参数说明New-Item -Force 可以在目录已存在时不报错Set-ItemProperty 修改文件时间戳对应 Filemon 里的 SetFileTime 或 SetAttribute 请求Rename-Item 对应 SetInformation/Rename 操作。这套脚本反复跑不会污染系统适合在多次调参时复测。执行脚本前确认 Filemon 已经暂停并清空然后点捕获让它跑 10 秒再点暂停。这个“捕获—动作—暂停”的节奏是排障纪律比一直开着抓再回头翻更容易定位目标。3.3 从捕获到导出四步拿到干净的 Filemon 日志事件在窗口里滚过之后真正用来分析的是导出文件。Filemon 的“另存为”会把当前缓冲区里的事件写成制表符分隔的文本列名通常在第一行。我的保存习惯分四步。第一步暂停捕获。不暂停就导出导出过程本身每秒可能新增上百个“文件保存”事件污染现场。第二步在菜单里选择另存为文件名建议用“日期现象进程名”的格式比如20250412_tempfile_lock.log。第三步导出范围选“全部可见事件”而不是“选中行”宁可多点数据避免丢。第四步导完后不要马上关窗口先核对文件尾部最后一条记录和屏幕最后一行是否一致不一致说明缓冲区丢了一段要缩小过滤条件重抓。有些新手把 Filemon 日志当成 Excel 双击打开。但制表符分隔文本在中文系统里如果路径带中文Excel 打开时可能把列拆歪。我一般先用 PowerShell 的Import-Csv -Delimiter t 或记事本确认列结构再决定要不要进 Excel。这四步做完你手里就有一份能反复回放的文件 I/O 记录后续不管是用 Excel 透视还是像第 6 章那样写个 PowerShell 统计脚本都有了可靠的数据底座。4. 看懂 Filemon 输出列字段、过滤规则与常用参数4.1 输出窗口的一行数据到底在说什么Filemon 窗口中的一行代表一个文件系统事件。从左到右依次是时间、进程名、进程 ID、请求类型、路径、结果、其他信息。比如一个进程打开配置文件你会看到类似14:32:01.150 setup.exe 2344 Open C:\App\config.ini SUCCESS Desired Access: Read Attributes的一行。这里的“结果”列不是“操作是否成功”而是系统对这次请求最终返回的状态码。SUCCESS、ACCESS DENIED、FILE NOT FOUND 都会原样出现。“其他信息”列里常见的是 Desired Access、Allocation Size、Disposition 等 NT 层参数。这些参数不是给普通排障看的是让你拿去和驱动层代码对字段用的只查“谁碰了这个文件”看前三列加结果列就够了。有一个排障里很好用的判读进程反复 Open 一个文件结果全是 ACCESS DENIED说明进程在尝试、失败、再尝试这通常不等于“文件被锁死”更像配置或权限不足反过来如果 Open 成功但随后的 Write 结果列出现 ACCESS DENIED才是写保护或文件正被独占的情况。Filemon 按请求类型分行不会像 Procmon 那样帮你把打开和写入串成因果链所以你得自己按 PID 和时间排序去看同一进程的连续操作。4.2 过滤规则的选择先收进后淘金Filemon 的过滤规则在过滤器设置窗口里支持按进程名、路径、请求类型做包含或排除也支持 * 和 ? 通配符。它的最佳实践不是“只留我要看的”而是“先把怀疑对象全部收进再把明显噪音排除”。因为 Filemon 主窗口本身就是一个可排序的表格你完全可以抓全量然后点列头按进程名排序。一个我反复使用的过滤配置是排除系统进程System、smss.exe、csrss.exe、winlogon.exe、services.exe排除目录名只保留目标盘符的前缀。例如只监视 D 盘过滤器里写D:\*同时排除D:\Windows*。这样事件量通常会降到全量的三分之一。注意 Filemon 的匹配是路径子串匹配不是严格的分区隔离写D:\*时D:\abc.txt和D:\dir\abc.txt都会进来想只看顶层路径反而要配合排除表达式。这块很容易踩坑的一点过滤规则在勾选后立即生效但已经抓进缓冲区的旧事件不会被回收。意思是说你可以随时改过滤规则改完之后旧数据还占着缓冲区新数据可能因此被挤掉。所以我建议规则想清楚了再开始抓规则调整后就顺手清一次窗口。4.3 缓冲区与性能参数抓得多不如抓得准Filemon 界面上能调的输入输出参数其实不多但背后的取舍很大默认缓冲容量适合小时级排障不适合天级监控。事件量大界面就卡界面卡人就会去动鼠标一动又引入新事件形成恶性循环。所以我在大批量抓取时会做三件事。第一自动滚屏关闭。自动滚屏开着时新事件不断把视野推到底部你看历史记录就得回拉一拉就暂停滚动断层的观感会误导判断。第二优先用“只显示匹配过滤器的事件”而不是“高亮匹配事件”。高亮模式下匹配的事件看起来“多”但缓冲里其实塞进了更多不匹配的噪音容易淹没信号。第三如果排障目标是单个进程直接在过滤器里把进程名写死其他进程全部排除。Filemon 对排除事件只是不显示不是不采集所以排除并不能大量省内存真正省内存的是缩小被监视的路径范围或者干脆换用 Process Monitor。这些参数调完Filemon 的工作方式就从“日志洪流旁观者”变成了“定向探针”。你已经能带着目的去抓数据了。5. Filemon V4.33 常见问题与避坑四个最容易翻车的现场5.1 64 位系统启动失败监控窗口一片空白现象在 Windows 7 64 位或 Windows 10 上双击 filemon.exe界面能起来但无论目录里怎么翻文件、怎么跑脚本主窗口就是不出新事件行按暂停再开始也无效。原因V4.33 的过滤驱动是为 32 位 Windows NT 内核和旧驱动签名模型编写的。64 位系统要求内核驱动带有效签名否则拒绝加载驱动没挂上Filemon 自然什么也看不到。这不是 Filemon 坏了而是它的年代适配不了新内核的驱动政策。解决换用 Process Monitor 做同样的监控或者把排障环境放到 Windows XP / Vista / 7 32 位虚拟机里再用 Filemon V4.33。不要在 64 位机器上强行加载旧驱动强制禁用驱动签名只会换来更大的稳定性风险为一次排障赔上整个系统不值当。5.2 过滤器条件太苛刻关键事件被漏掉现象设了*.xlsx过滤之后目标 Excel 文件确实出现了一些事件但数量明显比预期少尤其是找不到“是谁在读取”的线索。原因Filemon 的包含过滤器不是按扩展名智能匹配而是按完整路径做子串匹配。*.xlsx看起来是匹配后缀实际是匹配路径里任一时段出现这两个串的情况大小写、反斜杠、8.3 短路径都会让匹配结果出乎意料。例如 Windows 对长文件名会生成XXX~1.XLS这样的短路径*.xlsx就漏了。解决路径过滤尽量用目录前缀加通配如C:\Users\someone\Desktop\*进程名过滤用可执行文件名如果只是想看某个扩展名建议抓到全量后导出在 Excel 里按路径列筛选。过滤规则是加速桌面排障的手段不是数据完整性的保险。5.3 日志中断与“No more events”提示现象长时间挂机抓取回到窗口发现滚动不再继续状态栏出现类似“No more events”的提示导出的日志文件尾部时间与窗口最后一行对不上。原因内核态环形缓冲区满了驱动不能再写入新事件GUI 线程受渲染速度拖累赶不上驱动丢数据的节奏。这和网络抓包里的丢包同源都是采集端跟不上流量端。解决缩小捕获范围路径过滤、进程过滤后再继续把自动滚屏关掉减少渲染压力分批次抓取每批结束后立即导出清空。宁可中间停几秒也不能让缓冲区溢出后的“空白区”混进数据里。5.4 不同任务间没有进程树溯源要回到 PID现象看到一个脚本进程删除了文件想继续追它是被谁拉起来的Filemon 窗口里找不到父子关系只能看到进程名和 PID。原因Filemon 是文件系统监视工具不是进程行为链分析工具它没有 Process Monitor 那套进程树加线程栈能力。这个缺陷不是 bug是设计边界。解决把记录导出后用 PID 为键把所有相关操作串起来需要父子关系时配合 Process Explorer 再补一轮。我当年排查“A 进程删了我的文件”这类问题做法是两个工具一起开Filemon 定位到肇事 PIDProcess Explorer 看这个 PID 的父进程和命令行。工具分工比指望单个工具全知全能可靠得多。6. 用 PowerShell 把 Filemon 日志做成进程访问热力表一个验证与落盘技巧导出的文本日志如果每次都开 Excel 透视会留下重复劳动。我习惯抓完数据后用 PowerShell 直接做进程访问排行。假设导出的日志是制表符分隔列顺序为时间、进程名、PID、请求类型、路径、结果下面这段脚本会把每个进程产生的事件数排出来$log C:\tools\filemon\20250412_tempfile_lock.log $lines Get-Content -LiteralPath $log $table $lines | Select-Object -Skip 1 | Where-Object { $_ -notmatch ^# } $table | ForEach-Object { ($_ -split t)[1] } | Group-Object | Sort-Object Count -Descending | Select-Object -First 10 Count, Name逻辑说明第一行是列头所以用 Select-Object -Skip 1 跳过以 # 开头的行一般是导出器写入的注释或分节符。切分时用反引号 t 表示制表符这是 PowerShell 里最容易踩的坑单引号包裹的 t 不会转义必须用双引号。取 [1] 是因为我给的行顺序里第二列是进程名如果你的导出列头不同改成进程名所在列的下标即可。参数说明-LiteralPath 会避免路径里的方括号被当作通配符处理Windows 路径越怪越要加它。拿到这张表后真正要看的是计数断层。正常排障里日志服务或杀毒软件会占掉一半事件量剩余事件集中在三到五个进程里如果发现某个可疑进程排第一且它的请求类型集中在 Write 和 SetAttribute基本就能定位“谁在频繁动文件”。再用 5.4 节的办法去 Process Explorer 里查这个 PID 的父进程和启动命令行一次文件锁或写盘异常的排障就闭环了。我现在的习惯是任何一次 Filemon 排障导出的日志文件都会和当时的过滤配置截图一起归档文件名统一写“日期_现象_进程名.log”。这样三个月后有人拿同样的问题来问不用重新抓包就能还原现场。工具会过时但“把现场封存成可复现阶段性记录”这个习惯比任何新工具都耐用。希望这套思路能帮你在下次排查文件访问问题时少走一点弯路。本文还有配套的精品资源点击获取