系统中了毒,任务管理器打不开了,想查看当前的系统任务并且杀死可疑进程怎么办?
当然可以用tasklist来查看,但是这只能看到进程的名字,怎么样看到执行的文件位置呢?
遇到这种情况,你可以试一下wmic,wmic是一个强大的命令,有上百个子命令,用好它可以使管理事半功倍,比Linux下的busybox丝毫不逊色!
先来看我们的任务,查找并杀死可疑的进程:
命令行的套路:先win+r,调出运行,然后cmd,看到黑底白字就可以进行下一步了:
输入wmic并回车,看到一个cli的提示,这是进入了它的cli模式,这个已经不是命令行本身的提示符了,所有的输入都到wmic了,想dir看一下可是不行的:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>wmic
wmic:root\cli>
简单一点,可以在这个模式下输入process,就看到当前的运行程序以及路径了,但是显示的一大堆,看起来可不容易。显示的结果中,每行一个进程,注意无论是行和列,这仅仅显示了其中非常小的一部分,完整的内容不仅会多很多行,而且共有几十列,你别忘了有水平滚动条:
C:\Documents and Settings\hx>wmic
wmic:root\cli>process
Caption CommandLine
System Idle Process
System
smss.exe \SystemRoot\System32\smss.exe
csrss.exe C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Wi
winlogon.exe winlogon.exe
services.exe C:\WINDOWS\system32\services.exe
lsass.exe C:\WINDOWS\system32\lsass.exe
VBoxService.exe system32\VBoxService.exe
logonui.exe logonui.exe /status
svchost.exe C:\WINDOWS\system32\svchost -k DcomLaunch
svchost.exe C:\WINDOWS\system32\svchost -k rpcss
svchost.exe C:\WINDOWS\system32\svchost.exe -k netsvcs
svchost.exe C:\WINDOWS\system32\svchost.exe -k NetworkService
svchost.exe C:\WINDOWS\system32\svchost.exe -k LocalService
……
既然看起来很麻烦,有没有简洁一些的方式呢,比如我们一般只需要看几列:进程名,文件路径,pid号,还有磁盘读写速率。
wmic process get Name,ProcessId,ReadTransferCount,WriteTransferCount,ExecutablePath
后面那些词,都是在process命令中显示的列名,不知道的话过去查一下就可以了,根据英文意思也比较好理解,另外注意多个参数之间是英文的逗号,中文逗号不可以,会报无效的wmi错误。
实际应用中,为了简化输出,你可以用少量的列:
wmic:root\cli>process get Name,ProcessId
Name ProcessId
System Idle Process 0
System 4
smss.exe 596
csrss.exe 644
winlogon.exe 668
services.exe 712
lsass.exe 724
VBoxService.exe 916
logonui.exe 924
svchost.exe 980
svchost.exe 1068
svchost.exe 1208
svchost.exe 1260
svchost.exe 1800
……
达到我们的目的,查找文件的路径,注意前两个没有路径,是因为它们是内核程序:
wmic:root\cli>process get Caption,ProcessId,ExecutablePath
Caption ExecutablePath ProcessId
System Idle Process 0
System 4
smss.exe C:\WINDOWS\System32\smss.exe 384
csrss.exe C:\WINDOWS\system32\csrss.exe 668
winlogon.exe C:\WINDOWS\system32\winlogon.exe 756
services.exe C:\WINDOWS\system32\services.exe 880
lsass.exe C:\WINDOWS\system32\lsass.exe 892
nvsvc32.exe C:\WINDOWS\system32\nvsvc32.exe 1088
svchost.exe C:\WINDOWS\system32\svchost.exe 1172
svchost.exe C:\WINDOWS\system32\svchost.exe 1256
svchost.exe C:\WINDOWS\system32\svchost.exe 1396
svchost.exe C:\WINDOWS\system32\svchost.exe 1476
svchost.exe C:\WINDOWS\system32\svchost.exe 1516
explorer.exe C:\WINDOWS\Explorer.EXE 1740
ctfmon.exe C:\WINDOWS\system32\ctfmon.exe 460
mstsc.exe C:\WINDOWS\system32\mstsc.exe 304
firefox.exe C:\Program Files\Mozilla Firefox\firefox.exe 1364
cmd.exe C:\WINDOWS\system32\cmd.exe 820
conime.exe C:\WINDOWS\system32\conime.exe 640
杀死进程呢?好办啊!加delete:
wmic:root\cli>process delete
删除 '\\2012-20140609RB\ROOT\CIMV2:Win32_Process.Handle="0"' 吗(Y/N/?)?
删除 '\\2012-20140609RB\ROOT\CIMV2:Win32_Process.Handle="4"' 吗(Y/N/?)? n
删除 '\\2012-20140609RB\ROOT\CIMV2:Win32_Process.Handle="384"' 吗(Y/N/?)? n
删除 '\\2012-20140609RB\ROOT\CIMV2:Win32_Process.Handle="668"' 吗(Y/N/?)? n
删除 '\\2012-20140609RB\ROOT\CIMV2:Win32_Process.Handle="756"' 吗(Y/N/?)? n
删除 '\\2012-20140609RB\ROOT\CIMV2:Win32_Process.Handle="880"' 吗(Y/N/?)? n
……
会逐个询问是不是删除,后面的数字是pid号,当然最好别乱删除了。
这样操作还是比较麻烦,如果进程多了,那要打很多n和y,能一次删除一个进程吗?那就再加个where参数吧:
wmic:root\cli>process where ProcessId="1768" delete
删除 '\\2012-20140609RB\ROOT\CIMV2:Win32_Process.Handle="1768"' 吗(Y/N/?)? y
删除范例 \\2012-20140609RB\ROOT\CIMV2:Win32_Process.Handle="1768"
范例删除成功。
wmic:root\cli>
注意:1)delete要在where之后;
2)where后的条件中,等号可以换成其他符号,比如><等;
3)等号前面必须是process list的列名,后面要用引号引起来;
4)where条件中,可以使用其他列,比如name,这样比较干脆利落。
总结:wmic是一个强大的命令,这只是它的冰山一角,但上面介绍了它的基本用法和注意事项,详细可以看微软的官方文档
https://technet.microsoft.com/zh-cn/library/cc779482%28WS.10%29.aspx
,或者使用
wmic /? 来查看详细的使用方法。