using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
namespace PCMonitor {
///
/// Executor untuk Perintah Remote dari Server
///
public class CommandExecutor : IDisposable {
private readonly ApiClient apiClient;
private readonly ILog logger = new FileLogger();
public CommandExecutor(ApiClient client) {
apiClient = client;
}
public async Task ExecutePendingCommandsAsync() {
try {
// Get pending commands from server
var result = await apiClient.GetAsync("command/pending");
var commands = result as Newtonsoft.Json.Linq.JArray;
if (commands != null) {
foreach (var cmd in commands) {
await ExecuteCommandAsync(cmd.ToObject());
}
}
} catch (Exception ex) {
logger.Error($"Error executing pending commands: {ex.Message}");
}
}
private async Task ExecuteCommandAsync(dynamic command) {
try {
string commandType = command["command_type"];
string commandId = command["id"];
logger.Info($"Executing command: {commandType} (ID: {commandId})");
bool success = false;
string response = "";
switch (commandType.ToLower()) {
case "shutdown":
success = ExecuteShutdown();
response = "System shutdown command executed";
break;
case "restart":
success = ExecuteRestart();
response = "System restart command executed";
break;
case "lock":
success = ExecuteLockWorkstation();
response = "Workstation locked";
break;
case "disconnect_internet":
var bwController = new BandwidthController(apiClient);
success = await bwController.DisconnectInternetAsync();
response = "Internet disconnected";
bwController.Dispose();
break;
case "connect_internet":
var bwController2 = new BandwidthController(apiClient);
success = await bwController2.ConnectInternetAsync();
response = "Internet connected";
bwController2.Dispose();
break;
case "screen_mirror":
success = await CaptureScreenAsync();
response = "Screenshot captured";
break;
case "take_screenshot":
success = await CaptureScreenAsync();
response = "Screenshot taken";
break;
case "refresh_data":
success = true;
response = "Data refresh command received";
break;
default:
response = $"Unknown command: {commandType}";
break;
}
// Report command status back to server
await apiClient.SendAsync("command/status", "PUT", new {
command_id = commandId,
status = success ? "completed" : "failed",
response = response
});
} catch (Exception ex) {
logger.Error($"Error executing command: {ex.Message}");
}
}
private bool ExecuteShutdown() {
try {
Process.Start(new ProcessStartInfo {
FileName = "cmd.exe",
Arguments = "/C shutdown /s /t 30 /c \"Shutdown ordered by administrator\"",
UseShellExecute = false,
CreateNoWindow = true,
Verb = "runas"
});
logger.Info("Shutdown command sent");
return true;
} catch (Exception ex) {
logger.Error($"Error during shutdown: {ex.Message}");
return false;
}
}
private bool ExecuteRestart() {
try {
Process.Start(new ProcessStartInfo {
FileName = "cmd.exe",
Arguments = "/C shutdown /r /t 30 /c \"Restart ordered by administrator\"",
UseShellExecute = false,
CreateNoWindow = true,
Verb = "runas"
});
logger.Info("Restart command sent");
return true;
} catch (Exception ex) {
logger.Error($"Error during restart: {ex.Message}");
return false;
}
}
private bool ExecuteLockWorkstation() {
try {
Process.Start("rundll32.exe", "user32.dll,LockWorkStation");
logger.Info("Lock workstation command sent");
return true;
} catch (Exception ex) {
logger.Error($"Error locking workstation: {ex.Message}");
return false;
}
}
private async Task CaptureScreenAsync() {
try {
string screenshotPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
"PCMonitor", "Screenshots"
);
Directory.CreateDirectory(screenshotPath);
string filename = Path.Combine(screenshotPath, $"screenshot_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png");
// Capture screen using PrintWindow API
ScreenCapture.CaptureScreen(filename);
// Upload screenshot
await apiClient.UploadFileAsync("screenshot", filename);
logger.Info($"Screenshot saved and uploaded: {filename}");
return true;
} catch (Exception ex) {
logger.Error($"Error capturing screenshot: {ex.Message}");
return false;
}
}
public void Dispose() { }
}
///
/// Screen Capture Utility
///
public static class ScreenCapture {
public static void CaptureScreen(string filename) {
try {
var screenSize = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
using (var bitmap = new System.Drawing.Bitmap(screenSize.Width, screenSize.Height)) {
using (var g = System.Drawing.Graphics.FromImage(bitmap)) {
g.CopyFromScreen(0, 0, 0, 0, screenSize.Size);
}
bitmap.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
}
} catch (Exception ex) {
throw new Exception($"Error capturing screen: {ex.Message}");
}
}
}
}