最近出现很多人反馈 WmiPrvSE.exe 进程的 CPU 利用率过高的问题,达到5%至30%,很多人一头雾水,不知从何查起,只能靠挨个停用软件来排查。本文介绍一种更加科学的方法来找出导致 WmiPrvSE.exe 进程的 CPU 利用率过高的罪魁祸首。

通常情况下,应用程序通过执行类似SQL语句的WMI语句来进行查询系统信息(ExecQuery)或注册监视事件(ExecNotificationQuery),具体的执行由 WmiPrvSE.exe 进程来完成。查询系统信息(ExecQuery)并不容易导致 WmiPrvSE.exe CPU 利用率过高,而注册监视事件(ExecNotificationQuery)就很容易导致这个问题。那么我们追踪注册监视事件(ExecNotificationQuery)即可找到导致 WmiPrvSE.exe 进程的 CPU 利用率过高的罪魁祸首。
在win10上,操作系统默认会将WMI的语句执行记录到系统日志,我们只需要在 WmiPrvSE.exe 进程的CPU利用率很高的时候,在系统日志中寻找注册监视事件(ExecNotificationQuery)即可。

win7及win7以下的系统默认不记录WMI的语句执行,需要我们手动开启日志记录。开启方法很简单,客户机在超管状态下,执行此批处理:[WIN7启用WMI活动日志记录]1 然后保存还原点。

当客户机开机,玩过一段时间后,发现 WmiPrvSE.exe 进程的 CPU 利用率过高,此时我们找到日志文件 “C:\Windows\System32\Winevt\Logs\Microsoft-Windows-WMI-ActivityTrace.evtx”,将此日志文件复制到文件夹 “C:\wmilog” (文件夹需要自己手动建立),然后使用 FullEventLogView 来查看此日志文件。
FullEventLogView下载:FullEventLogView.rar

当FullEventLogView完全显示wmi日志后,我们按下Ctrl+F,来搜索注册监视事件的关键字“ExecNotificationQuery”,下面这个日志是我在万象OL环境下找到的.

GroupOperationId = 506; OperationId = 507; Operation = Start IWbemServices::ExecNotificationQuery - SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'; ClientMachine = MSG023; User = MSG023Administrator; ClientProcessId = 6248; NamespaceName = \.ROOTCIMV2

该WMI语句用于注册一个进程创建事件监视器,当有新进程创建时,通知注册该事件的进程。我们可以看到表示进程ID的 ClientProcessId 的值为 6248,那么我们去找PID为 6248 的进程,很可能就是他导致 WmiPrvSE.exe 进程的 CPU 利用率过高,我找到的进程名称为“WxCSafe.exe”

    在后来的日志中,我又发现了网维大师环境下特有的“TenNetbarProtect.exe”也执行过“ExecNotificationQuery”。还有易乐游环境下进程“eyoorun.exe”在开机的时候往C盘随机目录写出随机名称的exe文件并执行,该随机名称的进程,也会注册监视事件(ExecNotificationQuery)。那么此时问题范围就缩到很小了,我们只需要使用维护大师的安全中心的进程拦截或文件拦截规则暂时屏蔽他们来观察问题是否解决。

规则实例(仅拿 TenNetbarProtect.exe 做参考):

FileCheckSelf(Path=".*\TenNetbarProtect.exe")[AccessMode(Create)]=Deny