服务公告

服务公告 > 综合新闻 > Windows系统管理:服务管理

Windows系统管理:服务管理

发布时间:2026-04-22 15:01

一、前言

搞过的人都知道,最烦的是Windows服务动不动就抽风,要么起不来,要么起来了又崩。作为干了10年运维的老兵,今天把这套服务管理的实战经验摊开讲,涵盖命令行和PowerShell两种姿势,从查到配到排错一条龙整明白。

二、操作步骤

第1步:查看当前所有服务状态

命令提示符方式:

sc query type= service state= all

预期输出(部分截取):

SERVICE_NAME: Dnscache DISPLAY_NAME: DNS Client TYPE : 20 WIN32_SHARE_PROCESS STATE : 4 RUNNING (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN) SERVICE_NAME: EventLog DISPLAY_NAME: Windows Event Log TYPE : 20 WIN32_SHARE_PROCESS STATE : 4 RUNNING (NOT_STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)

PowerShell方式(更直观):

Get-Service | Select-Object Name, DisplayName, Status | Format-Table -AutoSize

预期输出:

Name DisplayName Status ---- ----------- ------ AeLookupSvc Application Experience Stopped BITS Background Intelligent... Running BrokerInfrastructure Background Tasks Infr... Running ClipSVC Clipper Service Stopped

第2步:筛选特定服务查看详情

查看单个服务详细信息:

sc queryex type= service state= all | findstr /i "SERVICE_NAME DISPLAY_NAME STATE"

PowerShell精准查找:

Get-Service -Name Spooler

预期输出:

Status Name DisplayName ------ ---- ----------- Running Spooler Print Spooler

第3步:启动和停止服务

停止服务(打印服务举例):

net stop Spooler

预期输出:

The Print Spooler service is stopping. The Print Spooler service was stopped successfully.

启动服务:

net start Spooler

预期输出:

The Print Spooler service is starting. The Print Spooler service was started successfully.

PowerShell方式(带强制确认):

Stop-Service -Name Spooler -Force Start-Service -Name Spooler

第4步:配置服务启动类型

设置服务为自动启动:

sc config Spooler start= auto

预期输出:

[SC] ChangeServiceConfig SUCCESS

设置服务为手动启动:

sc config Spooler start= demand

设置服务为禁用:

sc config Spooler start= disabled

PowerShell方式:

Set-Service -Name Spooler -StartupType Automatic Set-Service -Name Spooler -StartupType Manual Set-Service -Name Spooler -StartupType Disabled

第5步:查看服务依赖关系

查看哪些服务依赖Spooler:

sc enumdepend Spooler

预期输出(部分):

DISPLAY_NAME: Print Spooler TYPE : 20 WIN32_SHARE_PROCESS STATE : 4 RUNNING DEPENDENCIES : RPCSS : http

PowerShell查看依赖链:

Get-Service -Name Spooler | Select-Object -ExpandProperty DependentServices Get-Service -Name Spooler | Select-Object -ExpandProperty ServicesDependedOn

预期输出:

Status Name DisplayName ------ ---- ----------- Running RDSessMgr Remote Desktop Configuration

第6步:排查服务启动失败问题

查看服务详细错误代码:

sc queryex Spooler sc qc Spooler

预期输出:

SERVICE_NAME: Spooler TYPE : 20 WIN32_SHARE_PROCESS START_TYPE : 2 AUTO_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\Windows\System32\spoolsv.exe LOAD_ORDER_GROUP : ParallelPort DEPENDENCIES : RPCSS SERVICE_START_NAME : LocalSystem

查看Windows事件日志中的服务错误:

Get-EventLog -LogName System -Source "Service Control Manager" -Newest 20 | Select-Object TimeGenerated, EntryType, Message | Format-List

预期输出:

TimeGenerated : 2024/1/15 10:30:25 EntryType : Error Message : Service Control Manager 事件 ID 7000 - 服务XXX由于启动失败...

第7步:远程管理服务(进阶)

查询远程机器服务:

sc \\远程主机名 query Spooler Get-Service -Name Spooler -ComputerName 远程主机名

远程启动服务:

sc \\远程主机名 start Spooler sc \\远程主机名 stop Spooler

三、常见问题FAQ

Q1: 服务删不掉,提示"拒绝访问"怎么回事?

老手吐槽:这一般是权限不够,或者服务还在跑没停干净。先用管理员权限打开CMD,确认服务已停止:net stop 服务名,然后再删。sc delete 服务名。如果还不行,可能是服务有保护机制,用sc config 服务名 type= own改一下再试。远程的话确保你有那台机的管理员权限,别上来就干。

Q2: 服务明明设置了自动启动,但机器重启后还是没起来?

老手吐槽:这种情况基本是两个原因——第一,服务依赖没满足,比如RPC服务没起来你服务就干等了;第二,服务的可执行文件路径有问题,重启后路径变了。排查顺序:先sc qc 服务名看BINARY_PATH_NAME对不对,再看依赖关系sc enumdepend 服务名,最后查系统日志里服务启动的时间戳。

Q3: PowerShell的Get-Service和sc命令哪个好用?

老手吐槽:看你啥场景。日常查状态、过滤、写脚本,用PowerShell舒服,一行搞定。但批量操作、远程管理、跟其他批处理混着用,sc更通用。特别提醒:别在生产环境同时开两个窗口一个用sc一个用PowerShell改同一服务,容易搞出状态不一致的幺蛾子。

Q4: 怎么快速找出哪些服务占用了特定端口?

老眼识别:这个要组合拳。先netstat -ano | findstr :端口号找到PID,然后:tasklist | findstr PID号定位进程,再:Get-Service | Where-Object {$_.Status -eq 'Running'} | Select-Object Name对照服务名。新手爱用图形界面服务管理器查,效率太低,老手都是命令行怼。

四、总结

核心要点:

  • 日常查看用Get-Service,批量和脚本用sc query
  • 启动/停止记住用管理员权限,GUI改配置有时不生效
  • 服务删除前必须先停,依赖关系要理清楚再动手
  • 排错先看日志和依赖,错误代码能百度就别瞎猜
  • 远程管理前提是网络通、权限够、目标机防火墙放行

延伸阅读:

  • 微软官方文档:Service Control Manager (SCM)
  • PowerShell About Services官方文档
  • Windows服务加固最佳实践(微软Security Baselines)