安安茶茶

没有谁会为你踏雪而来,喜欢的风景要躬亲筚路。人生有什么意义,接受赠予+22181803=VQ

  博客园  :: 首页  :: 新随笔  :: 联系 ::  :: 管理

windows11任务管理器服务显示不出来,其他正常,services.msc能显示的问题处理

核心病因复盘

Windows 任务管理器服务列表空白,本质上是 SYSTEM\CurrentControlSet\Services 注册表中的服务项数据发生畸变,导致 WMI 引擎(Win32_Service 提供程序)在全量扫描时踩空崩溃

WMI 崩溃后,会导致其底层数据库(Repository)文件被锁死或直接损坏。此时在正常系统下无论怎么重启服务,它吐给任务管理器的永远是泛泛的 常规故障 (0x80041001)

📋 黄金排查与修复 SOP(含全套脚本)

第一步:交叉验证,锁定病灶

当发现服务列表空白时,首先在管理员权限的 PowerShell 中运行此命令,确认是否为 WMI 通道单方面假死:

PowerShell
 
Write-Host "检查原生 SCM 通道..." -ForegroundColor Cyan
Get-Service | Select-Object -First 3

Write-Host "检查 WMI 通道..." -ForegroundColor Cyan
Get-CimInstance -ClassName Win32_Service | Select-Object -First 3
  • 结果判定:如果 Get-Service 能吐出服务,而 Get-CimInstance 报错,百分之百是注册表脏数据卡死了 WMI。

第二步:运行“终极盲区雷达”脚本(揪出内鬼)

在管理员权限的 PowerShell 中运行以下全量审计脚本。它会自动扫描并揪出所有“完全空壳项”“核心键缺失项”以及“类型畸变项(如把 DWord 写成 QWord/Binary)”。

PowerShell
 
Clear-Host
$servicesPath = "SYSTEM\CurrentControlSet\Services"
$rootKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($servicesPath)
$subKeyNames = $rootKey.GetSubKeyNames()

Write-Host "====== 正在启动【终极盲区雷达】全量审计 ======" -ForegroundColor Cyan
$anomalyCount = 0

foreach ($name in $subKeyNames) {
    $subKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("$servicesPath\$name")
    if ($null -eq $subKey) { continue }
    
    $valueNames = $subKey.GetValueNames()
    $subKeys = $subKey.GetSubKeyNames()
    
    # 1. 检查完全空壳的僵尸项
    if ($valueNames.Count -eq 0 -and $subKeys.Count -eq 0) {
        Write-Host "[疑似僵尸项] 服务名: $name (该项完全为空,没有任何键值和子项!)" -ForegroundColor Yellow
        $anomalyCount++
        $subKey.Close(); continue
    }
    
    if ($valueNames.Count -gt 0) {
        $hasStart = $valueNames -contains "Start"
        $hasType = $valueNames -contains "Type"
        
        # 2. 检查部分残缺(缺乏核心键)
        if (-not $hasStart -or -not $hasType) {
            Write-Host "[严重残缺] 服务项: $name | 缺失核心键: " -NoNewline -ForegroundColor Red
            if (-not $hasStart) { Write-Host "[Start] " -NoNewline -ForegroundColor Yellow }
            if (-not $hasType) { Write-Host "[Type] " -NoNewline -ForegroundColor Yellow }
            Write-Host "(导致 WMI 映射时发生空指针常规故障!)" -ForegroundColor Red
            $anomalyCount++
        }
        
        # 3. 检查严苛的强类型畸变
        foreach ($vName in $valueNames) {
            try {
                $kind = $subKey.GetValueKind($vName)
                if (@("Start", "Type", "ErrorControl", "DelayedAutoStart", "ServiceSidType", "Tag") -contains $vName) {
                    if ($kind -ne 'DWord') {
                        Write-Host "[类型畸变] 服务项: $name | 键名: $vName | 当前类型: $kind (预期应为 DWord!)" -ForegroundColor Red
                        $anomalyCount++
                    }
                }
                if (@("DisplayName", "ImagePath", "ObjectName", "Description", "Group") -contains $vName) {
                    if ($kind -ne 'String' -and $kind -ne 'ExpandString') {
                        Write-Host "[类型畸变] 服务项: $name | 键名: $vName | 当前类型: $kind (预期应为 String/ExpandString!)" -ForegroundColor Red
                        $anomalyCount++
                    }
                }
                if (@("DependOnService", "RequiredPrivileges") -contains $vName) {
                    if ($kind -ne 'MultiString') {
                        Write-Host "[类型畸变] 服务项: $name | 键名: $vName | 当前类型: $kind (预期应为 MultiString!)" -ForegroundColor Red
                        $anomalyCount++
                    }
                }
            } catch {}
        }
    }
    $subKey.Close()
}
$rootKey.Close()
Write-Host "`n====== 审计完毕:共捕获到 $anomalyCount 处隐藏异常 ======" -ForegroundColor Cyan

第三步:针对性修复数据

根据第二步雷达扫出的红字/黄字结果,采取对症下药的策略:

  1. 对于[疑似僵尸项]:可以直接去注册表 HKLM\SYSTEM\CurrentControlSet\Services 下右键把整个同名文件夹删掉。

  2. 对于[严重残缺]或[类型畸变]:不能盲目删除(因为可能是显卡驱动或系统核心网络组件如 P9NP)。运行以下安全补全脚本,为它们赋予合法合规的 DWord 强类型默认值:

PowerShell
 
# 把下面数组里的名字,替换为雷达扫出来的残缺服务名
$targets = @("P9NP", "RDPNP", "nvlddmkm", "360AntiExploit") 

Write-Host "开始执行安全属性补全..." -ForegroundColor Cyan
foreach ($name in $targets) {
    $path = "HKLM:\SYSTEM\CurrentControlSet\Services\$name"
    if (Test-Path $path) {
        # 智能分流默认值:软件残留默认禁用(4),驱动和核心组件默认手动(3)+内核(1)
        $defaultStart = 3; $defaultType = 1
        if ($name -like "360*" -or $name -like "clr_optimization*") { $defaultStart = 4; $defaultType = 16 }

        # 强行重置/修复为正确的 DWord 强类型
        Set-ItemProperty -Path $path -Name Start -Value $defaultStart -Type DWord -Force -ErrorAction SilentlyContinue
        Set-ItemProperty -Path $path -Name Type -Value $defaultType -Type DWord -Force -ErrorAction SilentlyContinue
        Write-Host "[√] 服务项 $name 已成功对齐标准数据格式!" -ForegroundColor Green
    }
}

第四步:环境隔离,物理超度(终结死锁)

由于注册表脏数据曾反复冲击 WMI 导致其数据库损坏、文件被底层强锁,在正常 Windows 状态下是无法重置干净的。必须利用环境隔离:

  1. 进入安全模式:按住 Shift 键点击系统“重启” → 疑难解答 → 高级选项 → 启动设置 → 重启 → 按 4F4 进入安全模式(或直接用 PE U盘启动)。

  2. 毁灭旧数据库:在安全模式(或 PE)下,以管理员身份打开 PowerShell/CMD,运行以下两行命令:

    PowerShell
     
    net stop winmgmt /y
    Remove-Item -Path "C:\Windows\System32\wbem\Repository" -Recurse -Force
    
  3. 正常重启电脑。Windows 在开机时发现旧数据库彻底消失,会根据你已经修复完美的纯净注册表,被迫从零重新生成一个 100% 完美的全新 WMI 数据库

💡 核心避坑心得

  1. Windows 的“常规故障”通常都在帮流氓软件或奇葩驱动的“脏数据”背黑锅。

  2. 遇到底层系统文件拒绝访问、重命名失败时,果断走安全模式或 PE,不要在正常应用层浪费时间死磕进程锁。

posted on 2026-06-23 13:04  长虫山小木屋  阅读(11)  评论(0)    收藏  举报