以 Windows 服务运行程序并开机自启

Windows Service 是指 Windows NT 操作系统中的一种运行在后台的计算机程序。它在概念上类似于 Unix 守护进程。Windows 服务必须符合一定的的接口规则和协议。所以普通的可执行程序无法直接作为 Windows 服务。

Windows 服务可以配置为在操作系统启动时运行,并且在 Windows 运行期间持续在后台运行,如果出错能够自动重启程序。服务也可以手动或基于某个事件而启动。

以 serverstatus 为例,介绍借助 shawl 将任何程序作为 Windows 服务运行,并实现开机自启。

指标 描述
适用系统 Windows 10/11
走通流程时间 10 分钟

I might have made some mistakes, please let me know if I’ve gotten anything wrong!

精简说明

下文每一步都详细进行了说明,能让电脑小白也了解如何使用,但因此对熟练使用 Windows 的老手来说很啰唆。这里简单介绍主要步骤:

  1. https://github.com/mtkennerly/shawl/releases 下载压缩包,解压后有一个 shawl
  2. 确保原程序在命令行下能正常启动。比如 serverstatus 探针: stat_client -a "http://serverstatus.vfly2.com:8080/report" -u vfly2 -p 123
  3. 以管理员权限打开命令行,使用 shawl 添加服务,在原命令前加点内容就行,以及使用绝对路径: shawl add --name serverstatus -- C:/Users/AhFei/Desktop/serverstatus/stat_client.exe -a "http://serverstatus.vfly2.com:8080/report" -u vfly2 -p 123
  4. 先试一下启动服务: sc start serverstatus
  5. 如果启动失败,可能是权限不够,指定运行服务的用户: sc config serverstatus obj=".\AhFei" password="456"
  6. 设置开机自启: sc config serverstatus start=auto

shawl 运行任意程序作为 Windows 服务

GitHub: mtkennerly/shawl: Windows service wrapper for arbitrary commands

安装 shawl

https://github.com/mtkennerly/shawl/releases 下载最新版本的压缩包,现在电脑基本都是 64 位,就下 shawl-v1.7.0-win64.zip 这种的。然后解压,里面有一个程序文件 shawl

本文在桌面创建一个文件夹(C:/Users/AhFei/Desktop/serverstatus/),名称为 serverstatus,将 shawl 移动到这个文件夹中,读者可自行选择这个文件夹创建的位置,但是选择好后就不能再移动,否则创建的服务无法运行。

管理员权限打开命令行,后续会用到,以下是一种打开方式:

  1. Win + R 快捷键打开“运行”窗口(Win 就是徽标键,在空格左边,一般是一个窗口图案)
  2. 输入 cmd
  3. 再按住 ctrl+shift+enter ,会弹出框,允许后就会管理员权限运行了。
  4. 输入 cd C:/Users/AhFei/Desktop/serverstatus/ 进入 shawl 的安装文件夹,记得改成自己的路径。

使用步骤

以 serverstatus-rust 为例,在 Windows 上使用可以看这篇文章: Rust 版 ServerStatus 探针安装步骤 – 技焉洲 ,直接在命令行运行 serverstatus 的命令是:

C:/Users/AhFei/Desktop/serverstatus/stat_client.exe -a "http://serverstatus.vfly2.com:8080/report" -u vfly2 -p 123

先测试原程序本身能否执行,如果成功运行,就能用 shawl 将其包装成系统服务。


用上面以管理员权限打开的命令行,添加系统服务:

shawl add --name serverstatus -- C:/Users/AhFei/Desktop/serverstatus/stat_client.exe -a "http://serverstatus.vfly2.com:8080/report" -u vfly2 -p 123

参数说明:

  • --name,系统服务名称,如果有空格,就用 "" 包裹
  • -- ,后面跟启动原程序的命令。

然后,在【任务管理器】-【服务】中,就能找到新创建的 serverstatus 服务了。但是此时它还不能成功执行,也不能开机自启。

使用 sc 设置开机自启

sc 是 Service Control 的缩写,用于管理 Windows 服务,系统自带的工具。

用上面以管理员权限打开的命令行,再执行 sc 命令。

指定用户运行

由于 serverstatus 需要获取系统的各种信息,默认的执行用户无权限运行,所以使用sc命令为服务配置指定用户:

sc config [服务名称] obj= ".\AhFei" password= "你的密码"

[服务名称] 替换为实际服务名,密码字段留空则使用空密码。需要注意:

  • 账户格式使用.\前缀表示本地计算机账户
  • 密码输入账号的密码,若使用空密码需保留空双引号""
  • 目标账户需具有"作为服务登录"的权限(可通过本地安全策略管理单元配置)

如:

sc config serverstatus obj=".\AhFei" password="456"

安全提示:此方法会在系统日志中留下明文密码记录,建议仅用于测试环境。生产环境推荐使用组策略管理服务账户。

设置完用户后,执行

sc start serverstatus

可以通过网页查看是否上线,或者查看 shawl 的日志,判断是否正常运行。正常运行则接着设置开机自启。

想要关闭自然就是 sc stop serverstatus


如果不行,比如密码中有特殊字符,可以在图形界面设置。

在【任务管理器】-【服务】中,随便选一个服务右键,点【打开服务】,进入“服务”窗口,找到 serverstatus,右键,点【属性】-【登录】,选择此账户,输入账号和密码即可。

设置开机自启

使用 sc 命令设置服务开机自动启动:

sc config "服务名称" start=auto

服务名称要完全正确(带空格的服务名需要加引号),start=后面直接跟参数,不要加空格。

支持的启动类型参数:

  • auto(自动/延迟启动)
  • delayed-auto(Win7之后支持真正的自动启动)
  • demand(手动)
  • disabled(禁用)

如:

sc config serverstatus start=auto

设置完成后建议运行sc qc 服务名查看确认配置是否生效。

然后重启一下电脑,看开机后 serverstatus 是否能自动启动。

其他工具

shawl 在这类工具中很不出名,不过由于 AhFei 知道的第一个是它,因此就用它了,我个人感觉还不错,即便看了其他工具依然觉得这是个更简单的工具,使用 rust 语言,体积小巧。

下面的内容都是 v2ex 中网友评论里提到的,一并整理,感谢他们的分享。

WinSW

GitHub: winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license.

和 shawl 类似,但是需要编写一个配置文件,并且启动服务等操作是通过 WinSW 这个工具本身操控,而不是 Sc 这样的原生的系统工具,这点感觉不好,变复杂了。使用 C#,体积会大些。

随便找了篇教程文章: https://blog.usro.net/2024/10/how-to-create-a-windows-service-with-winsw-a-step-by-step-guide/

NSSM

GitHub: kirillkovalenko/nssm: Non-Sucking Service Manager
官网: NSSM – the Non-Sucking Service Manager

The Non-Sucking Service Manager,更老牌的工具,就是挺久没更新了,不过应该也挺不错的。C++ 编写体积更小巧些。

开机计划

只能做到开机自启,如果程序出错不能自动重启(应该),是系统内置的功能。

使用图形界面设置,但是我个人不喜欢这种图形界面,本质和命令行没区别,反而从一维变成二维,看着更复杂了。复制命令,敲命令不更快吗?

步骤: 我需要设置开机自动启动一个程序且用管理员身份运行、最小化运行,需要怎么操作呢,最小化需要添加什么参数 – Microsoft Community

开机自启的目录

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 创建快捷方式。但这个只能叫“登陆桌面自启动”,服务器这类不登陆桌面的情况它就不会启动。


原文链接: https://yanh.tech/2025/02/run-as-a-windows-service/

版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技焉洲 (yanh.tech)

保持更新 ٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰恒益的实用技能,欢迎使用 RSS 订阅,如果能留言互动就更好了。

可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇