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

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Ведет протокол имен и Process ID запускаемых и завершаемых процессов
в файлы формата Plain Text и CSV.

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

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

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

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

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

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

VB.NET:
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
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Родительский процесс отображается?
Можно добавить.
Если еще будут пожалания - пишите.

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

dzu

Активный пользователь
Сообщения
1,033
Реакции
658
Баллы
493
тоже никак найти не мог ))
 

Кирилл

Команда форума
Администратор
Сообщения
13,821
Реакции
6,166
Баллы
913
Родительский процесс отображается?

А приложения которые не удалось запустить (error) может тоже добавить?
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Какого рода ERROR?
 

Кирилл

Команда форума
Администратор
Сообщения
13,821
Реакции
6,166
Баллы
913
Когда какой либо процесс возвращает ошибку при вызове,то есть не запустился.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648

Кирилл

Команда форума
Администратор
Сообщения
13,821
Реакции
6,166
Баллы
913
Второй вариант прямо таки хорош!
Надо бы в теме обсуждения обновить тоже.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Пользователь Dragokas обновил ресурс Task Monitor - Мониторинг запуска/завершения процессов новой записью:

Обновление

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