using System.Diagnostics; namespace MxGateway.Server.Workers; /// /// backed by . /// public sealed class SystemRunningProcessInspector : IRunningProcessInspector { /// public IReadOnlyList GetProcessesByName(string processName) { List results = []; Process[] processes = Process.GetProcessesByName(processName); try { foreach (Process process in processes) { results.Add(new RunningProcessInfo(process.Id, TryGetExecutablePath(process))); } } finally { foreach (Process process in processes) { process.Dispose(); } } return results; } /// public void Kill(int processId) { using Process process = Process.GetProcessById(processId); process.Kill(entireProcessTree: true); } private static string? TryGetExecutablePath(Process process) { try { return process.MainModule?.FileName; } catch (Exception exception) when (exception is InvalidOperationException or System.ComponentModel.Win32Exception or NotSupportedException) { // Access to the main module can be denied (e.g. a 64-bit gateway // querying a 32-bit worker, or a process owned by another user). return null; } } }