服务公告
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= disabledPowerShell方式:
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
: httpPowerShell查看依赖链:
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)
相关推荐
上一篇: GitLab:GitLab安全加固
下一篇: Harbor:故障排查