using Microsoft.Extensions.Logging; using RmmAgent.Models; using System.Diagnostics; using System.Runtime.InteropServices; namespace RmmAgent.Services; #pragma warning disable CA1416 public class CommandExecutor { private readonly ILogger _logger; private readonly ScreenshotService _screenshot; private readonly InventoryCollector _inventory; private readonly ApiClient _api; public CommandExecutor( ILogger logger, ScreenshotService screenshot, InventoryCollector inventory, ApiClient api) { _logger = logger; _screenshot = screenshot; _inventory = inventory; _api = api; } public async Task ExecuteAsync(AgentCommand cmd) { _logger.LogInformation("Executing command: {Type} (id={Id})", cmd.Type, cmd.Id); string? errorMessage = null; bool success = true; try { switch (cmd.Type) { case "lock": LockWorkStation(); break; case "logoff": Process.Start(new ProcessStartInfo("shutdown", "/l") { CreateNoWindow = true, UseShellExecute = false }); break; case "reboot": Process.Start(new ProcessStartInfo("shutdown", "/r /t 30 /c \"Redémarrage demandé par l'admin RMM\"") { CreateNoWindow = true, UseShellExecute = false }); break; case "shutdown": Process.Start(new ProcessStartInfo("shutdown", "/s /t 30 /c \"Arrêt demandé par l'admin RMM\"") { CreateNoWindow = true, UseShellExecute = false }); break; case "screenshot_now": using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30))) await _screenshot.CaptureAndUploadAsync(cts.Token); break; case "inventory_now": using (var cts = new CancellationTokenSource(TimeSpan.FromMinutes(2))) { var inv = _inventory.Collect(); await _api.PushInventoryAsync(inv, cts.Token); } break; default: _logger.LogWarning("Unknown command type: {Type}", cmd.Type); success = false; errorMessage = $"Unknown command: {cmd.Type}"; break; } } catch (Exception ex) { _logger.LogError(ex, "Command execution failed: {Type}", cmd.Type); success = false; errorMessage = ex.Message; } if (!string.IsNullOrEmpty(cmd.Id)) { try { using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(15)); await _api.ReportCommandResultAsync(cmd.Id, success, errorMessage, cts.Token); } catch { } } } [DllImport("user32.dll", SetLastError = true)] private static extern bool LockWorkStation(); }