Отслеживание процессов в windows. CMD скрипт

Все что связано с работой этой операционной системы

Модератор: Tim308

Ответить
Аватара пользователя

Автор темы
DesignerMix
Администратор
Администратор
Сообщения: 4492
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 172
Репутация: 551
Откуда: Белгород
Контактная информация:
Статус: Не в сети

Отслеживание процессов в windows. CMD скрипт

Сообщение DesignerMix » 29 апр 2014, 09:48




В этом видео я рассказал о cmd\bat скрипте созданном пользователем Dragokas который осуществляет мониторинг и протоколирование изменений в списке запущенных процессов.


Код: Выделить всё

@echo off
SetLocal EnableExtensions EnableDelayedExpansion
mode con cols=80 lines=60
 
::Имя файла-протокола
rem @echo off
set dd=%DATE%
set tt=%TIME%
 
SET day=%dd:~0,2%
set month=%dd:~3,2%
set year=%dd:~6,4%
 
SET hour=%tt:~0,2%
SET minute=%tt:~3,2%
SET sec=%tt:~6,2%
echo %day% %month% %year% %hour% %minute% %sec%
Set LogFile=%day%%month%%year%_%hour%%minute%%sec%.log
::Мониторить каждые N секунд
Set Delay=2
::Исключаемые из обработки процессы
Set Exclude=tasklist.exe svchost.exe avp.exe wmiprvse.exe conhost.exe cmd.exe
Set Exclude=%Exclude% dllhost.exe SearchProtocolHost.exe SearchFilterHost.exe FlashPlayerUpdateService.exe
Set Exclude=%Exclude% taskeng.exe audiodg.exe GoogleUpdate.exe find.exe wmic.exe taskhost.exe
::Количество знаков табуляции между именем процесса и его PID
Set Tabulations=3
 
 
Set /A Delay+=1
:: Создаем массив исключаемых процессов
for %%a in (%Exclude%) do set Exclude.%%a=true
echo Сбор информации о процессах. Ждите...
echo ----------------------------
call :ProcessListSave
cls
echo Мониторинг начат
echo ----------------
:begin
  ::set /p x=.<nul
  >nul ping 127.1 -n %Delay%
  call :CheckProcesses
goto :begin
 
:ProcessListSave
::Массив ProcName.PID содержит имена процессов
::Массив ProcPID.N содержит номера PID, чтобы их можно было все перечислить
::Массив PIDPosition.PID содержит индексы, под которыми записаны PID,
::  для последующего создания массивов исключающей фильтрации
::Массив ProcUser.PID содержит пользователя, от имени которого запущен процесс
::Total содержит общее кол-во процессов
  set Total=0
  for /f "skip=2 tokens=1-2 delims=," %%a in ('tasklist /NH /FO:CSV') do (
    if not defined Exclude.%%~a (
      set /a Total+=1
      set ProcName.%%~b=%%~a
      call :GetProcessUserName "%%~a" "%%~b" "ProcUser"
      set ProcUser.%%~b=!ProcUser!
      set ProcPID.!Total!=%%~b
      set PIDPosition.%%~b=!Total!
      call :GetEchoTab "%%~a" %Tabulations% "%%~b   !ProcUser!" "FormatText"
      echo !FormatText!
      rem echo %%~a     %%~b    !ProcUser!
    )
  )
exit /B
 
:CheckProcesses
  call :ClearPIDPositionFlagsArray
  for /f "skip=2 tokens=1-2 delims=," %%a in ('tasklist /NH /FO:CSV') do (
    if not defined Exclude.%%~a (
      rem если еще не было такого PID
      if not defined ProcName.%%~b (call :LogNewProcess "%%~a" "%%~b") else (
        rem если PID уже успел освободится и его место занял другой процесс (здесь была пасхалка :)
        if "!ProcName.%%~b!" neq "%%~a" call :LogNewProcess "%%~a" "%%~b"
      )
      rem Создаем массив флагов позиций текущего слепка процессов
      set PIDExist.!PIDPosition.%%~b!=true
    )
  )
  ::Проверяем, каких позиций не хватает с предыдущей записи
  for /L %%C in (1,1,%Total%) do if not defined PIDExist.%%C call :LogClosedProcess "!ProcPID.%%C!" "%%C"
exit /b
 
:LogNewProcess
:: %1 - имя процесса
:: %2 - PID процесса
  call :GetProcessUserName "%~1" "%~2" "ProcUser"
  call :GetEchoTab "+ %~1" %Tabulations% "%~2   %ProcUser%  %Time%  %Date%" "FormatText"
  echo %FormatText%
  echo %FormatText%>> "%LogFile%"
  set /a Total+=1
  set ProcName.%~2=%~1
  set ProcUser.%~2=%ProcUser%
  set ProcPID.!Total!=%~2
  set PIDPosition.%~2=!Total!
exit /B
 
:ClearPIDPositionFlagsArray
  for /L %%C in (1,1,%Total%) do set PIDExist.%%C=
exit /B
 
:LogClosedProcess
::%1 - PID процесса
::%2 - Порядковый номер исключаемого процесса в массиве
  set ProcName=!ProcName.%~1!
  set ProcUser=!ProcUser.%~1!
  call :GetEchoTab "- %ProcName%" %Tabulations% "%~1    %ProcUser%  %Time%  %Date%" "FormatText"
  echo %FormatText%
  echo %FormatText%>> "%LogFile%"
  call :RebuildArrays "%~1" "%~2"
exit /B
 
:RebuildArrays
::Удаление элемента из массивов
::%1 - PID процесса
::%2 - Порядковый номер исключаемого процесса в массиве
  set ProcName.%~1=
  set ProcUser.%~1=
  set PIDPosition.%~1=
  set /A Total-=1
  for /L %%C in (%~2,1,%Total%) do (
    set /A NextPos=%%C + 1
    call set ProcPID.%%C=%%ProcPID.!NextPos!%%
    call set PIDPosition.%%ProcPID.!NextPos!%%=%%C
  )
exit /B
 
:GetProcessUserName
:: возвращает пользователя, от чьего имени запущен процесс
:: %1 - Имя процесса
:: %2 - PID процесса
:: %3 - вых. переменная для хранения имени пользователя
  for /f "tokens=2 delims==; " %%a in ('2^>nul WMIC Process WHERE Handle^="%~2" Call GetOwner ^| find /i "User ="') do (
    set "%~3=%%~a"
  )
Exit /B
 
:GetEchoTab
:: %1 - текст до табуляции
:: %2 - максимальное кол-во знаков табуляции в конце текста
:: %3 - текст после табуляции
:: %4 - вых. - переменная, в которую записывать результат преобразований
  set "text=%~1"
  set tabs=%~2
  for /L %%C in (7,8,200) do (
    if "!text:~%%C,1!" neq "" (set /A tabs-=1) else (goto ext_EchoTab)
  )
  :ext_EchoTab
  if %tabs%==0 (set "text=%text% ") else (
    for /L %%C in (1,1,%tabs%) do set "text=!text!  ")
  set "%~4=%text%%~3"
exit /B