Windows注册服务

一、使用 SC 命令管理 Windows 服务

SC.exe 是一个强大的命令行工具,用于与 Windows 服务控制管理器通信,可以创建、配置、启动、停止和删除系统服务。

1.1 基础语法

SC 命令的基本语法如下:

1
SC [\\Servername] command Servicename [Optionname= Optionvalues]
  • Servername:远程计算机名(如 \\192.168.1.100),本地操作可省略。
  • Command:要执行的操作命令。
  • Servicename:服务的键名(注册表中的名称),不同于显示名称。
  • Optionname= Optionvalues:选项名和值。注意:等号后面必须有一个空格

1.2 常用命令速览

命令 功能描述
create 创建服务(添加到注册表)
delete 删除服务
start 启动服务
stop 停止服务
config 更改服务配置(永久生效)
query 查询服务状态
qc 查询服务配置信息

1.3 核心操作示例

1. 创建服务

将可执行程序注册为自动启动的服务。

1
sc create ServiceName binPath= "C:\Path\To\YourProgram.exe" start= auto

示例:将 Tomcat 注册为服务

1
sc create Tomcat binPath= "F:\apache-tomcat\bin\startup.bat" start= auto

2. 删除服务

1
sc delete ServiceName

示例:删除 Tomcat 服务

1
sc delete Tomcat

3. 配置与查询服务

  • 更改服务启动类型(如启用 Telnet):
    1
    2
    sc config tlntsvr start= auto
    net start tlntsvr
  • 查询服务状态
    1
    sc query ServiceName
  • 查询服务详细配置
    1
    sc qc ServiceName

1.4 SC CREATE 命令详解

创建服务时可以指定更多参数,格式如下:

1
sc create Servicename [type= {own|share}] [start= {boot|system|auto|demand|disabled}] [binPath= <二进制路径>] [obj= <账户名>] [Displayname= <显示名称>] [depend= <依赖服务>]

关键参数说明

  • type=:服务类型。own 为独立进程,share 为共享进程(默认)。
  • start=:启动类型。auto 为自动,demand 为手动(默认),disabled 为禁用。
  • binPath=(必需) 可执行文件的完整路径。
  • obj=:运行服务的账户,默认为 LocalSystem
  • Displayname=:在服务管理器中显示的名称。
  • depend=:该服务所依赖的其他服务(用空格分隔)。

复杂创建示例

1
sc create MyService binPath= "C:\MyApp\app.exe --config config.xml" type= own start= auto Displayname= "我的后台服务" depend= RPCSS/Tcpip

二、使用 NSSM 封装任意程序为服务

对于非原生服务程序(如普通 .exe 控制台程序),可以使用 NSSM (Non-Sucking Service Manager) 将其封装为标准的 Windows 服务。它比微软自带的 srvany 更强大易用。

2.1 NSSM 的优势

  1. 支持任何 .exe 程序。
  2. 安装和修改配置非常简单(有图形界面)。
  3. 可重定向程序输出到日志文件(支持日志轮换)。
  4. 具备服务守护功能,程序崩溃后可自动重启。
  5. 可自定义环境变量。

2.2 基本使用流程

1. 服务安装

打开命令行,执行:

1
nssm install <ServiceName>

这会弹出一个图形化配置窗口。在 “Application” 标签页中,设置:

  • Path:选择你的可执行程序。
  • Startup directory:设置程序的工作目录。
  • Arguments:如有需要,填入启动参数。

配置完成后,点击 “Install service”

命令行静默安装示例(安装 Jenkins Agent):

1
2
3
4
5
nssm install Jenkins "%PROGRAMFILES%\Java\jre7\bin\java.exe"
nssm set Jenkins AppParameters -jar slave.jar -jnlpUrl https://jenkins/computer/%COMPUTERNAME%/slave-agent.jnlp
nssm set Jenkins AppDirectory C:\Jenkins
nssm set Jenkins AppStdout C:\Jenkins\jenkins.log
nssm start Jenkins

2. 服务管理

  • 启动服务nssm start <ServiceName>
  • 停止服务nssm stop <ServiceName>
  • 重启服务nssm restart <ServiceName>

3. 修改配置

1
nssm edit <ServiceName>

再次打开图形界面修改参数。

4. 删除服务

1
2
3
nssm remove <ServiceName>
# 或自动确认删除
nssm remove <ServiceName> confirm

三、其他服务管理方式

3.1 使用 Regsvr32 注册控件

Regsvr32 用于注册 .dll.ocx 等控件文件。

1
Regsvr32 [/s] [/u] DLLName
  • /s:静默注册,不显示成功对话框。
  • /u:卸载控件。

3.2 通过注册表手动删除服务

如果 sc delete 失败,可以手动删除:

  1. Win + R,输入 regedit 打开注册表编辑器。
  2. 导航至:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
  3. 找到与服务名对应的键值,右键删除即可。

四、总结与最佳实践

场景 推荐工具 关键命令/操作
管理原生/已知服务 SC 命令 sc start/stop/config/query
将自定义程序安装为服务 SC 命令 sc create ... binPath= ...
封装复杂程序(需日志、守护) NSSM nssm install (图形界面配置)
注册/卸载系统控件 Regsvr32 Regsvr32 MyControl.dll

重要提醒

  1. 使用 sc create 时,binPath=start= 等参数中的等号后必须有一个空格
  2. 如果路径或服务名包含空格,必须使用双引号包裹。
  3. 大多数服务操作需要管理员权限
  4. 修改服务配置后,有时需要重启服务或计算机才能生效。

通过熟练掌握 SC 命令和 NSSM 工具,你可以高效地在 Windows 环境下完成各种服务的部署、管理和维护工作。