#c_sharp #net #процесс
Можно ли как-то отследить запуск другого процесса(cmd.exe) средствами C#? Может быть
есть какие-то библиотеки для работы с системными событиями?
Ответы
Ответ 1
Так как вопрос для которого я написал данный ответ оказался "дубликатом", выкладываю решение здесь, тем более просили решение на C#, а принятый ответ на VB. using System; using System.Management; // =>Project => Add Reference => System.Managemen namespace ProcessMonitor { class Program { static void Main(string[] args) { ManagementEventWatcher startWatch = new ManagementEventWatcher( new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace")); startWatch.EventArrived += startWatch_EventArrived; startWatch.Start(); ManagementEventWatcher stopWatch = new ManagementEventWatcher( new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace")); stopWatch.EventArrived += stopWatch_EventArrived; stopWatch.Start(); Console.WriteLine("Press ENTER to exit"); Console.ReadLine(); startWatch.Stop(); stopWatch.Stop(); } static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) { Console.WriteLine("Process stopped: {0}", e.NewEvent.Properties["ProcessName"].Value); } static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) { Console.WriteLine("Process started: {0}", e.NewEvent.Properties["ProcessName"].Value); } } } Для отслеживания конкретного процесса можно записать так: ManagementEventWatcher startWatch = new ManagementEventWatcher( new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName = \"notepad.exe\"")); Важно! Использование ManagementEventWatcher требует привилегий администратора. Возможные параметры которые можно использовать в представленном WQL запросе можно посмотреть тут.Ответ 2
Можно при помощи WMI. Но именно отследить, что он произошёл, а не вмешаться перед запуском, выполнив какие-то действия, и не отменить его. Вот код на VB.NET (писал давно): Imports System.Management Module All WithEvents Watcher As New ManagementEventWatcher("SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA ""Win32_Process""") Public Sub Main() Watcher.Start() Console.ReadKey() Watcher.Stop() End Sub Private Sub Watcher_EventArrived(ByVal Sender As Object, ByVal E As EventArrivedEventArgs) Handles Watcher.EventArrived Dim EventType As String = E.NewEvent.ClassPath.ClassName 'Dim Prc As New Win32_Process(TryCast(E.NewEvent("TargetInstance"), ManagementBaseObject)) Dim Cmd As String = TryCast(E.NewEvent("TargetInstance"), ManagementBaseObject)("CommandLine") Select Case EventType Case "__InstanceCreationEvent" Console.WriteLine("{0:-16} {1}", EventType, Cmd) Case "__InstanceDeletionEvent" Console.WriteLine("{0:-16} {1}", EventType, Cmd) Case "__InstanceModificationEvent" 'Console.WriteLine(EventType) End Select End Sub End Module
Комментариев нет:
Отправить комментарий