Windows 默认开启了大量后台服务,其中很多对普通用户来说完全用不上,却在默默消耗 CPU、内存和硬盘。这篇文章分享一个用 PowerShell 写的交互式服务管理脚本,帮你安全、逐一地决定每个服务的命运。
为什么要优化 Windows 服务?
默认安装的 Windows 会运行几十个后台服务。其中有些相当”多余”:
DiagTrack(遥测服务):持续向微软发送使用数据,既占带宽又涉及隐私
SysMain(Superfetch):为机械硬盘设计的预读缓存,SSD 用户完全不需要
Spooler(打印后台):没有打印机却一直跑,还是历史上被攻击次数最多的服务之一
RemoteRegistry:允许远程修改注册表,安全隐患明显
关掉这些服务,日常使用完全不受影响,但系统响应速度、隐私保护和安全性都能得到提升。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Host ([char]0x9519+[char]0x8BEF+[char]0xFF1A+[char]0x8BF7+[char]0x4EE5+[char]0x7BA1+[char]0x7406+[char]0x5458+[char]0x8EAB+[char]0x4EFD+[char]0x8FD0+[char]0x884C+[char]0x6B64+[char]0x811A+[char]0x672C+[char]0xFF01) -ForegroundColor Red Pause Exit }
$services = @( @{Name="DiagTrack"; Desc=([char]0x8BCA+[char]0x65AD+[char]0x8DDF+[char]0x8E2A+[char]0xFF0F+[char]0x9065+[char]0x6D4B+[char]0x6570+[char]0x636E+[char]0x6536+[char]0x96C6); Suggest=([char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528+[char]0xFF08+[char]0x4FDD+[char]0x62A4+[char]0x9690+[char]0x79C1+[char]0xFF09)}, @{Name="dmwappushservice"; Desc=("WAP"+[char]0x63A8+[char]0x9001+[char]0x6D88+[char]0x606F+[char]0x8DEF+[char]0x7531+[char]0x670D+[char]0x52A1); Suggest=([char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528)}, @{Name="WSearch"; Desc=("Windows"+[char]0x641C+[char]0x7D22+[char]0xFF08+[char]0x6587+[char]0x4EF6+[char]0x7D22+[char]0x5F15+[char]0xFF09); Suggest=([char]0x53EF+[char]0x9009+[char]0xFF08+[char]0x673A+[char]0x5668+[char]0x8F83+[char]0x6162+[char]0x65F6+[char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528+[char]0xFF09)}, @{Name="SysMain"; Desc=("SysMain"+[char]0xFF08+"Superfetch"+[char]0x9884+[char]0x8BFB+[char]0x7F13+[char]0x5B58+[char]0xFF09); Suggest=([char]0x4F7F+[char]0x7528+"SSD"+[char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528)}, @{Name="Spooler"; Desc=([char]0x6253+[char]0x5370+[char]0x673A+[char]0x540E+[char]0x53F0+[char]0x5904+[char]0x7406+[char]0x7A0B+[char]0x5E8F); Suggest=([char]0x65E0+[char]0x6253+[char]0x5370+[char]0x673A+[char]0x65F6+[char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528)}, @{Name="WbioSrvc"; Desc=("Windows"+[char]0x751F+[char]0x7269+[char]0x8BC6+[char]0x522B+[char]0x670D+[char]0x52A1+[char]0xFF08+[char]0x6307+[char]0x7EB9+"/"+[char]0x4EBA+[char]0x8138+[char]0xFF09); Suggest=([char]0x65E0+[char]0x76F8+[char]0x5173+[char]0x786C+[char]0x4EF6+[char]0x65F6+[char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528)}, @{Name="RemoteRegistry"; Desc=([char]0x8FDC+[char]0x7A0B+[char]0x6CE8+[char]0x518C+[char]0x8868+[char]0x8BBF+[char]0x95EE+[char]0x670D+[char]0x52A1); Suggest=([char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528+[char]0xFF08+[char]0x63D0+[char]0x5347+[char]0x5B89+[char]0x5168+[char]0x6027+[char]0xFF09)}, @{Name="PcaSvc"; Desc=([char]0x7A0B+[char]0x5E8F+[char]0x517C+[char]0x5BB9+[char]0x6027+[char]0x52A9+[char]0x624B+[char]0x670D+[char]0x52A1); Suggest=([char]0x53EF+[char]0x9009)} )
$startTypeMap = @{ "Automatic" = ([char]0x81EA+[char]0x52A8) "Manual" = ([char]0x624B+[char]0x52A8) "Disabled" = ([char]0x5DF2+[char]0x7981+[char]0x7528) "AutomaticDelayedStart" = ([char]0x81EA+[char]0x52A8+[char]0xFF08+[char]0x5EF6+[char]0x8FDF+[char]0x542F+[char]0x52A8+[char]0xFF09) }
$statusMap = @{ "Running" = ([char]0x8FD0+[char]0x884C+[char]0x4E2D) "Stopped" = ([char]0x5DF2+[char]0x505C+[char]0x6B62) "Paused" = ([char]0x5DF2+[char]0x6682+[char]0x505C) "Starting" = ([char]0x6B63+[char]0x5728+[char]0x542F+[char]0x52A8) "Stopping" = ([char]0x6B63+[char]0x5728+[char]0x505C+[char]0x6B62) }
Write-Host "==============================================" -ForegroundColor Cyan Write-Host (" "+("Windows"+[char]0x670D+[char]0x52A1+[char]0x7BA1+[char]0x7406+[char]0x5DE5+[char]0x5177)+" ") -ForegroundColor Cyan Write-Host "==============================================" -ForegroundColor Cyan
foreach ($svc in $services) { Write-Host "`n"+([char]0x670D+[char]0x52A1+[char]0x540D+[char]0x79F0+[char]0xFF1A) -NoNewline Write-Host $svc.Desc -ForegroundColor White Write-Host ([char]0x4F18+[char]0x5316+[char]0x5EFA+[char]0x8BAE+[char]0xFF1A) -NoNewline Write-Host $svc.Suggest -ForegroundColor Yellow
$current = Get-Service -Name $svc.Name -ErrorAction SilentlyContinue if (-not $current) { Write-Host ([char]0x5F53+[char]0x524D+[char]0x72B6+[char]0x6001+[char]0xFF1A+[char]0x6B64+[char]0x7CFB+[char]0x7EDF+[char]0x672A+[char]0x627E+[char]0x5230+[char]0x8BE5+[char]0x670D+[char]0x52A1+[char]0xFF0C+[char]0x8DF3+[char]0x8FC7+[char]0x3002) -ForegroundColor Gray continue }
$stCN = if ($startTypeMap["$($current.StartType)"]) { $startTypeMap["$($current.StartType)"] } else { "$($current.StartType)" } $stsCN = if ($statusMap["$($current.Status)"]) { $statusMap["$($current.Status)"] } else { "$($current.Status)" }
Write-Host (([char]0x5F53+[char]0x524D+[char]0x72B6+[char]0x6001+[char]0xFF1A+"[")+([char]0x542F+[char]0x52A8+[char]0x7C7B+[char]0x578B+[char]0xFF1A)+$stCN+"] ["+([char]0x8FD0+[char]0x884C+[char]0x72B6+[char]0x6001+[char]0xFF1A)+$stsCN+"]")
$choice = Read-Host ([char]0x8BF7+[char]0x9009+[char]0x62E9+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+"[1] "+[char]0x7981+[char]0x7528+" [2] "+[char]0x542F+[char]0x7528+" [3] "+[char]0x8DF3+[char]0x8FC7)
switch ($choice) { "1" { Write-Host ([char]0x6267+[char]0x884C+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+[char]0x6B63+[char]0x5728+[char]0x7981+[char]0x7528+"...") -ForegroundColor Green Set-Service -Name $svc.Name -StartupType Disabled -ErrorAction SilentlyContinue Stop-Service -Name $svc.Name -Force -ErrorAction SilentlyContinue Write-Host ([char]0x6267+[char]0x884C+[char]0x7ED3+[char]0x679C+[char]0xFF1A+[char]0x5DF2+[char]0x7981+[char]0x7528+[char]0x5E76+[char]0x505C+[char]0x6B62+[char]0x670D+[char]0x52A1+[char]0x3002) -ForegroundColor Green } "2" { Write-Host ([char]0x6267+[char]0x884C+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+[char]0x6B63+[char]0x5728+[char]0x542F+[char]0x7528+"...") -ForegroundColor Green Set-Service -Name $svc.Name -StartupType Automatic -ErrorAction SilentlyContinue Start-Service -Name $svc.Name -ErrorAction SilentlyContinue Write-Host ([char]0x6267+[char]0x884C+[char]0x7ED3+[char]0x679C+[char]0xFF1A+[char]0x5DF2+[char]0x542F+[char]0x7528+[char]0x5E76+[char]0x542F+[char]0x52A8+[char]0x670D+[char]0x52A1+[char]0x3002) -ForegroundColor Green } "3" { Write-Host ([char]0x6267+[char]0x884C+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+[char]0x5DF2+[char]0x8DF3+[char]0x8FC7+[char]0x3002) -ForegroundColor Gray } default { Write-Host ([char]0x6267+[char]0x884C+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+[char]0x8F93+[char]0x5165+[char]0x65E0+[char]0x6548+[char]0xFF0C+[char]0x81EA+[char]0x52A8+[char]0x8DF3+[char]0x8FC7+[char]0x3002) -ForegroundColor Red } } }
Write-Host "`n==============================================" -ForegroundColor Cyan Write-Host ([char]0x5B8C+[char]0x6210+[char]0xFF01+[char]0x5EFA+[char]0x8BAE+[char]0x91CD+[char]0x542F+[char]0x7535+[char]0x8111+[char]0x4EE5+[char]0x4F7F+[char]0x66F4+[char]0x6539+[char]0x751F+[char]0x6548+[char]0x3002) -ForegroundColor Cyan Write-Host "==============================================" -ForegroundColor Cyan Read-Host ([char]0x6309+" Enter "+[char]0x952E+[char]0x9000+[char]0x51FA)
|
使用方法:
1.将代码保存为 ServiceOptimizer.ps1。
2.打开 PowerShell(管理员),执行:
powershellpowershell -ExecutionPolicy Bypass -File “.\ServiceOptimizer.ps1”
如果想永久调整执行策略,可以先运行:
powershellSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
之后直接双击或 .\ServiceOptimizer.ps1 即可。
也可以右键文件,先解除安全限制,再打开和上述效果一致
3.脚本会逐个弹出服务信息,输入 1(禁用)、2(启用)或 3(跳过),回车确认。全部完成后重启电脑。
脚本需要管理员权限才能修改服务状态
禁用服务前请确认自己确实用不到(例如:禁用 Spooler 前确认没有打印需求)
所有操作均可通过选择 [2] 启用 恢复,不会造成永久损坏
修改完成后建议重启以确保设置生效