Windows 服务管理常用命令:sc、Get-Service 和 Restart-Service 怎么用

在 Windows 上排查网络、虚拟机、SSH、数据库这类问题时,经常会碰到一句话:

先看一下服务有没有起来。

如果人在图形界面前,打开“服务”管理器当然可以。但如果你是通过 SSH 连到一台 Windows 机器,或者手边只有 CMD / PowerShell,命令行会更省事。

这篇只整理服务管理相关的常用命令。

先判断你现在在哪个 Shell

Windows 上常见两种提示符:

1
C:\Users\xxx>

这种一般是 CMD。

1
PS C:\Users\xxx>

这种一般是 PowerShell。

两个环境都能管理服务,但命令不一样:

  • CMD 里主要用 sc
  • PowerShell 里主要用 Get-ServiceStart-ServiceStop-ServiceRestart-Service

CMD 下查看服务:sc query

查看所有服务:

1
sc query

只查看正在运行的服务:

1
sc query state= running

查看某个指定服务:

1
sc query 服务名

例如查看 OpenSSH 服务:

1
sc query sshd

如果服务名里有空格,一定要加引号。

例如 VMware NAT 服务:

1
sc query "VMware NAT Service"

不要写成:

1
sc query VMware NAT Service

这种写法会把后面的单词拆成多个参数,很容易报:

1
错误: 无效选项

查看更详细的信息:sc queryex

sc query 只能看到基本状态。如果想看更多信息,可以用 sc queryex

1
sc queryex "VMware NAT Service"

它通常会比 sc query 多出一些字段,比如 PID

排查“服务虽然显示运行,但实际进程是不是还在”这类问题时,queryex 更有用。

查看服务配置:sc qc

如果想看服务的启动类型、执行路径、依赖关系,可以用:

1
sc qc "VMware NAT Service"

常见用途:

  • 看服务启动类型
  • 看服务对应的可执行文件路径
  • 看服务依赖哪些组件
  • 判断服务配置是否被改过

这里的 qc 可以理解成 query config。

CMD 下启动、停止和重启服务

停止服务:

1
sc stop "VMware NAT Service"

启动服务:

1
sc start "VMware NAT Service"

如果你只是想快速重启,可以合成一条:

1
sc stop "VMware NAT Service" && sc start "VMware NAT Service"

这条命令的意思是:

  1. 先执行 sc stop
  2. 如果停止命令执行成功,再执行 sc start

有些服务停止需要几秒钟。如果刚停完立刻启动失败,可以等一下,再单独执行:

1
sc start "VMware NAT Service"

重启后建议再确认状态:

1
sc query "VMware NAT Service"

如果看到 STATERUNNING,一般就说明服务已经启动。

PowerShell 下查看服务:Get-Service

PowerShell 里查看服务更直观:

1
Get-Service

只看正在运行的服务:

1
Get-Service | Where-Object {$_.Status -eq 'Running'}

查看指定服务:

1
Get-Service sshd

如果想让输出更适合阅读:

1
Get-Service | Format-Table -AutoSize

也可以组合一下,只看正在运行的服务并格式化:

1
Get-Service | Where-Object {$_.Status -eq 'Running'} | Format-Table -AutoSize

PowerShell 下启动、停止和重启服务

停止服务:

1
Stop-Service "VMware NAT Service"

启动服务:

1
Start-Service "VMware NAT Service"

重启服务:

1
Restart-Service "VMware NAT Service"

如果是 OpenSSH 服务,可以这样重启:

1
Restart-Service sshd

PowerShell 的好处是命令语义更清楚。看到 Restart-Service 基本就知道它在干什么。

常见问题

1. 服务名和显示名是不是一回事?

不一定。

Windows 服务通常有:

  • 服务名
  • 显示名

很多时候两者一样,但也可能不同。sc query 输出里一般能看到:

1
2
SERVICE_NAME: VMware NAT Service
DISPLAY_NAME: VMware NAT Service

如果两者不同,命令里优先使用 SERVICE_NAME

2. 服务名有空格怎么办?

加引号。

1
sc query "VMware NAT Service"
1
Restart-Service "VMware NAT Service"

这是最容易踩的坑。只要服务名里有空格,就别省引号。

3. 提示拒绝访问怎么办?

服务管理通常需要管理员权限。

如果你是在 SSH 里操作 Windows 服务,当前 SSH 用户也需要有足够权限。否则执行 stopstartrestart 时可能会失败。

可以先确认当前账号是否具备管理员权限,再执行服务管理命令。

4. CMD 能不能切到 PowerShell?

可以。在 CMD 里直接输入:

1
powershell

回车后就会进入 Windows PowerShell。

如果机器装了 PowerShell 7,也可以尝试:

1
pwsh

常用命令速查

CMD:

1
2
3
4
5
6
7
8
sc query
sc query state= running
sc query "VMware NAT Service"
sc queryex "VMware NAT Service"
sc qc "VMware NAT Service"
sc stop "VMware NAT Service"
sc start "VMware NAT Service"
sc stop "VMware NAT Service" && sc start "VMware NAT Service"

PowerShell:

1
2
3
4
5
6
7
Get-Service
Get-Service | Where-Object {$_.Status -eq 'Running'}
Get-Service sshd
Stop-Service "VMware NAT Service"
Start-Service "VMware NAT Service"
Restart-Service "VMware NAT Service"
Restart-Service sshd

小结

如果你在 CMD 里,优先记住:

1
2
3
sc query "服务名"
sc stop "服务名"
sc start "服务名"

如果你在 PowerShell 里,优先记住:

1
2
Get-Service
Restart-Service "服务名"

排查 Windows 服务问题时,先查状态,再看配置,最后再重启。别一上来就重启,至少先知道服务当前到底是什么状态。