文章目录

  • 起因
  • 分析
  • 解决方法
  • 第一条解决:`2.bat`
  • 第二条解决 `3.bat`
  • 第三条解决 `4.bat`
  • 步骤4:打开cmd直接运行4.bat体验伸手党的快感吧~


起因

由于电脑总是有个程序偷偷摸摸地违规外联(虽然都失败了),在重装系统之后,仍然出现这东东,所以只能使用netstat -ano看一下进程,由于这个嗅探进程都是嗅探一下接着关掉,所以打算使用批处理长时间监控自己电脑的联网进程。

分析

我们需要做的有四件事:

  1. 开启一个bat文件,查询所有正在运行的网络连接,并将对应pid的程序地址显示出来
  2. 将显示的结果写入到用分钟表示的文件当中(每分钟新建一个log文件)
  3. 每分钟循环开启进程(这里以30秒打开一次为例,在同一分钟打开进程的话会报出错误,但不会停止)
  4. 将以上开启的所有内容集中到一个显示框当中。由于第一条内容得到的结果不是即时性的,所以要使用多线程。多线程会产生新的cmd窗口和内容,这点必须调整好。

解决方法

第一条解决:2.bat

@echo off
setlocal enabledelayedexpansion
for /f "tokens=2,4,5 delims= " %%i in ('netstat -anop tcp^|find "LIS"^|find /v "127.0.0.1"') do (
	set port=%%i
	set status=%%j
	set pid=%%k
	if  !pid! GTR 0 (
		call :fun !port! !pid! !status!
	)
)
setlocal disabledelayedexpansion
goto exit

:exit
echo end
goto eof

rem 根据pid获取进程名、命令行、PPID,父名称,父命令行的函数
:fun
setlocal enabledelayedexpansion
set port=%1
set pid=%2
set status=%3
if %pid%=="" goto eof
set name="-"
set cmdline="-"
set ppid="0"
set pname="-"
set pcmdline="-"
for /f "usebackq tokens=*" %%a in (`wmic process where processid^=!pid! get caption^,commandline^,parentprocessid /value`) do (
	set "line=%%a"
	set "line=!line:~,-1!"
	if "!line!" GTR "" (
		(echo !line!|findstr -i "Caption">nul)&&(set "name=!line:~8!")
		(echo !line!|findstr -i "CommandLine">nul)&&(set "cmdline=!line:~12!")
		(echo !line!|findstr -i "ParentProcessId">nul)&&(set "ppid=!line:~16!")
		if "!cmdline!" EQU "" (set cmdline="-")
		if !ppid! GTR 0 (
			for /f "usebackq tokens=*" %%u in (`wmic process where processid^=!ppid! get caption^,commandline /value 2^>nul`) do (
				set "line2=%%u"
				set "line2=!line2:~,-1!"
				if "!line2!" GTR "" (
					(echo !line2!|findstr -i "Caption">nul)&&(set "pname=!line2:~8!")
					(echo !line2!|findstr -i "CommandLine">nul)&&(set "pcmdline=!line2:~12!")
					if "!pcmdline!" EQU "" (set pcmdline="-")
				)
			)
		)
	)
)
echo,!port!,!status!,!pid!,!name!,!cmdline!,!ppid!,!pname!,!pcmdline!
setlocal disabledelayedexpansion

:eof

显示在最后会加一行end以此表示此文件完结,而不是意外中断

效果图:(可以看到2345流氓广告王在后台跑得很欢)

windows 后台进程监控按键 电脑进程监控_运维

第二条解决 3.bat

将2.bat当中的内容写入到以分钟数为单位的文件中

@echo off

set ThisDay=%date:~0,4%%date:~5,2%%date:~8,2%
rem 获取时间
if "%time:~0,2%" lss "10" (
set ThisTime=0%time:~1,1%%time:~3,2%
) else (
set ThisTime=%time:~0,2%%time:~3,2%
)
set Now=%ThisDay%%ThisTime%
echo "%Now%.log"
2.bat >E:\tmp\%Now%.log
echo "%Now%"

效果:

windows 后台进程监控按键 电脑进程监控_tcpip_02

第三条解决 4.bat

@echo off
:start2
start /b cmd /c "%CURRENT_DIR%3.bat"
ping 127.0.0.1 -n 30 >nul
goto start2

每30秒开启新线程并隐藏开启的cmd框,然后将3.bat每次循环的内容都显示在主框内。

对线程要求不高的可以选择每59秒或者60秒开启一次线程。

运行时候的实例:

windows 后台进程监控按键 电脑进程监控_服务器_03

步骤4:打开cmd直接运行4.bat体验伸手党的快感吧~