Go创建的Windows服务在services.msc中不显示,如何解决?
解决Go创建Windows服务无法在services.msc显示的问题
核心原因
services.msc会严格校验服务注册表项的必填配置,你的服务在Start、ErrorControl、ObjectName等键值上的不规范配置,导致图形界面未加载该服务,尽管PowerShell和命令行能正常识别并操作它。
关键注册表键值修正方案
针对你提到的差异项,给出标准配置要求:
- Start:必须设置为合法启动类型数值,常见有效值为
2(自动启动)、3(手动启动)、4(禁用),不可使用非标准数值 - ErrorControl:建议设为
1(普通错误,系统会弹出提示),这是多数系统服务的默认值,设为0可能导致services.msc忽略该服务 - ObjectName:默认使用
LocalSystem(本地系统账户),若服务无需特殊权限,不要留空或使用非标准账户名 - DependOnService:无依赖服务时不要添加该键;若有依赖,需填写已存在的合法服务名称(如
RpcSs)
Go代码修改示例
假设你原安装代码如下:
package main import ( "log" "golang.org/x/sys/windows/svc/mgr" ) func installService(name, displayName, exePath string) error { m, err := mgr.Connect() if err != nil { return err } defer m.Disconnect() s, err := m.OpenService(name) if err == nil { s.Close() return nil // 服务已存在 } // 原存在配置缺失的创建代码 s, err = m.CreateService(name, exePath, mgr.Config{ DisplayName: displayName, // 缺失关键配置项 }) if err != nil { return err } defer s.Close() return nil } func main() { if err := installService("MyGoService", "My Go Service", "C:\\path\\to\\your\\service.exe"); err != nil { log.Fatal(err) } }
修改后补充必填标准配置:
s, err = m.CreateService(name, exePath, mgr.Config{ DisplayName: displayName, StartType: mgr.StartAutomatic, // 对应注册表Start值2 ErrorControl: mgr.ErrorNormal, // 对应注册表ErrorControl值1 ServiceStartName: "LocalSystem", // 对应注册表ObjectName // 若有依赖服务,添加:Dependencies: []string{"RpcSs"}, })
验证步骤
- 卸载原有问题服务:执行
sc delete MyGoService命令 - 运行修改后的安装代码重新创建服务
- 刷新services.msc(或重启服务管理器),即可看到你的服务正常显示
内容的提问来源于stack exchange,提问作者A T
相关产品推荐
相关产品推荐

