//go:build windows package service import ( "os/exec" "strings" "mfd-monitor-agent/internal/config" ) // windowsManager 通过 Windows 服务控制管理器(SCM)管理 agent。 type windowsManager struct{} // newManager 返回 Windows 服务管理器。 func newManager() Manager { return windowsManager{} } // Install 将 agent 可执行文件注册为自动启动的 Windows 服务。 func (windowsManager) Install(executable string, cfg config.Config, opts InstallOptions) error { args := []string{`"` + executable + `"`, "run"} if opts.ConfigPath != "" { // -config 被写入 binPath,确保 SCM 启动的 run 子命令读取指定配置。 args = append(args, "-config", `"`+opts.ConfigPath+`"`) } // sc.exe 的 binPath= 参数要求等号后单独一个参数,因此这里保持分段传参。 return exec.Command("sc.exe", "create", cfg.Service.Name, "binPath=", strings.Join(args, " "), "DisplayName=", cfg.Service.DisplayName, "start=", "auto").Run() } // Uninstall 停止并删除已配置的 Windows 服务。 func (windowsManager) Uninstall(cfg config.Config) error { // 服务可能未运行,忽略 stop 错误并继续删除服务注册。 _ = exec.Command("sc.exe", "stop", cfg.Service.Name).Run() return exec.Command("sc.exe", "delete", cfg.Service.Name).Run() } // Start 请求 SCM 启动服务。 func (windowsManager) Start(cfg config.Config) error { return exec.Command("sc.exe", "start", cfg.Service.Name).Run() } // Stop 请求 SCM 停止服务。 func (windowsManager) Stop(cfg config.Config) error { return exec.Command("sc.exe", "stop", cfg.Service.Name).Run() }