昨天写了一篇关于linux排查进程的方法,有粉丝盆友想要了解windows的,今天我们就来盘盘Process Monitor这个工具。
image-20250927201651846
Process Monitor,我们一般叫它Procmon,是微软Sysinternals套件里的一个实时监控工具。它能监控文件系统、注册表、进程和线程的活动。听起来很高大上,其实就是一个"偷窥狂",专门偷看程序在系统里都干了些什么。
这工具最牛的地方在于,它是微软官方出品的,完全免费,而且不需要安装,下载下来直接就能用。我记得第一次用的时候,看到那密密麻麻的日志刷屏,心想这玩意儿能有啥用?结果后来发现,这简直就是排查问题的利器。
下载地址:https://learn.microsoft.com/en-us/sysinternals/downloads/procmon
image-20250927193514490
去微软官网搜索Sysinternals,或者直接搜Process Monitor就能找到下载链接。下载完是个压缩包,解压后有个Procmon.exe,双击就能运行。
第一次打开会弹出一个许可协议,点同意就行。然后你会看到一个界面,上面有一堆按钮,下面是一个表格,表格里会疯狂地刷新各种信息。
刚开始看到这些信息可能会觉得眼花缭乱,别慌,这很正常。Windows系统每时每刻都有成千上万的操作在进行,文件读写、注册表访问、网络连接等等,Procmon把这些都记录下来了。
界面上方有几个重要的按钮:
image-20250927194010787
说实话,不用过滤器的话,Procmon基本没法用。信息太多了,就像在瀑布里找一滴特定的水珠一样。
点击过滤器按钮,会弹出一个对话框。这里可以设置各种过滤条件:
按进程名过滤 比如我想监控notepad.exe这个程序,就在Process Name里输入notepad.exe,选择"is",然后点Add。这样就只显示记事本相关的操作了。
image-20250927194810989
image-20250927194842777
按操作类型过滤 如果只想看文件操作,可以在Operation里选择包含"File"的操作。想看注册表操作就选择包含"Reg"的。
image-20250927194912872
按路径过滤 这个特别有用。比如我怀疑某个程序在C:\temp目录下搞鬼,就可以设置Path contains C:\temp。
image-20250927195340755
image-20250927195403414
Application Details 应用程序数据
Event Details 事件数据
Process Management 进程管理
进程树视图 在Tools菜单里有个Process Tree选项,点开后能看到所有进程的父子关系。这对于分析进程启动顺序和依赖关系特别有用。
image-20250927195104713
堆栈跟踪 双击任意一条记录,在弹出的详情窗口里有个Stack标签,显示了调用堆栈信息。虽然大部分时候我们用不到,但对于深度分析问题很有帮助。
image-20250927195136801
导出和保存 Procmon可以把监控结果保存成PML格式的文件,也可以导出为CSV格式。这样就能把数据分享给其他人,或者用Excel进一步分析。
我经常会保存一些典型问题的Procmon日志,作为以后排查类似问题的参考。
查看事件属性
双击事件任意位置 或 右键 - Properties
可以查看事件属性。
属性有 Event
(事件)、Process
(进程)、Stack
(堆栈)三个标签。
Event
标签记录:开始时间、线程、事件类型、操作类型、操作结果、操作的文件路径、耗时。
image-20250927195650037
分析NOTEPAD.EXE启动过程
点工具栏的过滤图标,打开过滤器。Reset
清空历史过滤,Apply
应用,OK
关闭窗口。
注意:每次使用前都看一眼这里的过滤规则,是否需要清空或调整。
image-20250927200314630
过滤字段选 Process Name
根据进程名过滤,过滤规则选 is
,过滤内容填notepad.exe 只看notepad.exe的进程,点Add
添加到下面的列表中,Apply
应用,OK
关闭窗口。
image-20250927200556248
image-20250927200624346
关掉记事本后,点定位框图标开启监听,点垃圾桶图标清空列表。
打开记事本再关闭,就能看到记事本从启动、运行到关闭都做了什么。
我们可以看到,刚打开时,记事本的线程开始 Start
启动、Create
创建,开始读注册表、读写文件等。
image-20250927200904904
image-20250927200959353
英文名称 | 中文名称 |
---|---|
CloseFile | 文件-关闭 |
CreateFile | 文件-创建 |
CreateMailSlot | 创建邮件位 |
CreatePipe | 创建管道 |
DeviceChange | 设备改变 |
DeviceloControl | 设备输入/输出控制 |
FileStreamInformation | 文件流信息 |
FileSystemControl | 文件系统控制 |
FlushBuffersFile | 清空缓冲文件 |
InternalDeviceloControl | 内部设备IO控制 |
LoadImage | 装载映像 |
LockFile | 文件-锁定 |
NotifyChangeDirectory | 提示改变目录 |
PlugAndPlay | 即插即用 |
Power | 电源 |
Process Create | 进程-创建 |
Process Defined | 进程-定义 |
Process Exit | 进程-关闭 |
Profiling interrupt | 配置中断 |
QueryAllInformationFile | 查询所有信息文件 |
QueryAttribbuteTagFile | 查询属性标签文件 |
QueryAttributelnformationVolume | 查询属性信息卷 |
QueryBasicInformationFile | 查询基本信息文件 |
QueryCompressionInformationFile | 查询压缩信息文件 |
QueryControllnformationVolume | 查询控制信息卷 |
QueryDevicelnformationVolume | 查询设备信息卷 |
QueryDirectory | 查询-目录 |
QueryEAFile | 查询EA文件 |
QueryEalnformationFile | 查询EA信息文件 |
QueryFilelnternallnformationFile | 查询文件内部信息文件 |
QueryFileQuota | 查询文件配额 |
QueryFullSizelnformationVolume | 查询全尺寸信息卷 |
QuerylnformationVolume | 查询信息卷 |
QueryLabellnformationVolume | 查询标签信息卷 |
QueryMinorCode | 查询副编码 |
QueryMoveClusterlnformationFile | 查询移动族信息文件 |
QueryNamelnformationFile | 查询名字信息文件 |
QueryNetworkOpenlnformationFile | 查询网络开启信息文件 |
QueryObjectldInformationVolume | 查询对象ID信息卷 |
QueryOpen | 查询-打开 |
QueryPositionInformationFile | 查询位置信息文件 |
QuerySecurityFile | 查询安全文件 |
QuerySizelnformationVolume | 查询尺寸信息卷 |
QueryStandardInformationFile | 查询标准信息文件 |
QueryStreamInformationFile | 查询流信息文件 |
ReadFile | 文件-读取 |
RegCloseKey | 注册表-关闭键 |
RegCreateKey | 注册表-创建键 |
RegDeleteKey | 注册表-删除键 |
RegDeleteValue | 注册表-删除值 |
RegEnumKey | 注册表-枚举键 |
RegEnumValue | 注册表-枚举值 |
RegFlushKey | 注册表-清空键 |
RegLoadKey | 注册表-读取键 |
RegOpenKey | 注册表-打开键 |
RegQueryKey | 注册表-查询键 |
RegQueryKeySecurity | 注册表-查询键安全性 |
RegQueryMultipleValueKey | 查询多值键 |
RegQueryValue | 注册表-查询值 |
RegRenameKey | 注册表-重命名键 |
RegSetInfoKey | 设置信息键 |
RegSetKeySecurity | 注册表-设置键安全性 |
RegSetValue | 注册表-设置值 |
RegUnloadKey | 卸载键 |
SetAllInformationFile | 设置全信息文件 |
SetBasicInformationFile | 设置基本信息文件 |
SetDispositionlnformationFile | 设置部署信息文件 |
SetEAFile | 设置EA文件 |
SetEndOfFilelnformationFile | 设置文件结尾信息文件 |
SetFileQuota | 设置文件配额 |
SetLinkInformationFile | 设置连接信息文件 |
SetPipelnformation | 设置管道信息 |
SetPositionInformationFile | 设置位置信息文件 |
SetRenamelnformationFile | 设置重命名信息文件 |
SetSecurityFile | 设置安全文件 |
SetShortNamelnformation | 设置短名称信息 |
SetValidDataLengthInformationFile | 设置合法数据长度信息文件 |
SetVolumelnformation | 设置卷信息 |
Shutdown | 关闭 |
SystemControl | 系统控制 |
Thread Create | 线程-创建 |
Thread Exit | 线程-关闭 |
Thread Profile | 线程-Profile |
UnlockFileAll | 文件解锁全部 |
WriteFile | 文件-写入 |
Procmon虽然强大,但也有一些需要注意的地方:
资源消耗 长时间运行Procmon会消耗不少系统资源,特别是内存。在生产环境使用时要注意控制监控时间和过滤条件。
日志文件大小 如果不设置过滤器,日志文件会增长得非常快。我见过几分钟就产生几GB日志的情况。
权限要求 Procmon需要管理员权限才能正常工作,这在某些受限环境下可能是个问题。
Procmon通常不是单独使用的,我喜欢把它和其他工具配合:
Process Explorer 同样是Sysinternals套件的工具,用来查看进程详细信息。Procmon负责监控行为,Process Explorer负责分析进程本身。
Performance Monitor Windows自带的性能监控工具,可以监控系统级别的性能指标。结合Procmon的详细日志,能更全面地分析问题。
Event Viewer 系统事件日志,有时候Procmon发现的问题在事件日志里也有相关记录。
经过这么多年的使用,我总结了几个常用的过滤器模板:
监控特定目录的文件操作
Path begins with C:\Program Files\YourApp\
Operation is WriteFile
查找访问被拒绝的操作
Result is ACCESS DENIED
监控注册表修改
Operation is RegSetValue
Path contains HKLM\Software\
查找网络相关操作
Operation contains TCP
Operation contains UDP
这些模板可以根据具体需求进行调整,基本能覆盖大部分常见的监控场景。
我现在排查Windows问题基本都有个固定套路:
这个流程屡试不爽,解决了我遇到的大部分疑难杂症。
当然,Procmon也不是万能的,有些问题可能需要结合其他工具和方法。但作为第一步的排查工具,它绝对是首选。
如果你想熟练掌握Procmon,我建议:
多实践 光看教程是不够的,要在实际环境中多用。可以故意制造一些问题,然后用Procmon来分析。
了解Windows内部机制 对Windows的文件系统、注册表、进程管理有基本了解,能帮助你更好地理解Procmon的输出。
学会看日志 Procmon的日志信息很丰富,要学会从中提取有用的信息,忽略无关的噪音。
建立知识库 把遇到的典型问题和解决方案记录下来,形成自己的知识库。
说实话,掌握了Procmon之后,我对Windows系统的理解深入了很多。以前遇到问题只能瞎猜,现在能够有理有据地分析。这种从"玄学"到"科学"的转变,让我在工作中更加自信。
现在每当有同事遇到奇怪的Windows问题,我都会推荐他们试试Procmon。虽然刚开始可能觉得复杂,但一旦上手,就会发现它的强大之处。
Process Monitor真的是每个Windows运维人员都应该掌握的工具。它不仅能帮你快速定位问题,还能让你对系统运行机制有更深入的理解。在这个信息爆炸的时代,拥有这样一个可靠的分析工具,就像在黑暗中有了一盏明灯。
希望这篇文章能帮到正在为Windows问题头疼的朋友们。如果你觉得有用,别忘了点赞转发,让更多人知道这个神器的存在。
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步
公众号:运维躬行录
个人博客:躬行笔记