使用 sc create 命令在 Windows 中添加服务,需指定服务名、可执行文件路径 (binPath=) 和启动类型 (start=),并以管理员身份运行命令提示符。
当需要在 Windows 系统中添加一个新的后台运行程序(通常称为“服务”或“服务器进程”)时,sc
(Service Control) 命令是一个强大且直接的工具,它允许你通过命令行创建、配置、启动、停止和管理 Windows 服务,下面将详细介绍如何使用 sc create
子命令来添加一个新的服务。
核心命令:sc create
添加服务的基本语法结构如下:
sc \\<ServerName> create <ServiceName> binPath= "<PathToExecutable>" <OtherOptions>
让我们分解每个部分:
sc
: 调用 Service Control 工具。\\<ServerName>
(可选): 指定你要在其上创建服务的远程计算机的名称,如果省略(最常见的情况),则表示在本地计算机上创建服务。\\MyServer
。(注意:操作远程计算机通常需要管理员权限和相应的网络访问权限)create
: 这是sc
命令的子命令,明确指示要创建一个新服务。<ServiceName>
: 必需,这是你为新服务指定的唯一名称,这是你在服务列表(services.msc)中看到的“服务名称”列,或者在后续使用sc
命令(如sc start
,sc stop
)时使用的标识符,名称不能包含空格或反斜杠 (\
),通常使用简洁的英文单词或缩写(MyAppService
,DataProcessor
)。binPath=
: 必需,这个参数指定了服务对应的可执行文件(.exe)的完整路径,路径必须用英文双引号 () 括起来,特别是当路径中包含空格时(这非常常见),这是命令成功的关键。- 正确示例:
binPath= "\"C:\Program Files\MyApp\MyService.exe\""
(注意路径内部空格的处理:整个路径被外层引号包围,可执行文件路径本身也加了引号,这是最稳妥的方式) - 正确示例:
binPath= "C:\MyApp\NoSpaceService.exe"
- 错误示例:
binPath= C:\Program Files\MyApp\MyService.exe
(缺少引号,空格会导致命令解析错误)
- 正确示例:
<OtherOptions>
(可选): 你可以在binPath=
之后添加多个参数来配置新服务的各种属性,这些参数也是以参数名= 值
的形式出现,值通常需要用双引号括起来(如果包含空格),常用选项包括:displayname=
: 设置服务在服务管理控制台(services.msc)中显示的友好名称,这个名称可以包含空格,便于用户识别。- 示例:
displayname= "My Application Background Service"
- 示例:
start=
: 设置服务的启动类型,这是非常重要的配置项,常用值有:auto
– 系统启动时自动启动(最常见)。demand
/manual
– 需要手动启动(用户或依赖服务触发)。disabled
– 服务被禁用,无法启动。- 示例:
start= auto
depend=
: 指定此服务所依赖的一个或多个服务,服务名称用斜杠 () 分隔,依赖的服务必须在此服务启动之前先启动。- 示例:
depend= Tcpip/Dhcp
(表示依赖 TCP/IP 和 DHCP 服务)
- 示例:
obj=
: 指定服务运行时所使用的账户,通常使用LocalSystem
(高权限系统账户),或者格式为"DomainName\UserName"
或".\LocalUserName"
的账户,如果使用特定用户账户,通常还需要password=
参数(但直接在命令行输入密码有安全风险,通常建议创建后配置)。- 示例 (LocalSystem):
obj= "LocalSystem"
- 示例 (域账户):
obj= "MyDomain\ServiceAccount"
- 示例 (LocalSystem):
password=
: 当obj=
指定了非内置账户(如LocalSystem
,NetworkService
,LocalService
)时,提供该账户的密码。强烈警告:直接在命令行中包含明文密码是极不安全的做法,尤其是在脚本或可能被记录的环境中,通常更安全的做法是先创建服务,然后在服务属性中设置密码,或者使用其他安全凭证管理方法。- 示例 (不推荐):
password= "P@ssw0rd!"
- 示例 (不推荐):
type=
: 指定服务类型,对于大多数用户级应用程序服务,使用own
(独占进程) 或share
(共享进程) 即可,内核驱动使用kernel
,文件系统驱动使用filesys
,默认通常是own
。- 示例:
type= own
- 示例:
error=
: 指定如果服务启动失败,系统应如何处理,常用值:normal
– 记录错误并显示给用户(默认)。ignore
– 忽略错误,系统继续启动。severe
– 系统使用最后一次已知的正确配置重启。critical
– 系统使用最后一次已知的正确配置重启,如果失败则停止启动过程。- 示例:
error= normal
一个完整的创建服务示例
假设我们要在本地计算机上创建一个服务:
- 服务名称 (ServiceName):
MyDataSync
- 显示名称 (DisplayName):
MyApp Data Synchronization Service
- 可执行文件路径 (binPath):
"C:\Program Files\MyApp\SyncDaemon.exe"
(注意路径有空格) - 启动类型 (start):
auto
(开机自动启动) - 运行账户 (obj):
LocalSystem
- 依赖服务 (depend):
Tcpip
(依赖 TCP/IP 服务)
命令如下:
sc create MyDataSync binPath= "\"C:\Program Files\MyApp\SyncDaemon.exe\"" displayname= "MyApp Data Synchronization Service" start= auto obj= "LocalSystem" depend= Tcpip
重要提示与注意事项
- 管理员权限: 创建、修改或删除 Windows 服务必须在管理员权限的命令提示符 (Command Prompt) 或 Windows PowerShell (以管理员身份运行) 中执行,否则你会收到“拒绝访问 (Access Denied)”的错误。
- 路径引号:
binPath=
的值必须用双引号括起来,如果路径本身包含空格,强烈建议在可执行文件的完整路径内部也加上双引号,并用反斜杠\
进行转义(如示例所示:\"C:\Program Files\...\"
),这是最可靠避免解析错误的方法。 - 空格分隔:
sc create
命令的参数之间必须有空格。binPath=
,displayname=
,start=
等参数名、等号 和值之间不能有空格(binPath = "..."
是错误的,正确的是binPath= "..."
)。 - 服务名称唯一性: 确保你指定的
<ServiceName>
在系统中是唯一的,如果尝试创建一个已存在名称的服务,命令会失败。 - 可执行文件要求: 指定的可执行文件 (
binPath
) 必须存在,并且必须是设计为作为 Windows 服务运行的程序,普通的用户界面应用程序通常不能直接作为服务安装,它们需要特殊的代码来处理与服务控制管理器 (SCM) 的交互,如果程序本身不支持作为服务运行,使用sc create
创建服务后启动它会失败(常见错误 1053:服务没有及时响应启动或控制请求),对于这类程序,通常需要使用像NSSM
(Non-Sucking Service Manager) 这样的第三方工具将其包装成服务。 - 密码安全: 极其不推荐在命令行中使用
password=
参数明文指定密码,这会在命令历史记录、日志文件中留下安全隐患,最佳实践是:- 创建服务时不指定密码(
sc create ... obj= "YourAccount"
)。 - 打开服务管理控制台 (
services.msc
)。 - 找到你创建的服务,右键选择“属性”。
- 切换到“登录”选项卡。
- 在此处输入账户密码并确认。
- 点击“应用”或“确定”。
- 创建服务时不指定密码(
- 启动服务:
sc create
命令只创建服务的配置项,并不会自动启动服务,你需要使用sc start <ServiceName>
命令来启动它。 - 验证: 创建服务后,你可以通过以下方式验证:
- 运行
sc query <ServiceName>
查看服务状态。 - 打开服务管理控制台 (
services.msc
) 查看服务列表。
- 运行
- 删除服务: 如果创建错误或不再需要,可以使用
sc delete <ServiceName>
命令删除服务,同样需要管理员权限。删除前请确保服务已停止 (sc stop <ServiceName>
)。
替代方案
- Windows 服务管理控制台 (
services.msc
): 图形化界面,更直观,适合手动操作和配置(包括安全地设置密码),但创建服务本身通常还是需要知道可执行文件路径。 - PowerShell (
New-Service
cmdlet): 对于熟悉 PowerShell 的用户,New-Service
提供了另一种创建服务的方式,有时语法更灵活,且能更好地处理凭据(通过-Credential
参数配合PSCredential
对象,比命令行明文密码安全),示例:New-Service -Name "MyDataSync" -BinaryPathName "C:\Program Files\MyApp\SyncDaemon.exe" -DisplayName "MyApp Data Synchronization Service" -StartupType Automatic -Credential (Get-Credential)
- 应用程序自带安装程序: 许多需要安装服务的软件会在其安装程序 (
setup.exe
或msi
) 中自动处理服务的创建和配置。
sc create
命令是 Windows 命令行环境下添加(创建)服务的核心工具,掌握其语法,特别是正确处理 binPath=
的引号和空格,以及理解关键参数如 displayname=
, start=
, depend=
, obj=
的用法,对于系统管理员和需要部署后台服务的开发人员至关重要,务必牢记操作需要管理员权限,谨慎处理运行账户和密码,并在操作前确认可执行文件支持作为服务运行,对于安全性要求高的场景,优先使用图形界面或 PowerShell 来设置密码。
引用说明:
- 本文档中关于
sc
命令参数和行为的描述,主要基于 Microsoft 官方文档对 Service Control 工具的说明,详细信息可参考 Microsoft Learn 文档:- sc create (适用于 Windows Server 和 Windows 客户端操作系统)
注意: 修改系统服务配置是一项需要谨慎进行的操作,错误的配置可能导致服务无法启动、系统不稳定或安全风险,建议在非生产环境测试成功后再在生产环境应用,确保你理解所创建服务的功能和所需权限。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/8995.html