Task Monitor - Мониторинг запуска/завершения процессов

Task Monitor - Мониторинг запуска/завершения процессов 2.2

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,814
Реакции
6,593
Ведет протокол имен и Process ID запускаемых и завершаемых процессов
в файлы формата Plain Text и CSV.

Ограничение: не засекает процессы, время жизни которых менее 1 сек.

Пользователь Dragokas разместил новый ресурс:

Мониторинг запуска/завершения процессов - Записывает в протокол имена и PID процессов, которые запускаются/завершаются

Ведет протокол имен и Process ID запускаемых и завершаемых процессов
в файлы формата Plain Text и CSV.

Ограничение: не засекает процессы, время жизни которых менее 1 сек.
Если нужно детальное отслеживание, используем SysInternals Process Monitor
и выставляем фильтры "Event Class" = "Process".

Протокол создается рядом со скриптом.
Чтобы завершить работу монитора, запустите скрипт еще раз.

VB.NET / VBA:
sCurFolder = left(WScript.ScriptFullname, instrrev(WScript.ScriptFullname, "\"))
sLogFile1 = sCurFolder & "Processes.log"
sLogFile2 = sCurFolder & "Processes.csv"
sMarker = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%temp%") & "\Marker_Process_Watcher_Dragokas"
sComputer = "."

' Слежение за событием класса Win32_Process каждые 1 секунду
Set objWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
  ("SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")

set oFSO = CreateObject("Scripting.FileSystemObject")

' Если уже выполняется монитор, удалить маркер и завершить текущий сценарий
if CheckMarker("Exist") then CheckMarker("Delete"): WScript.Echo "Мониторинг завершен.": WScript.Quit

' Создать шапку протокола
set oTS1 = oFSO.CreateTextFile(sLogFile1, true) ' true - overwrite
set oTS2 = oFSO.CreateTextFile(sLogFile2, true) ' true - overwrite
oTS1.WriteLine "Event        Date-Time    PID    Process Name    Par.PID    Parent Proc.Name    Command Line Arguments"
oTS1.WriteLine "-----        ---------    ----------------    -------    ----------------    ----------------------"
oTS2.WriteLine "Event;Date-Time;Process ID;Process Name;Parent PID;Parent Process Name;Command Line Arguments"

sMessage = "Сейчас начнется мониторинг создания/завершения процессов." & vbLf & "Протокол дополняется в файл: " & sLogFile1 & " (.csv)" &_
  vbLf & vbLf & "Чтобы завершить мониторинг, запустите скрипт еще раз :)"

' Если скрипт сам себя не перезапускал
if WScript.Arguments.Count = 0 then
    ' Если скрипт запущен под админ. правами
    if isAdminRights() then
        WScript.Echo sMessage
    else
        if Msgbox(sMessage & vbLf & vbLF & "Запустить с правами Администратора?", vbYesNo + VbInformation, "Process Monitor by Dragokas") = vbYes then
            ' Получение прав Администратора
            Elevate()
            WScript.Quit
        end if
    end if
end if

CheckMarker("Create")

Do
    ' Ожидаем события
    Set objLatestEvent = colMonitoredEvents.NextEvent()

    set oProc = objLatestEvent.TargetInstance

    ' Проверяем вид события
    Select Case objLatestEvent.Path_.Class
      Case "__InstanceCreationEvent"
        if not CheckMarker("Exist") then Exit Do
        oTS1.WriteLine "Created" & ProcInfo(oProc, vbTab)
        oTS2.WriteLine "Created" & ProcInfo(oProc, ";")
      Case "__InstanceDeletionEvent"
        if not CheckMarker("Exist") then Exit Do
        oTS1.WriteLine "Deleted" & ProcInfo(oProc, vbTab)
        oTS2.WriteLine "Deleted" & ProcInfo(oProc, ";")
    End Select
Loop

' Закрываем файл-протокол
oTS1.Close()
oTS2.Close()

set oProc = Nothing: set objLatestEvent = Nothing: set oFSO = Nothing: set oTS = Nothing: Set colMonitoredEvents = Nothing: Set objWMIService = Nothing

Function ProcInfo(objProcess, Delim) ' Получения свойств события процесса, определение родительского процесса
  with objProcess
    ParentPID = .ParentProcessId
    if ParentPID <> 0 then
        set oParentProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = '" & ParentPID & "'")
        if not oParentProcesses is Nothing then
            For each oParentProc in oParentProcesses
                ParentName = oParentProc.Name
            next
            set oParentProcesses = Nothing: set oParentProc = Nothing
        end if
        set oParentProc = Nothing
    end if
    ProcInfo = Delim & Now & Delim & .ProcessId & Delim & .Name & Delim & .ParentProcessId & Delim & ParentName & Delim & .CommandLine
  end with
End function

Function CheckMarker(Action) ' Слежение за маркером запуска/завершения монитора
  Select case Action
    Case "Create"
      set oMarker = oFSO.CreateTextFile(sMarker, true)
      oMarker.Close()
      set oMarker = Nothing
    Case "Delete"
      On error resume next
      For N = 1 to 10
        oFSO.DeleteFile sMarker, true 'true - Read Only Force
        if Err = 0 then Exit For
        Err.Clear
        WScript.Sleep(100) 'Если возник конфликт общего доступа, ждем 100 мс. и повторим
      next
      On error Goto 0
    Case "Exist"
      CheckMarker = oFSO.FileExists(sMarker)
  End Select
End Function

Sub Elevate()
  Const DQ = """"
  Set colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")
  For Each oOS In colOS
    strOSLong = oOS.Version
  Next
  If Left(strOSLong, 1) = "6" Then
    If Not isAdminRights Then
        Set oShellApp = CreateObject("Shell.Application")
        oShellApp.ShellExecute WScript.FullName, DQ & WScript.ScriptFullName & DQ & " " & DQ & "Twice" & DQ, "", "runas", 1
        WScript.Quit
    End If
  End If
  set oOS = Nothing: set colOS = Nothing: set oShellApp = Nothing
End Sub

Function isAdminRights()
    Const KQV = &H1, KSV = &H2, HKCU = &H80000001, HKLM = &H80000002
    Set oReg = GetObject("winmgmts:root\default:StdRegProv")
    strKey = "System\CurrentControlSet\Control\Session Manager"
    intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
    isAdminRights = flagAccess
    Set oReg = Nothing
End Function
 
Последнее редактирование:
Родительский процесс отображается?
Можно добавить.
Если еще будут пожалания - пишите.

Обращу внимание на специфику: инструмент предназначен больше для длительного отслеживания с минимальным выводом,
чем на точечный мониторинг. Для этого есть утилиты Руссиновича, ... Process Hacker еще как вариант.
протокол где сохраняется?
Рядом со скриптом.
 
Последнее редактирование:
Родительский процесс отображается?

А приложения которые не удалось запустить (error) может тоже добавить?
 
Последнее редактирование:
Пользователь Dragokas обновил ресурс Task Monitor - Мониторинг запуска/завершения процессов новой записью:

Обновление

2.2.
Добавлена совместимость с Windows 2000 и Windows 10.
Примечание: в windows 2000 вывод аргументов запуска процесса будет недоступен.
Добавлен вывод имени пользователя / домен, запустившего процесс.
Улучшено форматирование TXT формата лога.
Отчёт создаётся с датой / временем в имени файла (можно отключить константой в шапке скрипта).

Узнать больше об этом обновлении...
 
Назад
Сверху Снизу