Skip to content

服务管理

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"

常用服务介绍

系统核心服务

服务名称显示名称说明
WinmgmtWindows Management Instrumentation系统管理服务
EventLogWindows Event Log事件日志服务
RpcSsRemote Procedure Call (RPC)远程过程调用
DcomLaunchDCOM Server Process LauncherDCOM 服务启动器
PlugPlayPlug and Play即插即用服务
PowerPower电源管理服务

网络服务

服务名称显示名称说明
LanmanServerServer文件和打印机共享
LanmanWorkstationWorkstation网络客户端
DhcpDHCP ClientDHCP 客户端
DnscacheDNS ClientDNS 客户端
NlaSvcNetwork Location Awareness网络位置感知
WinHttpAutoProxySvcWinHTTP Web Proxy Auto-Discovery代理自动发现

安全服务

服务名称显示名称说明
WinDefendWindows Defender防病毒服务
MpsSvcWindows Firewall防火墙服务
wuauservWindows UpdateWindows 更新
EventLogWindows Event Log事件日志
SamSsSecurity 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 服务管理的主要内容:

  1. 服务概述:了解服务的类型和启动类型
  2. 管理工具:使用服务管理器、PowerShell 和命令行工具
  3. 查看服务:查看服务状态和详细信息
  4. 启动停止:启动、停止、重启和暂停服务
  5. 配置服务:设置启动类型和其他属性
  6. 创建删除:创建自定义服务和删除服务
  7. 故障排查:诊断和解决服务问题
  8. 常用服务:了解系统核心服务
  9. 服务安全:配置服务账户和权限
  10. 批量管理:批量操作和监控服务

建议:

  • 不要随意禁用系统核心服务
  • 修改服务配置前先备份
  • 定期检查服务运行状态
  • 使用适当的账户运行服务
  • 关注服务相关的系统事件