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

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

Метки:
  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Ведет протокол имен и 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

     
    Последнее редактирование: 8 ноя 2013
    Kиpилл нравится это.
  2. shestale
    Оффлайн

    shestale Ассоциация VN/VIP Преподаватель

    Сообщения:
    8.059
    Симпатии:
    4.488
    протокол где сохраняется?
    нашел)))
     
    Последнее редактирование: 4 ноя 2013
    dzu нравится это.
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Можно добавить.
    Если еще будут пожалания - пишите.

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

    shestale Ассоциация VN/VIP Преподаватель

    Сообщения:
    8.059
    Симпатии:
    4.488
    Добавь пожалуйста.
     
  5. dzu
    Оффлайн

    dzu Активный пользователь

    Сообщения:
    957
    Симпатии:
    543
    тоже никак найти не мог ))
     
  6. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.226
    Симпатии:
    4.980
    Родительский процесс отображается?

    А приложения которые не удалось запустить (error) может тоже добавить?
     
    Последнее редактирование: 8 ноя 2013
  7. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Какого рода ERROR?
     
  8. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.226
    Симпатии:
    4.980
    Когда какой либо процесс возвращает ошибку при вызове,то есть не запустился.
     
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Kиpилл, shestale и dzu нравится это.
  10. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.226
    Симпатии:
    4.980
    Второй вариант прямо таки хорош!
    Надо бы в теме обсуждения обновить тоже.
     
  11. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Пользователь Dragokas обновил ресурс Task Monitor - Мониторинг запуска/завершения процессов новой записью:

    Обновление

    Узнать больше об этом обновлении...
     
    Kиpилл и akok нравится это.

Поделиться этой страницей