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 等。
- 资源组织:内部使用资源 ID 索引(如
imageres.dll,-1001),资源内置多 DPI 适配版本(100%/125%/150%/200% 等),适配高分屏。 - 调用模型:Shell/Explorer、UWP 组件、系统对话框不直接执行 dll 内代码,通过 Win32 资源 API 读取资源:
LoadLibraryEx(仅加载资源,不执行入口)FindResource/LoadResource/LockResourceSHGetIconLocation/IExtractIcon(传统图标加载链路)
- 和 shell32 分工:
shell32.dll:大量老式经典图标 + Shell 核心业务代码imageres.dll:Win10 之后新增现代扁平化图标、大量系统状态图标(网络、电源、音量、快捷方式等)
👉 前面 lnk 快捷方式无箭头方案就是引用
imageres.dll,-1001
二、依赖文件
imageres.dll 本身无代码依赖(纯资源 dll),但读取渲染它的组件有依赖
- 直接关联系统库(读取 / 渲染图标时加载)
kernel32.dll/kernelbase.dll:LoadLibraryEx、资源加载基础 APIuser32.dll/gdi32.dll/gdiplus.dll:位图、图标渲染shimgvw.dll:IExtractIcon 图标提取 COM 组件(Explorer 用)shell32.dll:Shell 资源解析、图标调度
- UWP 场景额外依赖
winrrm.dll:Windows 资源管理器,UWP 读取 imageres 图标资源
- 配套缓存载体(不是 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 → 界面展示
反向依赖说明
- imageres.dll 不依赖任何其他 dll 运行,可以单独被资源查看工具读取;
- 若
imageres.dll丢失 / 损坏 → 凡是引用它的图标全部回退白色通用占位图标(全局大面积白图标典型诱因); - 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,全局图标受此控制 |
六、边界(关键限制 & 坑点)
- ✅ 纯资源 DLL:没有 DllMain 业务逻辑,无法导出函数,不能直接作为 COM 组件,仅用来存图片资源;
- ✅ 版本差异:Win10 1607、1903、Win11 imageres 内部资源 ID、图标样式不一样,跨版本直接复用资源 ID 会图标异常;
- ✅ 位数隔离:SysWOW64(32bit)和 System32(64bit)两套独立 imageres,32 位程序只会读取 wow64 下版本;
- ✅ 权限边界:如果 imageres.dll 的 NTFS 权限阻止 explorer 读取,直接出现全局白图标;
- ✅ 和 UWP 资源区分:UWP 优先读取 Appx 包内 Assets 图片,不会优先使用 imageres,只有系统原生控件才调用 imageres;
- ❌ 不支持动态修改:直接替换 imageres.dll 需要 PE 签名 + 权限,常规美化工具不推荐直接修改该文件,极易触发 SFC 修复、系统异常;
- ❌ 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
目录
- imageres.dll 常用资源 ID 速查表(Win10/Win11 主流可用)
- shell32.dll 和 imageres.dll 功能对比表
- 资源 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 | 控制面板 | 设置入口图标 |
补充说明:
- 任务栏原生网络、音量部分新版系统实际由
stobject.dll、pnidui.dll承载,imageres 主要用于资源管理器内静态图标- 查看 DLL 资源工具:ResourceHacker、IconsExtract
- 注册表引用示例:
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:基础现象与范围判定
- 确认影响范围:单用户 / 整机所有用户 / 域内批量机器
- 单用户异常 → 优先缓存、用户配置权限
- 所有用户均异常 → 资源 DLL 本身、系统映像、组策略
- 区分:是否仅自定义 lnk 图标异常,还是系统自带【此电脑 / 回收站 / 控制面板】图标也变白
- 系统内置图标空白 → 高度怀疑 imageres/shell32 损坏或无法读取
- 快速新建本地管理员账号测试,区分用户级问题和系统级问题
Step2:校验资源 DLL 文件基础状态
- 校验文件是否存在、大小不为 0
# 校验imageres
Get-Item C:\Windows\System32\imageres.dll
Get-Item C:\Windows\SysWOW64\imageres.dll
- 校验 NTFS 权限:确认
NT AUTHORITY\SYSTEM、Administrators、当前用户具备读取权限 - 校验数字签名(文件被篡改、恶意替换高发)
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 配置
- 检查
HKCR\lnkfile\DefaultIcon、HKCR\exefile\DefaultIcon、HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons - 验证资源 DLL 引用 ID 是否存在、DLL 路径有效
- 域环境执行
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:兜底修复与边界判定
- 若为
.mun资源(新版 Win10/11):资源不在 imageres.dll 内,直接修复 SystemResources 目录文件 - 禁止网上单独下载 dll 直接覆盖系统文件,极易签名失效、触发 SFC 反复回滚
- 干净启动(msconfig)排查第三方 Shell 扩展干扰图标加载
Step8:故障闭环归档
记录:影响范围、是否资源 DLL 损坏 / 注册表异常 / 缓存问题、修复命令、是否域 GPO 导致
快速判定速查表
| 现象 | 根因方向 |
|---|---|
| 所有用户,此电脑 / 回收站图标全部空白 | imageres.dll 损坏、签名失效、权限拒绝 |
| 仅快捷方式变白,系统自带图标正常 | lnkfile DefaultIcon 注册表异常 |
| 清理 iconcache 立刻恢复,重启后复现 | 异常关机 / 安全软件破坏缓存 |
| 手动修复注册表,几分钟自动变回错误值 | 域 GPO 注册表偏好强制覆盖 |
| 仅 UWP 磁贴空白,系统图标正常 | 不属于资源 DLL 故障,走 Tile/Appx 修复流程 |
目录
- mun 资源文件(SystemResources)完整解构 + 资源 ID 速查表
- 图标故障一键综合检测脚本(集成资源 DLL 签名校验 + 缓存 + 注册表)
- 域环境批量检测 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 边界约束
- 32 位系统无 mun 机制,仅 x64 Win10 1903+/Win11 存在
- mun 有数字签名,直接替换篡改会签名失效,sfc 自动回滚
- 资源 ID 和老 imageres 大部分保持兼容,但少量 ID 映射变更
- SysWOW64 不存在 mun 文件,32 位程序依然读取 SysWOW64\imageres.dll
- 部分组件使用
shell32.dll.mun、pnidui.dll.mun、stobject.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
使用说明
- 新建
pc_list.txt,一行一个主机名 / IP - 域控或运维机管理员运行
- 报表中标记
BadSignature/Missing即为异常终端,可批量推送 sfc 修复脚本
目录
- 批量自动修复域内 mun / 资源 DLL 异常主机脚本(WinRM)
- Shell Icons 注册表标准模板(兼容 dll/mun 双版本自动适配)
- ProcMon 预配置 pmf 工程文件(图标加载专项抓包)
前置重要说明
- 修复脚本仅自动执行 sfc + DISM,不强行替换系统文件,符合 Windows 原生修复机制;支持前置过滤只处理之前巡检标记异常的主机
- ShellIcons 模板自动兼容 Win10 1903+(.mun) 和老版本 (.dll) 两套资源路径,优先 mun 兜底 dll
- 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
使用流程
- 新建文本文档,粘贴上面全部内容,另存为
Icon_Load_Trace.pmf,编码ANSI - 打开 Process Monitor,直接 File → Load Configuration,选择该 pmf
- 开始捕获,复现白图标现象
- 重点关注:
- 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 系统图标通常存储在以下位置:
C:\Windows\System32\imageres.dll
这个文件包含了许多系统图标资源。如果你想要查看或提取其中的图标,可以使用专门的图标提取工具或者图标编辑软件来操作。
除了 imageres.dll,Windows 系统还有其他一些 DLL 文件存储了系统图标。以下是一些常见的系统图标文件:
shell32.dll:包含了许多系统图标,如文件夹、驱动器、应用程序等。moricons.dll:包含了一些旧版本的系统图标。ddores.dll:包含了设备管理器中使用的一些图标。netshell.dll:包含了网络和共享中心的一些图标。pnidui.dll:包含了系统托盘图标。
这些 DLL 文件通常位于 C:\Windows\System32\ 目录下。要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。
除了上述提到的文件之外,Windows 系统还有一些其他的 DLL 文件存储着系统图标。以下是一些常见的系统图标文件:
shellstyle.dll:包含了窗口装饰和控制元素的图标。ieframe.dll:包含了 Internet Explorer 浏览器相关的图标。accessibilitycpl.dll:包含了辅助功能设置相关的图标。mmcndmgr.dll:包含了计算机管理和其他 Microsoft Management Console 相关的图标。gameux.dll:包含了游戏相关的图标。
这些 DLL 文件通常也位于 C:\Windows\System32\ 目录下。同样地,要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。
除了上述提到的文件之外,Windows 系统还有一些其他的 DLL 文件存储着系统图标。以下是一些额外的系统图标文件:
cryptui.dll: 包含了加密和证书相关的图标。shellstylevista.dll: 包含了 Windows Vista 风格的窗口装饰和控制元素的图标。pifmgr.dll: 包含了旧版 Windows 图标文件(PIF)的图标。zipfldr.dll: 包含了压缩文件夹(Zip Folder)的图标。wmploc.DLL: 包含了 Windows Media Player 相关的图标。
这些 DLL 文件的路径可能会因操作系统版本和安装配置而有所不同。同样地,要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。
除了之前提到的文件之外,还有一些其他的系统图标文件。以下是更多常见的系统图标文件:
shell32.dll:包含了许多系统图标,如文件夹、驱动器、应用程序等。imageres.dll:包含了一些常见的系统图标,如文件夹、设备、资源管理器等。DDORes.dll:包含了设备管理器中使用的一些图标。netshell.dll:包含了网络和共享中心的一些图标。pnidui.dll:包含了系统托盘图标。mmres.dll:包含了多媒体设备和声音事件相关的图标。setupapi.dll:包含了设备安装相关的图标。sensorscpl.dll:包含了传感器设置相关的图标。
这些文件通常位于 Windows 系统目录(通常是 C:\Windows\System32\)下。要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。
comres.dll: 包含了通用控件图标资源,如按钮、复选框等。ddraw.dll: 包含了一些与 DirectDraw 相关的图标资源。dmdskres.dll: 包含了磁盘驱动器管理器相关的图标资源。eudcedit.exe: 包含了用户自定义字体编辑器的图标资源。ieframe.dll: 包含了 Internet Explorer 浏览器相关的图标资源。inetcpl.cpl: 包含了 Internet 控制面板相关的图标资源。mmc.exe: 包含了 Microsoft Management Console (MMC) 相关的图标资源。notepad.exe: 包含了记事本程序的图标资源。oleacc.dll: 包含了对象链接和嵌入 (OLE) 辅助技术的图标资源。shellbrd.dll: 包含了 Windows 资源管理器中“计算机”文件夹下的图标资源。
除了之前提到的文件之外,还有一些其他的系统图标文件。以下是更多常见的系统图标文件:
accessibilitycpl.dll: 包含了辅助功能控制面板相关的图标资源。gameux.dll: 包含了游戏资源管理器相关的图标资源。mmcndmgr.dll: 包含了 Microsoft Management Console (MMC) 节点管理器相关的图标资源。mstsc.exe: 包含了远程桌面连接客户端的图标资源。shell32.dll: 包含了大量的系统图标资源,如控制面板、文件夹、设备等。themecpl.dll: 包含了主题控制面板相关的图标资源。wmploc.dll: 包含了 Windows Media Player 相关的图标资源。zipfldr.dll: 包含了压缩文件夹相关的图标资源。
这些文件通常也位于 Windows 系统目录下。要查看或提取其中的图标,你可以使用专门的图标提取工具或者图标编辑软件。

浙公网安备 33010602011771号