Appearance
服务管理
Windows 服务是在后台运行的应用程序,它们通常不显示用户界面,为系统和其他程序提供功能支持。本章介绍 Windows 服务的管理方法。
服务概述
什么是服务
Windows 服务是一种特殊的应用程序类型:
- 在后台运行,通常不需要用户交互
- 可以在系统启动时自动运行
- 运行在特定的用户账户下(通常是系统账户)
- 提供系统级功能支持
服务类型
| 类型 | 说明 |
|---|---|
| 独立服务 | 独立运行的服务 |
| 共享服务 | 共享进程的服务 |
| 内核驱动 | 内核模式驱动程序 |
| 文件系统驱动 | 文件系统驱动程序 |
服务启动类型
| 启动类型 | 说明 |
|---|---|
| 自动 | 系统启动时自动运行 |
| 自动(延迟启动) | 系统启动后延迟运行 |
| 手动 | 需要时手动或被其他服务启动 |
| 禁用 | 无法启动 |
| 自动(触发启动) | 响应特定事件时启动 |
服务管理工具
服务管理器
powershell
# 打开服务管理器
services.msc
# 通过计算机管理打开
compmgmt.msc # 服务和应用程序 → 服务
# 通过任务管理器打开
# 任务管理器 → 服务选项卡 → 打开服务PowerShell 服务命令
powershell
# 查看所有服务命令
Get-Command *-Service
# 常用服务命令
Get-Service # 查看服务
Start-Service # 启动服务
Stop-Service # 停止服务
Restart-Service # 重启服务
Set-Service # 配置服务
New-Service # 创建服务
Remove-Service # 删除服务命令行工具
cmd
:: sc 命令 - 服务控制
sc query :: 查看所有服务
sc start 服务名 :: 启动服务
sc stop 服务名 :: 停止服务
sc config 服务名 :: 配置服务
:: net 命令
net start :: 列出运行中的服务
net start 服务名 :: 启动服务
net stop 服务名 :: 停止服务查看服务
基本查看
powershell
# 查看所有服务
Get-Service
# 查看运行中的服务
Get-Service | Where-Object Status -eq "Running"
# 查看已停止的服务
Get-Service | Where-Object Status -eq "Stopped"
# 查看特定服务
Get-Service -Name "wuauserv"
Get-Service -DisplayName "*Windows Update*"
# 查看多个服务
Get-Service -Name "wuauserv","Spooler","Winmgmt"详细信息
powershell
# 查看服务详细信息
Get-CimInstance -ClassName Win32_Service -Filter "Name='wuauserv'" | Format-List *
# 查看服务属性
Get-CimInstance -ClassName Win32_Service |
Select-Object Name, DisplayName, State, StartMode, StartName
# 查看服务路径
Get-CimInstance -ClassName Win32_Service |
Select-Object Name, PathName | Format-Table -AutoSize
# 查看服务依赖关系
Get-Service -Name "wuauserv" | Select-Object Name, ServicesDependedOn, DependentServices
# 使用 sc 命令查看详细信息
sc qc wuauserv
sc queryex wuauserv服务状态筛选
powershell
# 查看自动启动但未运行的服务
Get-Service | Where-Object { $_.StartType -eq "Automatic" -and $_.Status -eq "Stopped" }
# 查看手动启动的服务
Get-Service | Where-Object StartType -eq "Manual"
# 查看禁用的服务
Get-Service | Where-Object StartType -eq "Disabled"
# 按显示名称排序
Get-Service | Sort-Object DisplayName | Select-Object DisplayName, Status, StartType启动和停止服务
启动服务
powershell
# 启动服务
Start-Service -Name "Spooler"
# 启动服务(使用显示名称)
Start-Service -DisplayName "Print Spooler"
# 强制启动(包括依赖服务)
Start-Service -Name "wuauserv" -Force
# 使用 net 命令
net start Spooler
# 使用 sc 命令
sc start Spooler停止服务
powershell
# 停止服务
Stop-Service -Name "Spooler"
# 强制停止
Stop-Service -Name "Spooler" -Force
# 停止服务及其依赖服务
Stop-Service -Name "wuauserv" -Force
# 使用 net 命令
net stop Spooler
# 使用 sc 命令
sc stop Spooler重启服务
powershell
# 重启服务
Restart-Service -Name "Spooler"
# 强制重启
Restart-Service -Name "Spooler" -Force
# 手动重启(先停止后启动)
Stop-Service -Name "Spooler"
Start-Service -Name "Spooler"暂停和恢复服务
powershell
# 暂停服务(如果支持)
Suspend-Service -Name "Spooler"
# 恢复暂停的服务
Resume-Service -Name "Spooler"
# 使用 sc 命令
sc pause Spooler
sc continue Spooler配置服务
设置启动类型
powershell
# 设置为自动启动
Set-Service -Name "Spooler" -StartupType Automatic
# 设置为自动(延迟启动)
Set-Service -Name "Spooler" -StartupType AutomaticDelayedStart
# 设置为手动启动
Set-Service -Name "Spooler" -StartupType Manual
# 禁用服务
Set-Service -Name "Spooler" -StartupType Disabled
# 使用 sc 命令
sc config Spooler start= auto # 自动
sc config Spooler start= delayed-auto # 延迟自动
sc config Spooler start= demand # 手动
sc config Spooler start= disabled # 禁用设置服务属性
powershell
# 设置显示名称
Set-Service -Name "Spooler" -DisplayName "打印后台处理程序"
# 设置描述
Set-Service -Name "Spooler" -Description "管理所有本地和网络打印队列并控制打印作业"
# 设置启动账户
# 注意:这需要使用 sc 命令或 WMI
sc config Spooler obj= "NT AUTHORITY\LocalService"
# 设置服务恢复选项
sc failure Spooler reset= 86400 actions= restart/5000/restart/5000/none/5000
# 参数说明:
# reset= 86400 - 重置失败计数的时间(秒)
# actions= - 失败时的操作:restart(重启)/run(运行程序)/none(无操作)
# 数字表示等待时间(毫秒)配置服务依赖关系
powershell
# 查看服务依赖
Get-Service -Name "wuauserv" | Select-Object ServicesDependedOn
# 使用 sc 命令设置依赖
sc config wuauserv depend= RpcSs/EventLog
# 清除依赖
sc config wuauserv depend= /创建和删除服务
创建服务
powershell
# 创建新服务
New-Service -Name "MyService" `
-BinaryPathName "C:\Program Files\MyApp\service.exe" `
-DisplayName "我的服务" `
-Description "这是一个自定义服务" `
-StartupType Automatic
# 使用 sc 命令创建服务
sc create MyService binPath= "C:\Program Files\MyApp\service.exe" start= auto DisplayName= "我的服务"
# 创建服务并设置参数
sc create MyService binPath= "C:\Program Files\MyApp\service.exe -param1 value1" start= auto删除服务
powershell
# 删除服务(需要先停止服务)
Stop-Service -Name "MyService"
Remove-Service -Name "MyService"
# 使用 sc 命令删除服务
sc stop MyService
sc delete MyService服务故障排查
常见服务问题
powershell
# 服务无法启动
# 1. 检查服务依赖
Get-Service -Name "wuauserv" | Select-Object ServicesDependedOn
# 2. 检查服务账户权限
sc qc wuauserv
# 3. 检查服务路径是否正确
Get-CimInstance -ClassName Win32_Service -Filter "Name='wuauserv'" | Select-Object PathName
# 4. 查看服务日志
# 事件查看器 → Windows 日志 → 系统
# 筛选事件来源:Service Control Manager查看服务日志
powershell
# 查看服务相关事件
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Service Control Manager'} -MaxEvents 20
# 查看特定服务的事件
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Service Control Manager'; Data='wuauserv'}
# 查看服务启动失败事件
Get-WinEvent -FilterHashtable @{LogName='System'; ID=7000,7001,7002} -MaxEvents 10服务恢复配置
powershell
# 查看服务恢复配置
sc qfailure Spooler
# 配置服务恢复选项
sc failure Spooler reset= 86400 actions= restart/5000/restart/5000/run/5000
sc failureflag Spooler 1 # 0=服务停止时, 1=服务崩溃时
# 配置恢复时运行的程序
sc failure Spooler actions= run/5000
sc failure Spooler command= "C:\Scripts\restart_service.bat"常用服务介绍
系统核心服务
| 服务名称 | 显示名称 | 说明 |
|---|---|---|
| Winmgmt | Windows Management Instrumentation | 系统管理服务 |
| EventLog | Windows Event Log | 事件日志服务 |
| RpcSs | Remote Procedure Call (RPC) | 远程过程调用 |
| DcomLaunch | DCOM Server Process Launcher | DCOM 服务启动器 |
| PlugPlay | Plug and Play | 即插即用服务 |
| Power | Power | 电源管理服务 |
网络服务
| 服务名称 | 显示名称 | 说明 |
|---|---|---|
| LanmanServer | Server | 文件和打印机共享 |
| LanmanWorkstation | Workstation | 网络客户端 |
| Dhcp | DHCP Client | DHCP 客户端 |
| Dnscache | DNS Client | DNS 客户端 |
| NlaSvc | Network Location Awareness | 网络位置感知 |
| WinHttpAutoProxySvc | WinHTTP Web Proxy Auto-Discovery | 代理自动发现 |
安全服务
| 服务名称 | 显示名称 | 说明 |
|---|---|---|
| WinDefend | Windows Defender | 防病毒服务 |
| MpsSvc | Windows Firewall | 防火墙服务 |
| wuauserv | Windows Update | Windows 更新 |
| EventLog | Windows Event Log | 事件日志 |
| SamSs | Security Accounts Manager | 安全账户管理器 |
可安全禁用的服务
powershell
# 打印服务(如无打印机)
Stop-Service -Name "Spooler"
Set-Service -Name "Spooler" -StartupType Disabled
# 传真服务
Stop-Service -Name "Fax"
Set-Service -Name "Fax" -StartupType Disabled
# 远程注册表服务(安全考虑)
Stop-Service -Name "RemoteRegistry"
Set-Service -Name "RemoteRegistry" -StartupType Disabled
# Windows Search(如不需要索引)
Stop-Service -Name "WSearch"
Set-Service -Name "WSearch" -StartupType Disabled服务安全
服务账户
powershell
# 查看服务运行账户
Get-CimInstance -ClassName Win32_Service |
Select-Object Name, StartName |
Where-Object { $_.StartName -ne $null }
# 常见服务账户
# LocalSystem - 系统账户,最高权限
# LocalService - 本地服务账户,受限权限
# NetworkService - 网络服务账户,可访问网络资源
# 域\用户名 - 指定用户账户
# 更改服务账户
sc config MyService obj= "NT AUTHORITY\LocalService"
# 设置服务账户密码(使用指定用户时)
sc config MyService obj= "DOMAIN\username" password= "password"服务权限
powershell
# 查看服务权限
sc sdshow wuauserv
# 服务权限说明
# D:(D;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BG) - 来宾组拒绝访问
# A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA) - 管理员完全控制
# A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY) - 系统完全控制
# A;;CCLCSWRPWPDTLOCRRC;;;SU) - 服务用户读取和启动
# 使用 sc sdset 设置权限
sc sdset wuauserv "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)"服务监控
监控服务状态
powershell
# 监控特定服务状态
while ($true) {
$service = Get-Service -Name "Spooler"
Write-Host "$(Get-Date) - Spooler 状态: $($service.Status)"
Start-Sleep -Seconds 5
}
# 检查多个服务状态
$services = @("wuauserv", "Spooler", "Winmgmt")
foreach ($svc in $services) {
$s = Get-Service -Name $svc -ErrorAction SilentlyContinue
if ($s) {
Write-Host "$svc : $($s.Status)"
} else {
Write-Host "$svc : 不存在"
}
}服务状态变更通知
powershell
# 使用 WMI 事件监控服务状态变更
$query = "SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Service'"
Register-WmiEvent -Query $query -SourceIdentifier "ServiceMonitor" -Action {
$service = $Event.SourceEventArgs.NewEvent.TargetInstance
Write-Host "服务 $($service.Name) 状态变更为: $($service.State)"
}
# 取消监控
Unregister-Event -SourceIdentifier "ServiceMonitor"批量服务管理
批量启动/停止服务
powershell
# 批量启动服务
$services = @("Spooler", "wuauserv", "Winmgmt")
foreach ($svc in $services) {
Start-Service -Name $svc -ErrorAction SilentlyContinue
Write-Host "已启动服务: $svc"
}
# 批量停止服务
$services | ForEach-Object { Stop-Service -Name $_ -Force -ErrorAction SilentlyContinue }
# 批量设置启动类型
$services = @("Fax", "RemoteRegistry")
foreach ($svc in $services) {
Set-Service -Name $svc -StartupType Disabled
Write-Host "已禁用服务: $svc"
}导出和导入服务配置
powershell
# 导出服务配置
Get-CimInstance -ClassName Win32_Service |
Select-Object Name, DisplayName, State, StartMode, StartName, PathName |
Export-Csv -Path "services_config.csv" -NoTypeInformation -Encoding UTF8
# 从 CSV 导入并配置
$services = Import-Csv -Path "services_config.csv"
foreach ($svc in $services) {
Set-Service -Name $svc.Name -StartupType $svc.StartMode -ErrorAction SilentlyContinue
}小结
本章介绍了 Windows 服务管理的主要内容:
- 服务概述:了解服务的类型和启动类型
- 管理工具:使用服务管理器、PowerShell 和命令行工具
- 查看服务:查看服务状态和详细信息
- 启动停止:启动、停止、重启和暂停服务
- 配置服务:设置启动类型和其他属性
- 创建删除:创建自定义服务和删除服务
- 故障排查:诊断和解决服务问题
- 常用服务:了解系统核心服务
- 服务安全:配置服务账户和权限
- 批量管理:批量操作和监控服务
建议:
- 不要随意禁用系统核心服务
- 修改服务配置前先备份
- 定期检查服务运行状态
- 使用适当的账户运行服务
- 关注服务相关的系统事件
