Windows 系统图标通常存储在以下位置:件路径:C:\Windows\System32\imageres.dll 核心定位:Windows 现代系统内置标准图标资源库,替代早期 shell32.dll 承载大量现代风格 PNG/ICO 图标、系统位图资源

imageres.dll 完整解构

文件路径:C:\Windows\System32\imageres.dll 适用系统:Win10 / Win11 / Server2016~2025 核心定位:Windows 现代系统内置标准图标资源库,替代早期 shell32.dll 承载大量现代风格 PNG/ICO 图标、系统位图资源

一、底层原理

imageres.dll 属于资源 DLL(纯资源 DLL),内部不包含可执行代码,仅打包嵌入式资源:RT_GROUP_ICON、RT_ICON、RT_BITMAP 等。

  1. 资源组织:内部使用资源 ID 索引(如imageres.dll,-1001),资源内置多 DPI 适配版本(100%/125%/150%/200% 等),适配高分屏。
  2. 调用模型:Shell/Explorer、UWP 组件、系统对话框不直接执行 dll 内代码,通过 Win32 资源 API 读取资源:
    • LoadLibraryEx(仅加载资源,不执行入口)
    • FindResource / LoadResource / LockResource
    • SHGetIconLocation / IExtractIcon(传统图标加载链路)
  3. 和 shell32 分工:
    • shell32.dll:大量老式经典图标 + Shell 核心业务代码
    • imageres.dll:Win10 之后新增现代扁平化图标、大量系统状态图标(网络、电源、音量、快捷方式等)

👉 前面 lnk 快捷方式无箭头方案就是引用 imageres.dll,-1001

二、依赖文件

imageres.dll 本身无代码依赖(纯资源 dll),但读取渲染它的组件有依赖

  1. 直接关联系统库(读取 / 渲染图标时加载)
    • kernel32.dll / kernelbase.dll:LoadLibraryEx、资源加载基础 API
    • user32.dll / gdi32.dll / gdiplus.dll:位图、图标渲染
    • shimgvw.dll:IExtractIcon 图标提取 COM 组件(Explorer 用)
    • shell32.dll:Shell 资源解析、图标调度
  2. UWP 场景额外依赖
    • winrrm.dll:Windows 资源管理器,UWP 读取 imageres 图标资源
  3. 配套缓存载体(不是 dll 依赖,是上层 Shell 缓存)
    • iconcache_*.db:传统桌面图标缓存
    • tiledb.sqlite:UWP 磁贴缓存

三、依赖关系

正向调用链路(正常加载 imageres 图标)

explorer.exe / 系统对话框 / 设置APP
        ↓
SHGetIconLocation / IExtractIcon
        ↓
LoadLibraryEx(imageres.dll, LOAD_LIBRARY_AS_DATAFILE)
        ↓
FindResource 根据资源ID取出ICO/PNG资源
        ↓
GDI/GDIPlus渲染位图 → 写入IconCache → 界面展示

反向依赖说明

  1. imageres.dll 不依赖任何其他 dll 运行,可以单独被资源查看工具读取;
  2. imageres.dll丢失 / 损坏 → 凡是引用它的图标全部回退白色通用占位图标(全局大面积白图标典型诱因);
  3. 32 位环境下存在 C:\Windows\SysWOW64\imageres.dll,独立 32 位版本,和 64 位互不通用。

四、逻辑链路(故障链路重点,对接之前图标故障 SOP)

✅ 正常链路: 注册表 DefaultIcon = imageres.dll,-1001 → Shell 加载 imageres 资源 → 渲染图标 → 写入 iconcache ❌ 故障链路: imageres.dll 损坏 / 缺失 / 权限拒绝 → LoadResource 失败 → Shell 无法获取位图 → 渲染白色空白图标

现象特征:大量系统自带图标空白,不仅仅是快捷方式,sfc/dism 可修复。

五、配套链(注册表、工具、关联组件)

项目 说明
HKCR\lnkfile\DefaultIcon 可配置指向 imageres.dll 资源 ID,用于快捷方式图标
HKCR\exefile\DefaultIcon 部分环境配置 imageres 系统图标
Shell 资源提取组件 shimgvw.dll Explorer 提取 imageres 图标核心 COM
sfc /scannow 修复损坏 imageres.dll 的原生工具
DISM /Online /Cleanup-Image /RestoreHealth 从 Windows 映像还原原始 imageres.dll
ResourceHacker / 7-Zip 可直接打开 imageres.dll 浏览内部图标资源
组策略 DefaultAssociations.xml 若 ProgId 关联 DefaultIcon 指向 imageres,全局图标受此控制

六、边界(关键限制 & 坑点)

  1. ✅ 纯资源 DLL:没有 DllMain 业务逻辑,无法导出函数,不能直接作为 COM 组件,仅用来存图片资源;
  2. ✅ 版本差异:Win10 1607、1903、Win11 imageres 内部资源 ID、图标样式不一样,跨版本直接复用资源 ID 会图标异常;
  3. ✅ 位数隔离:SysWOW64(32bit)和 System32(64bit)两套独立 imageres,32 位程序只会读取 wow64 下版本;
  4. ✅ 权限边界:如果 imageres.dll 的 NTFS 权限阻止 explorer 读取,直接出现全局白图标;
  5. ✅ 和 UWP 资源区分:UWP 优先读取 Appx 包内 Assets 图片,不会优先使用 imageres,只有系统原生控件才调用 imageres;
  6. ❌ 不支持动态修改:直接替换 imageres.dll 需要 PE 签名 + 权限,常规美化工具不推荐直接修改该文件,极易触发 SFC 修复、系统异常;
  7. ❌ IconCache 只缓存解析后的位图,不缓存 imageres.dll 本身,dll 损坏时哪怕缓存存在,刷新后依然白图标。

七、配套校验 & 修复命令

# 校验文件完整性
sfc /scannow
DISM /Online /Cleanup-Image /RestoreHealth
# 查看文件信息
Get-Item C:\Windows\System32\imageres.dll | Select Name,Length,FileVersionInfo
# 资源引用示例(lnk无箭头图标)
# imageres.dll,-1001

目录

  1. imageres.dll 常用资源 ID 速查表(Win10/Win11 主流可用)
  2. shell32.dll 和 imageres.dll 功能对比表
  3. 资源 DLL 通用故障排查 SOP(运维标准流程)

⚠️ 重要前置备注:资源 ID 在 Win7、Win10、Win11 版本之间存在差异;Win10 1903 之后部分资源迁移至 *.mun 文件(SystemResources 目录);引用格式:dll路径,-资源ID,示例 imageres.dll,-1001


1. imageres.dll 常用资源 ID 速查表

资源 ID 图标含义 典型使用场景 备注
-2 此电脑 / 计算机 桌面、资源管理器 Win10 + 现代风格 PC 图标
-3 回收站(空) 桌面回收站  
-4 回收站(满) 桌面回收站  
-10 可移动磁盘 U 盘、移动硬盘图标  
-29 快捷方式小箭头叠加图标 Shell Icons 覆盖 经典快捷箭头
-1001 空白透明图标 去除快捷方式箭头(高频) 运维美化最常用
-113 普通文件夹 资源管理器文件夹  
-183 回收站 新版统一回收站 部分版本复用
-197 空白占位图标 Shell 自定义覆盖 部分环境替代 1001 去箭头
-201 文档文件夹 用户文档目录  
-250 设置齿轮图标 Windows 设置、控制面板  
-251 电源 / 电池图标 任务栏电池指示器 笔记本电源状态
-252 网络 WiFi 图标 任务栏无线网络  
-253 有线网络图标 任务栏以太网  
-254 音量喇叭图标 任务栏音量  
-275 UAC 安全盾牌 高权限程序叠加图标  
-306 警告感叹号 系统弹窗警告  
-307 信息提示 i 图标 通知提示  
-308 错误红色叉号 报错弹窗  
-309 问号帮助 帮助对话框  
-401 控制面板 设置入口图标  

补充说明:

  1. 任务栏原生网络、音量部分新版系统实际由 stobject.dllpnidui.dll 承载,imageres 主要用于资源管理器内静态图标
  2. 查看 DLL 资源工具:ResourceHacker、IconsExtract
  3. 注册表引用示例:reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,-1001" /f

2. shell32.dll 和 imageres.dll 功能对比表

对比项 shell32.dll imageres.dll
文件定位 C:\Windows\System32\shell32.dll C:\Windows\System32\imageres.dll
核心属性 业务代码 DLL + 老式图标资源,包含大量 Shell 导出函数、COM 接口 纯资源 DLL,无业务可执行代码,仅存储图标 / 位图资源
诞生时代 Windows95 起核心 Shell 库 Vista 新增,承接现代高 DPI 图标
图标风格 经典老式图标,低分辨率兼容旧程序 Fluent 扁平化、多 DPI 自适应(100%~200%+)
主要承载资源 老式文件夹、打印机、网上邻居、传统对话框图标 此电脑、回收站、齿轮、电池、网络、现代系统状态图标
调用主体 explorer、旧版软件、传统 COM 组件 资源管理器、新版设置、现代系统 UI
损坏影响 严重:资源管理器崩溃、文件关联失效、大量基础功能异常 大量系统图标变白 / 占位空白,但 explorer 一般不会崩溃
版本迁移 长期保留,维持向下兼容 Win10 1903 后部分资源迁移至 SystemResources 下.mun
典型引用 shell32.dll,-15(标准快捷箭头) imageres.dll,-1001(透明空白图标)
32 位独立文件 SysWOW64 存在独立 32 位版本 SysWOW64 存在独立 32 位版本

3. 资源 DLL 通用故障排查 SOP(imageres/shell32/moricons 等纯资源 DLL 通用)

适用现象:系统图标空白、白图标、对话框图标缺失、自定义图标配置不生效;不适用 UWP Tile 图标故障 核心判定前置:故障特征为多处系统内置图标统一异常,而不是仅个别第三方软件图标异常

Step1:基础现象与范围判定

  1. 确认影响范围:单用户 / 整机所有用户 / 域内批量机器
    • 单用户异常 → 优先缓存、用户配置权限
    • 所有用户均异常 → 资源 DLL 本身、系统映像、组策略
  2. 区分:是否仅自定义 lnk 图标异常,还是系统自带【此电脑 / 回收站 / 控制面板】图标也变白
    • 系统内置图标空白 → 高度怀疑 imageres/shell32 损坏或无法读取
  3. 快速新建本地管理员账号测试,区分用户级问题和系统级问题

Step2:校验资源 DLL 文件基础状态

  1. 校验文件是否存在、大小不为 0
# 校验imageres
Get-Item C:\Windows\System32\imageres.dll
Get-Item C:\Windows\SysWOW64\imageres.dll
  1. 校验 NTFS 权限:确认NT AUTHORITY\SYSTEMAdministrators、当前用户具备读取权限
  2. 校验数字签名(文件被篡改、恶意替换高发)
Get-AuthenticodeSignature C:\Windows\System32\imageres.dll

✅ 状态为Valid签名正常;❌ 签名失效 / 未知 → 文件被篡改,进入系统修复

Step3:系统文件完整性修复(核心步骤)

管理员终端执行

sfc /scannow
DISM /Online /Cleanup-Image /RestoreHealth

sfc 失败时优先执行 DISM,从微软在线映像拉取原版文件

Step4:清理图标缓存(资源 DLL 完好但渲染缓存异常)

@echo off
taskkill /f /im explorer.exe
del /f /q %localappdata%\Microsoft\Windows\Explorer\iconcache_*.db
start explorer.exe

✅ 缓存重建后图标恢复 → 闭环;❌ 依旧空白 → 进入下一步

Step5:校验注册表 DefaultIcon / ShellIcons 配置

  1. 检查 HKCR\lnkfile\DefaultIconHKCR\exefile\DefaultIconHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons
  2. 验证资源 DLL 引用 ID 是否存在、DLL 路径有效
  3. 域环境执行gpresult /h C:\gpo.html,排查 GPO 注册表偏好覆盖

Step6:深度抓包定位(ProcMon)

过滤器:explorer.exe + CreateFile / LoadLibrary + RegQueryValue + Result != SUCCESS 典型捕获结果:

  • CreateFile NAME NOT FOUND → DLL 丢失
  • CreateFile ACCESS DENIED → 权限不足无法读取资源 DLL
  • RegQueryValue NOT FOUND → DefaultIcon 注册表缺失

Step7:兜底修复与边界判定

  1. 若为.mun资源(新版 Win10/11):资源不在 imageres.dll 内,直接修复 SystemResources 目录文件
  2. 禁止网上单独下载 dll 直接覆盖系统文件,极易签名失效、触发 SFC 反复回滚
  3. 干净启动(msconfig)排查第三方 Shell 扩展干扰图标加载

Step8:故障闭环归档

记录:影响范围、是否资源 DLL 损坏 / 注册表异常 / 缓存问题、修复命令、是否域 GPO 导致

快速判定速查表

现象 根因方向
所有用户,此电脑 / 回收站图标全部空白 imageres.dll 损坏、签名失效、权限拒绝
仅快捷方式变白,系统自带图标正常 lnkfile DefaultIcon 注册表异常
清理 iconcache 立刻恢复,重启后复现 异常关机 / 安全软件破坏缓存
手动修复注册表,几分钟自动变回错误值 域 GPO 注册表偏好强制覆盖
仅 UWP 磁贴空白,系统图标正常 不属于资源 DLL 故障,走 Tile/Appx 修复流程

目录

  1. mun 资源文件(SystemResources)完整解构 + 资源 ID 速查表
  2. 图标故障一键综合检测脚本(集成资源 DLL 签名校验 + 缓存 + 注册表)
  3. 域环境批量检测 imageres/shell32 完整性脚本(WinRM 远程批量巡检)

前置重要说明 .mun = Modern Universal Resource File,Win10 1903+、Win11 引入,逐步替代 imageres.dll/shell32.dll 内图标资源 路径:C:\Windows\SystemResources\*.mun 本质:专门剥离出来的纯资源 PE 文件,不再内嵌在主 exe/dll 中;同样使用 资源ID 索引,引用格式示例:@%SystemRoot%\SystemResources\imageres.dll.mun,-2


1. mun 资源文件(SystemResources)解构 + 资源 ID 速查表

1.1 底层原理

  • 文件类型:纯资源 PE 文件,无 DllMain、无导出函数,仅包含 RT_GROUP_ICON / RT_ICON / RT_BITMAP,支持多 DPI 变体(100/125/150/200%)
  • 诞生背景:Win10 1903 开始微软拆分系统资源,将 UI 图标、字符串从 imageres.dll、shell32.dll 剥离为独立.mun,便于独立更新、降低系统组件耦合、适配 Fluent Design
  • 加载链路
explorer.exe / Shell / 设置APP
        ↓
SHGetIconLocation / IExtractIcon
        ↓
LoadLibraryEx(xxx.mun, LOAD_LIBRARY_AS_DATAFILE)
        ↓
FindResource + 资源ID读取图标位图
        ↓
GDI渲染 → 写入iconcache_*.db / tiledb.sqlite
  • 和旧资源 DLL 区别
    • imageres.dll:Vista~Win10 早期一体资源 DLL
    • imageres.dll.mun:Win10 1903+ 现代独立资源包,新版系统优先读取 mun,不再读取 dll 内部图标
    • ⚠️ 重大坑:旧注册表直接写 imageres.dll,-xxx 在新版 Win11 会失效!必须改为 imageres.dll.mun,-xxx

1.2 依赖文件 & 配套链

  • 基础 API:kernelbase.dll、user32.dll、gdi32.dll、gdiplus.dll
  • Shell 提取组件:shimgvw.dll、shell32.dll
  • 缓存:iconcache_*.db(传统)、tiledb.sqlite(UWP)
  • 校验修复:sfc /scannow、DISM

1.3 边界约束

  1. 32 位系统无 mun 机制,仅 x64 Win10 1903+/Win11 存在
  2. mun 有数字签名,直接替换篡改会签名失效,sfc 自动回滚
  3. 资源 ID 和老 imageres 大部分保持兼容,但少量 ID 映射变更
  4. SysWOW64 不存在 mun 文件,32 位程序依然读取 SysWOW64\imageres.dll
  5. 部分组件使用shell32.dll.munpnidui.dll.munstobject.dll.mun

1.4 高频 mun 资源 ID 速查表(imageres.dll.mun,Win10 22H2 / Win11 通用)

标准引用写法示例:@%SystemRoot%\SystemResources\imageres.dll.mun,-1001 | 资源 ID | 图标含义 | 典型场景 | 备注 | |---|---|---|---| | -2 | 此电脑 | 桌面、资源管理器 | 高频 | | -3 | 回收站(空) | 桌面 | | | -4 | 回收站(满) | 桌面 | | | -10 | 可移动磁盘 | U 盘 | | | -29 | 快捷方式小箭头 | Shell 图标覆盖 | 经典箭头 | | -1001 | 透明空白图标 | 去除快捷箭头(运维高频) | 新版 Win11 必须用 mun | | -113 | 普通文件夹 | 资源管理器 | | | -250 | 设置齿轮 | Windows 设置 | | | -251 | 电池 / 电源 | 任务栏电源 | | | -252 | WIFI 无线网络 | 任务栏网络 | | | -253 | 有线以太网 | 任务栏网络 | | | -254 | 音量喇叭 | 任务栏音量 | | | -275 | UAC 盾牌 | 高权限叠加图标 | | | -306 | 警告感叹号 | 系统弹窗 | | | -307 | 信息提示 i | 通知弹窗 | | | -308 | 红色错误叉号 | 报错弹窗 | | | -309 | 问号帮助 | 帮助对话框 | |

1.5 其他常见 mun 清单

文件名 用途
shell32.dll.mun 老式 Shell 基础图标
pnidui.dll.mun 网络状态托盘图标
stobject.dll.mun 音量 / 网络托盘
spnet.dll.mun 网络相关图标

1.6 查看 mun 资源工具

ResourceHacker、IconsExtract、Visual Studio 资源查看器


2. 图标故障一键综合检测脚本(集成资源 DLL 签名校验 + 缓存 + 注册表)

功能清单 ✅ imageres.dll/shell32.dll/imageres.dll.mun 文件存在性、大小校验 ✅ Authenticode 数字签名有效性校验 ✅ IconCache 缓存检测 ✅ lnkfile DefaultIcon 注册表校验(兼容 dll/mun 两种格式) ✅ UWP Tile、StartMenuExperienceHost 状态检测 ✅ 自动输出故障等级 + 修复建议 ✅ 本地日志 CSV 输出 运行要求:管理员权限,PowerShell5.1+

<#
.SYNOPSIS
Windows图标综合检测脚本:资源DLL/MUN签名+缓存+注册表一体化检测
#>
#Requires -RunAsAdministrator
$LogFile = "C:\Windows\Temp\IconFullCheck_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
$Report = @()

function Get-FileSignStatus{
    param($FilePath)
    if(-not (Test-Path $FilePath)){return "Missing"}
    $sig = Get-AuthenticodeSignature $FilePath
    if($sig.Status -eq "Valid"){return "OK"}
    else{return "BadSignature"}
}

# 待检测核心资源列表
$resFiles = @(
    "C:\Windows\System32\imageres.dll",
    "C:\Windows\System32\shell32.dll",
    "C:\Windows\SystemResources\imageres.dll.mun",
    "C:\Windows\SystemResources\shell32.dll.mun"
)

$obj = [PSCustomObject]@{
    HostName          = $env:COMPUTERNAME
    DetectTime        = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    imageres_dll      = Get-FileSignStatus "C:\Windows\System32\imageres.dll"
    shell32_dll       = Get-FileSignStatus "C:\Windows\System32\shell32.dll"
    imageres_mun      = Get-FileSignStatus "C:\Windows\SystemResources\imageres.dll.mun"
    shell32_mun       = Get-FileSignStatus "C:\Windows\SystemResources\shell32.dll.mun"
    IconCacheExist    = $false
    LnkDefaultIconVal = ""
    LnkRegStatus      = "OK"
    StartMenuHostOk   = $false
    BrokenUwpCount    = 0
    FaultLevel        = "Normal" # Normal / Warning / Critical
    Suggest           = ""
}

# 检测IconCache
$iconCachePath = "$env:LocalAppData\Microsoft\Windows\Explorer\iconcache_*.db"
if(Get-ChildItem $iconCachePath -ErrorAction SilentlyContinue){
    $obj.IconCacheExist = $true
}

# 检测 lnkfile DefaultIcon
try{
    $lnkVal = Get-ItemPropertyValue "HKCR:\lnkfile\DefaultIcon" "(Default)" -ErrorAction Stop
    $obj.LnkDefaultIconVal = $lnkVal
    if($lnkVal -notmatch "imageres|shell32|mun"){
        $obj.LnkRegStatus = "Abnormal"
    }
}catch{
    $obj.LnkRegStatus = "Missing"
}

# UWP 检测
$smProc = Get-Process StartMenuExperienceHost -ErrorAction SilentlyContinue
if($smProc){$obj.StartMenuHostOk = $true}
$brokenUwp = Get-AppxPackage -AllUsers | Where-Object {$_.Status -ne "Ok"}
$obj.BrokenUwpCount = ($brokenUwp | Measure-Object).Count

# 故障定级
$criticalFlag = ($obj.imageres_dll -in "Missing","BadSignature") -or ($obj.imageres_mun -in "Missing","BadSignature")
$warnFlag = ($obj.LnkRegStatus -ne "OK") -or ($obj.BrokenUwpCount -gt 0)

if($criticalFlag){
    $obj.FaultLevel = "Critical"
    $obj.Suggest = "系统核心资源文件损坏/签名失效,执行 sfc /scannow + DISM 修复"
}
elseif($warnFlag){
    $obj.FaultLevel = "Warning"
    $obj.Suggest = "注册表异常/UWP包损坏,优先校验DefaultIcon或重置Appx"
}
else{
    $obj.FaultLevel = "Normal"
    $obj.Suggest = "基础检测无异常,如仍有图标异常建议ProcMon抓包"
}

$Report += $obj
$Report | Export-Csv -Path $LogFile -NoTypeInformation -Encoding UTF8
Write-Host "===== 检测完成 ====="
$obj
Write-Host "日志输出路径:$LogFile"

3. 域环境批量检测 imageres/shell32 完整性脚本(WinRM 远程批量巡检)

特性: ✅ 基于 WinRM,域机器远程并发检测 ✅ 批量校验 imageres.dll、shell32.dll、imageres.dll.mun 存在性 + 数字签名 ✅ 汇总输出报表,标记异常主机 ✅ 适合域资产批量基线巡检 前置条件:域机器开启 WinRM,管理员账号具备远程权限,网络 5985 端口通

<#
.SYNOPSIS
域批量远程检测 imageres / shell32 / mun 文件完整性(WinRM)
#>
#Requires -RunAsAdministrator
# ====================== 配置区 ======================
$ComputerListPath = "C:\temp\pc_list.txt" # 每行一台主机名/IP
$OutputCsv = "C:\temp\Domain_ResCheck_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
$Throttle = 20 # 并发数量,根据环境调整
# ==================================================

$scriptBlock = {
    function Get-FileSignStatus{
        param($FilePath)
        if(-not (Test-Path $FilePath)){return "Missing"}
        $sig = Get-AuthenticodeSignature $FilePath
        if($sig.Status -eq "Valid"){return "OK"}
        else{return "BadSignature"}
    }
    [PSCustomObject]@{
        ComputerName      = $env:COMPUTERNAME
        imageres_dll      = Get-FileSignStatus "C:\Windows\System32\imageres.dll"
        shell32_dll       = Get-FileSignStatus "C:\Windows\System32\shell32.dll"
        imageres_mun      = Get-FileSignStatus "C:\Windows\SystemResources\imageres.dll.mun"
        shell32_mun       = Get-FileSignStatus "C:\Windows\SystemResources\shell32.dll.mun"
        CheckTime         = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    }
}

# 读取主机列表
$computers = Get-Content $ComputerListPath | Where-Object {$_ -notmatch '^\s*$'}
$jobs = @()
foreach($pc in $computers){
    Write-Host "提交任务:$pc"
    $jobs += Start-Job -Name $pc -ScriptBlock $scriptBlock -ComputerName $pc
}
# 等待任务完成
$jobs | Wait-Job
# 收集结果
$res = $jobs | Receive-Job -ErrorAction SilentlyContinue
$res | Export-Csv $OutputCsv -NoTypeInformation -Encoding UTF8
Write-Host "批量巡检完成,报表:$OutputCsv"
# 清理job
$jobs | Remove-Job

使用说明

  1. 新建pc_list.txt,一行一个主机名 / IP
  2. 域控或运维机管理员运行
  3. 报表中标记BadSignature/Missing即为异常终端,可批量推送 sfc 修复脚本

目录

  1. 批量自动修复域内 mun / 资源 DLL 异常主机脚本(WinRM)
  2. Shell Icons 注册表标准模板(兼容 dll/mun 双版本自动适配)
  3. ProcMon 预配置 pmf 工程文件(图标加载专项抓包)

前置重要说明

  1. 修复脚本仅自动执行 sfc + DISM,不强行替换系统文件,符合 Windows 原生修复机制;支持前置过滤只处理之前巡检标记异常的主机
  2. ShellIcons 模板自动兼容 Win10 1903+(.mun) 和老版本 (.dll) 两套资源路径,优先 mun 兜底 dll
  3. ProcMon pmf 直接导入即可抓图标加载链路,预置好过滤器,无需手动配置

1. 批量自动修复域内 mun / 资源 DLL 异常主机脚本(WinRM)

适用场景:基于上一轮【域批量巡检脚本输出的异常 CSV】自动筛选故障主机,远程执行系统文件修复(sfc / DISM) 前置条件:域机器 WinRM 开启、运维账号本地管理员权限、5985 端口可达 ⚠️ 风险提示:SFC/DISM 执行耗时久,部分终端需要重启才能完全生效;脚本仅触发修复,不自动重启

<#
.SYNOPSIS
域批量自动修复 imageres/shell32/mun 资源文件异常主机
#>
#Requires -RunAsAdministrator
# ===================== 配置区 =====================
$FaultCsvPath = "C:\temp\Domain_ResCheck_20260826_000000.csv" # 上一步巡检输出的异常报表
$RepairLog = "C:\temp\Domain_Repair_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
$Throttle = 15 # 并发任务数
# =================================================

$RepairScriptBlock = {
    # 远程执行:SFC + DISM 系统映像修复
    $sfcResult = sfc /scannow
    $dismResult = DISM /Online /Cleanup-Image /RestoreHealth
    [PSCustomObject]@{
        ComputerName = $env:COMPUTERNAME
        SFC_ExitCode = $LASTEXITCODE
        DISM_ExitCode = $LASTEXITCODE
        RepairTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        Remark = "0=成功,非0=修复失败,部分需要重启"
    }
}

# 读取之前巡检结果,只筛选异常主机(Missing / BadSignature)
$csvData = Import-Csv $FaultCsvPath
$faultPCs = $csvData | Where-Object {
    $_.imageres_dll -in "Missing","BadSignature" -or
    $_.imageres_mun -in "Missing","BadSignature" -or
    $_.shell32_dll -in "Missing","BadSignature" -or
    $_.shell32_mun -in "Missing","BadSignature"
}
$targetList = $faultPCs.ComputerName | Select-Object -Unique
Write-Host "共检测到待修复主机数量:$($targetList.Count)"

$jobs = @()
foreach($pc in $targetList){
    Write-Host "提交修复任务:$pc"
    $jobs += Start-Job -Name "Repair_$pc" -ScriptBlock $RepairScriptBlock -ComputerName $pc -ErrorAction SilentlyContinue
}
$jobs | Wait-Job
$repairResult = $jobs | Receive-Job -ErrorAction SilentlyContinue
$repairResult | Export-Csv $RepairLog -NoTypeInformation -Encoding UTF8
$jobs | Remove-Job

Write-Host "批量修复任务完成,修复日志:$RepairLog"
Write-Host "注意:部分终端修复完成后需要重启系统文件才能完全生效"

配套补充:单台本地快速修复脚本(可下发 GPO)

sfc /scannow
DISM /Online /Cleanup-Image /RestoreHealth

2. Shell Icons 注册表标准模板(兼容 dll/mun 双版本自动适配)

需求:自动判断系统是否存在 mun 文件,优先使用 imageres.dll.mun,-1001;不存在则降级使用 imageres.dll,-1001(去除快捷方式箭头最常用场景,可扩展其他图标) 路径:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons 支持 Win10 全版本、Win11,可直接打包成 reg 文件,或者通过 PowerShell 部署、域 GPO 注册表偏好下发

2.1 PowerShell 自适应部署脚本(推荐,自动判断 mun)

<#
自动适配mun/dll版本,配置Shell Icons(示例:29=快捷方式箭头图标)
#>
#Requires -RunAsAdministrator
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons"
$munPath = "C:\Windows\SystemResources\imageres.dll.mun"
$dllPath = "C:\Windows\System32\imageres.dll"

if(Test-Path $munPath){
    $iconValue = "$munPath,-1001"
}else{
    $iconValue = "$dllPath,-1001"
}
if(-not (Test-Path $regPath)){
    New-Item -Path $regPath -Force | Out-Null
}
# 29 对应快捷方式叠加箭头图标
Set-ItemProperty -Path $regPath -Name "29" -Value $iconValue -Type String
Write-Host "已配置Shell Icons,使用资源:$iconValue"
Write-Host "生效需要重启explorer.exe"
taskkill /f /im explorer.exe; start explorer.exe

2.2 .reg 静态模板(二选一,适合直接导入 / GPO 推送)

✅ 新版 Win10 1903+/Win11(mun 环境)

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]
"29"="%SystemRoot%\\SystemResources\\imageres.dll.mun,-1001"

✅ 老系统兼容版(无 mun,Win7/Win10 1809 及更早)

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]
"29"="%SystemRoot%\\system32\\imageres.dll,-1001"

📌 可扩展其他图标编号: 3 = 回收站空,4 = 回收站满,11 = 文件夹等,直接新增字符串值即可


3. ProcMon 预配置 pmf 工程文件(直接用于图标加载抓包)

ProcMon 工程文件(.pmf)用于一键加载预设过滤器,专门跟踪 explorer 图标加载、LoadLibrary 读取 mun/dll、注册表 DefaultIcon 查询 使用方式:复制下方全部文本,保存为 Icon_Load_Trace.pmf,直接双击在 Process Monitor 中打开,无需手动配置过滤器

[ProcessMonitor]
Version=4
[Filters]
Include,ProcessName,contains,explorer.exe
Include,ProcessName,contains,ShellExperienceHost.exe
Include,ProcessName,contains,StartMenuExperienceHost.exe
Include,Operation,is,LoadImage
Include,Operation,is,RegQueryValue
Include,Operation,is,CreateFile
Exclude,Operation,is,RegCloseKey
Exclude,Operation,is,RegOpenKey
Exclude,Operation,is,RegEnumKey
Exclude,Operation,is,QueryDirectory
Exclude,ProcessName,is,svchost.exe
Exclude,ProcessName,is,system
[Highlight]
Color=FF0000
Filter=Result,contains,NAME NOT FOUND
Filter=Result,contains,ACCESS DENIED
[Columns]
Time of Day
Process Name
PID
Operation
Path
Result
Detail
[Options]
DropFilteredEvents=0
HistoryDepth=200000

使用流程

  1. 新建文本文档,粘贴上面全部内容,另存为 Icon_Load_Trace.pmf,编码ANSI
  2. 打开 Process Monitor,直接 File → Load Configuration,选择该 pmf
  3. 开始捕获,复现白图标现象
  4. 重点关注:
    • LoadImage:imageres.dll/imageres.dll.mun/shell32.dll 加载失败
    • RegQueryValue:查询 HKCR\lnkfile\DefaultIcon
    • CreateFile:资源文件找不到、权限拒绝

快速排查重点高亮红色条目:NAME NOT FOUND / ACCESS DENIED

补充手动快速过滤器文字(备用)

Process Name contains explorer.exe OR ShellExperienceHost.exe OR StartMenuExperienceHost.exe
Operation is LoadImage OR RegQueryValue OR CreateFile

 


Windows 系统图标通常存储在以下位置:

Copy Code
C:\Windows\System32\imageres.dll

这个文件包含了许多系统图标资源。如果你想要查看或提取其中的图标,可以使用专门的图标提取工具或者图标编辑软件来操作。


除了 imageres.dll,Windows 系统还有其他一些 DLL 文件存储了系统图标。以下是一些常见的系统图标文件:

  1. shell32.dll:包含了许多系统图标,如文件夹、驱动器、应用程序等。
  2. moricons.dll:包含了一些旧版本的系统图标。
  3. ddores.dll:包含了设备管理器中使用的一些图标。
  4. netshell.dll:包含了网络和共享中心的一些图标。
  5. pnidui.dll:包含了系统托盘图标。

这些 DLL 文件通常位于 C:\Windows\System32\ 目录下。要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。


除了上述提到的文件之外,Windows 系统还有一些其他的 DLL 文件存储着系统图标。以下是一些常见的系统图标文件:

  1. shellstyle.dll:包含了窗口装饰和控制元素的图标。
  2. ieframe.dll:包含了 Internet Explorer 浏览器相关的图标。
  3. accessibilitycpl.dll:包含了辅助功能设置相关的图标。
  4. mmcndmgr.dll:包含了计算机管理和其他 Microsoft Management Console 相关的图标。
  5. gameux.dll:包含了游戏相关的图标。

这些 DLL 文件通常也位于 C:\Windows\System32\ 目录下。同样地,要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。


除了上述提到的文件之外,Windows 系统还有一些其他的 DLL 文件存储着系统图标。以下是一些额外的系统图标文件:

  1. cryptui.dll: 包含了加密和证书相关的图标。
  2. shellstylevista.dll: 包含了 Windows Vista 风格的窗口装饰和控制元素的图标。
  3. pifmgr.dll: 包含了旧版 Windows 图标文件(PIF)的图标。
  4. zipfldr.dll: 包含了压缩文件夹(Zip Folder)的图标。
  5. wmploc.DLL: 包含了 Windows Media Player 相关的图标。

这些 DLL 文件的路径可能会因操作系统版本和安装配置而有所不同。同样地,要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。


除了之前提到的文件之外,还有一些其他的系统图标文件。以下是更多常见的系统图标文件:

  1. shell32.dll:包含了许多系统图标,如文件夹、驱动器、应用程序等。
  2. imageres.dll:包含了一些常见的系统图标,如文件夹、设备、资源管理器等。
  3. DDORes.dll:包含了设备管理器中使用的一些图标。
  4. netshell.dll:包含了网络和共享中心的一些图标。
  5. pnidui.dll:包含了系统托盘图标。
  6. mmres.dll:包含了多媒体设备和声音事件相关的图标。
  7. setupapi.dll:包含了设备安装相关的图标。
  8. sensorscpl.dll:包含了传感器设置相关的图标。

这些文件通常位于 Windows 系统目录(通常是 C:\Windows\System32\)下。要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。


  1. comres.dll: 包含了通用控件图标资源,如按钮、复选框等。
  2. ddraw.dll: 包含了一些与 DirectDraw 相关的图标资源。
  3. dmdskres.dll: 包含了磁盘驱动器管理器相关的图标资源。
  4. eudcedit.exe: 包含了用户自定义字体编辑器的图标资源。
  5. ieframe.dll: 包含了 Internet Explorer 浏览器相关的图标资源。
  6. inetcpl.cpl: 包含了 Internet 控制面板相关的图标资源。
  7. mmc.exe: 包含了 Microsoft Management Console (MMC) 相关的图标资源。
  8. notepad.exe: 包含了记事本程序的图标资源。
  9. oleacc.dll: 包含了对象链接和嵌入 (OLE) 辅助技术的图标资源。
  10. shellbrd.dll: 包含了 Windows 资源管理器中“计算机”文件夹下的图标资源。

除了之前提到的文件之外,还有一些其他的系统图标文件。以下是更多常见的系统图标文件:

  1. accessibilitycpl.dll: 包含了辅助功能控制面板相关的图标资源。
  2. gameux.dll: 包含了游戏资源管理器相关的图标资源。
  3. mmcndmgr.dll: 包含了 Microsoft Management Console (MMC) 节点管理器相关的图标资源。
  4. mstsc.exe: 包含了远程桌面连接客户端的图标资源。
  5. shell32.dll: 包含了大量的系统图标资源,如控制面板、文件夹、设备等。
  6. themecpl.dll: 包含了主题控制面板相关的图标资源。
  7. wmploc.dll: 包含了 Windows Media Player 相关的图标资源。
  8. zipfldr.dll: 包含了压缩文件夹相关的图标资源。

这些文件通常也位于 Windows 系统目录下。要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。


 

posted @ 2024-04-09 07:05  suv789  阅读(2423)  评论(0)    收藏  举报