Services/EventProviders/WindowsEventProvider.cs
using System;
using System.Collections.Generic; using System.Linq; using System.Management; using System.Threading; using System.Threading.Tasks; namespace pscommander { public class WindowsEventProvider : IEventProvider { private readonly List<Task> _eventCheckTasks; private CancellationTokenSource _tokenSource; public WindowsEventProvider() { _tokenSource = new CancellationTokenSource(); _eventCheckTasks = new List<Task>(); } public event EventHandler<EventProviderEvent> OnEvent; public void SetEvents(IEnumerable<CommanderEvent> events) { _tokenSource.Cancel(); Task.WaitAll(_eventCheckTasks.ToArray()); _eventCheckTasks.Clear(); _tokenSource = new CancellationTokenSource(); foreach(var @event in events.Where(m => m.Category == "Windows")) { var eventType = @event.Properties["WmiEventType"]; var eventFilter = @event.Properties["WmiEventFilter"]; var task = Task.Run(async () => { var query = new WqlEventQuery(eventType, new TimeSpan(0,0,1), eventFilter); var watcher = new ManagementEventWatcher(); watcher.Query = query; while(!_tokenSource.Token.IsCancellationRequested) { await Task.Delay(1000); if (_tokenSource.Token.IsCancellationRequested) { break; } try { var e = watcher.WaitForNextEvent(); var targetInstance = (ManagementBaseObject)e["TargetInstance"]; OnEvent?.Invoke(this, new EventProviderEvent(@event.Id, targetInstance)); } catch {} } }, _tokenSource.Token); _eventCheckTasks.Add(task); } } } } |