110 lines
3.7 KiB
C#
110 lines
3.7 KiB
C#
using System.ServiceProcess;
|
|
using System.Diagnostics;
|
|
|
|
namespace ITNexusAgent;
|
|
|
|
public class AgentService : ServiceBase
|
|
{
|
|
private CancellationTokenSource? _cts;
|
|
private Task? _worker;
|
|
|
|
public AgentService()
|
|
{
|
|
ServiceName = "IT Nexus Agent";
|
|
CanStop = true;
|
|
CanPauseAndContinue = false;
|
|
AutoLog = false;
|
|
}
|
|
|
|
protected override void OnStart(string[] args)
|
|
{
|
|
_cts = new CancellationTokenSource();
|
|
_worker = Task.Run(() => new AgentWorker(_cts.Token).RunAsync());
|
|
}
|
|
|
|
protected override void OnStop()
|
|
{
|
|
_cts?.Cancel();
|
|
_worker?.Wait(TimeSpan.FromSeconds(10));
|
|
}
|
|
|
|
public static void Install(string exePath)
|
|
{
|
|
// Bestehenden Service stoppen + löschen (falls vorhanden, damit binPath aktualisiert wird)
|
|
Run("net.exe", "stop \"IT Nexus Agent\"");
|
|
System.Threading.Thread.Sleep(2000);
|
|
Run("sc.exe", "delete \"IT Nexus Agent\"");
|
|
System.Threading.Thread.Sleep(1000);
|
|
|
|
// Dashboard-Prozesse beenden damit EXE nicht gesperrt ist
|
|
foreach (var p in System.Diagnostics.Process.GetProcessesByName("IT-Nexus-Agent"))
|
|
{
|
|
try { if (p.MainModule?.FileName != exePath) p.Kill(); } catch { }
|
|
}
|
|
|
|
// Neu erstellen mit korrektem Pfad
|
|
Run("sc.exe", $"create \"IT Nexus Agent\" binPath= \"{exePath}\" start= auto DisplayName= \"IT Nexus Agent\"");
|
|
Run("sc.exe", "description \"IT Nexus Agent\" \"Cereda Systems IT Nexus Monitoring Agent\"");
|
|
Run("sc.exe", "failure \"IT Nexus Agent\" reset= 60 actions= restart/5000/restart/10000/restart/30000");
|
|
Run("net.exe", "start \"IT Nexus Agent\"");
|
|
|
|
AgentWorker.Log($"Service installiert: {exePath}");
|
|
}
|
|
|
|
private static void Run(string exe, string args)
|
|
{
|
|
try
|
|
{
|
|
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(exe, args)
|
|
{ CreateNoWindow = true, UseShellExecute = false })?.WaitForExit();
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
public static void Uninstall()
|
|
{
|
|
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("net.exe",
|
|
"stop \"IT Nexus Agent\"")
|
|
{ CreateNoWindow = true })?.WaitForExit();
|
|
|
|
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("sc.exe",
|
|
"delete \"IT Nexus Agent\"")
|
|
{ CreateNoWindow = true })?.WaitForExit();
|
|
|
|
AgentWorker.Log("Service deinstalliert");
|
|
}
|
|
|
|
// Migration vom alten PowerShell-Agent
|
|
public static void MigrateFromOldAgent()
|
|
{
|
|
try
|
|
{
|
|
var oldDataDir = @"C:\ProgramData\IT Nexus Agent";
|
|
var oldConfigPath = Path.Combine(oldDataDir, "config.json");
|
|
|
|
// Alte Scheduled Tasks entfernen
|
|
foreach (var taskName in new[] { "IT Nexus Agent", "IT Nexus Announcement Watcher" })
|
|
{
|
|
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("schtasks.exe",
|
|
$"/delete /tn \"{taskName}\" /f")
|
|
{ CreateNoWindow = true })?.WaitForExit();
|
|
}
|
|
|
|
// Alte PS1-Dateien bereinigen
|
|
if (Directory.Exists(oldDataDir))
|
|
{
|
|
foreach (var f in Directory.GetFiles(oldDataDir, "*.ps1"))
|
|
try { File.Delete(f); } catch { }
|
|
foreach (var f in Directory.GetFiles(oldDataDir, "*.update"))
|
|
try { File.Delete(f); } catch { }
|
|
}
|
|
|
|
AgentWorker.Log("Migration vom alten PowerShell-Agent abgeschlossen");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
AgentWorker.Log($"Migration-Warnung: {ex.Message}");
|
|
}
|
|
}
|
|
}
|