Files
go-process-guardian/services/index.go
2025-07-14 19:00:50 +08:00

116 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package services
import (
"go-process-guardian/config"
"log"
"os"
"path/filepath"
"time"
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/eventlog"
"golang.org/x/sys/windows/svc/mgr"
)
// 服务管理 注册Windows服务 卸载服务
func InstallService() {
appConfig, _ := config.LoadConfig()
// 连接系统的服务管理
serviceMessage, err := mgr.Connect()
if err != nil {
log.Println("连接电脑服务失败,请使用管理员权限运行")
return
}
defer serviceMessage.Disconnect()
// 打开服务 如果打开失败则创建服务
service, err := serviceMessage.OpenService(appConfig.ServiceName)
if err != nil {
// 若错误码为 ERROR_SERVICE_DOES_NOT_EXIST表示服务不存在
if errCode, ok := err.(windows.Errno); ok && errCode == windows.ERROR_SERVICE_DOES_NOT_EXIST {
createService(serviceMessage)
}
}
if service != nil {
defer service.Close()
}
}
func createService(serviceMessage *mgr.Mgr) {
exePath, err := filepath.Abs(os.Args[0])
if err != nil {
log.Fatal(err)
}
// 创建服务
mgrConfig := mgr.Config{
DisplayName: "PMG Windows",
Description: "进程守护",
StartType: mgr.StartAutomatic,
}
appConfig, _ := config.LoadConfig()
service, err := serviceMessage.CreateService(appConfig.ServiceName, exePath, mgrConfig)
if err != nil {
log.Fatal("CreateService failed:", err)
}
defer service.Close()
// 设置恢复策略
recoveryActions := []mgr.RecoveryAction{
{Type: mgr.ServiceRestart, Delay: 60 * time.Second},
{Type: mgr.ServiceRestart, Delay: 120 * time.Second},
{Type: mgr.NoAction},
}
if err := service.SetRecoveryActions(recoveryActions, 86400); err != nil {
log.Println("Warning: failed to set recovery actions:", err)
}
// 创建事件日志源
if err := eventlog.InstallAsEventCreate(appConfig.ServiceName, eventlog.Error|eventlog.Warning|eventlog.Info); err != nil {
log.Println("Warning: failed to create event source:", err)
}
log.Println("Service installed successfully")
}
func UninstallService() {
appConfig, _ := config.LoadConfig()
// 连接系统的服务管理
serviceMessage, err := mgr.Connect()
if err != nil {
log.Println("连接电脑服务失败")
log.Println(err)
return
}
defer serviceMessage.Disconnect()
// 打开服务
service, err := serviceMessage.OpenService(appConfig.ServiceName)
if err != nil {
log.Fatal("Service not installed:", err)
return
}
defer service.Close()
// 停止服务
if status, err := service.Control(svc.Stop); err == nil {
timeout := time.Now().Add(10 * time.Second)
for status.State != svc.Stopped && time.Now().Before(timeout) {
time.Sleep(500 * time.Millisecond)
status, err = service.Query()
if err != nil {
break
}
}
}
// 删除服务
if err := service.Delete(); err != nil {
log.Fatal("DeleteService failed:", err)
}
// 移除事件日志源
if err := eventlog.Remove(appConfig.ServiceName); err != nil {
log.Println("Warning: failed to remove event source:", err)
}
log.Println("Service uninstalled successfully")
}