- Сообщения
- 7,293
- Реакции
- 6,487
Ведет протокол имен и Process ID запускаемых и завершаемых процессов
в файлы формата Plain Text и CSV.
Ограничение: не засекает процессы, время жизни которых менее 1 сек.
Пользователь Dragokas разместил новый ресурс:
Мониторинг запуска/завершения процессов - Записывает в протокол имена и PID процессов, которые запускаются/завершаются
Ведет протокол имен и Process ID запускаемых и завершаемых процессов
в файлы формата Plain Text и CSV.
Ограничение: не засекает процессы, время жизни которых менее 1 сек.
Если нужно детальное отслеживание, используем SysInternals Process Monitor
и выставляем фильтры "Event Class" = "Process".
Протокол создается рядом со скриптом.
Чтобы завершить работу монитора, запустите скрипт еще раз.
в файлы формата 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
Последнее редактирование: