pnputil (Plug and Play Utility)C:\Windows\System32\pnputil.exe 定位:Windows 即插即用(Plug and Play)命令行设备驱动管理工具;PNP 子系统的官方 CLI 前端,替代旧版 devcon.exe;Win10 1709 + 内置;用于驱动包增删导出、设备启用 / 禁用 / 重启 / 删除、硬件枚举扫描
PnPUtil 命令语法 - Windows drivers | Microsoft Learn
PnPUtil.exe 完整解构
文件路径:
C:\Windows\System32\pnputil.exe定位:Windows 即插即用(Plug and Play)命令行设备驱动管理工具;PNP 子系统的官方 CLI 前端,替代旧版devcon.exe;Win10 1709 + 内置;用于驱动包增删导出、设备启用 / 禁用 / 重启 / 删除、硬件枚举扫描。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
PnPUtil 本质是用户态命令行包装器,不直接操作硬件寄存器;调用 Windows PnP 即插即用子系统的SetupAPI + Configuration Manager (CfgMgr32) API,完成驱动包存储(Driver Store)管理与设备实例管理。
两大核心业务域:
- 驱动存储(DriverStore)管理
%SystemRoot%\System32\DriverStore\FileRepository驱动仓库。
/add-driver:将 INF 驱动包导入驱动存储;/install额外匹配硬件并加载驱动/delete-driver:从驱动存储删除 oem*.inf 驱动包,/uninstall卸载设备上当前正在使用的驱动/export-driver:从 DriverStore 导出整套驱动文件到外部目录
- 即插即用设备实例管理 操作设备树(
HKLM\SYSTEM\CurrentControlSet\Enum)里的设备实例:
enable-device/disable-device:启用、禁用设备实例restart-device:软重启设备(PnP 重枚举,不重启整机)remove-device:删除设备实例(可带/subtree删除子设备)scan-devices:触发 PnP 总线扫描,检测新增 / 拔出硬件(等同于设备管理器「扫描检测硬件改动」)enum-*系列:枚举设备、驱动、设备类、设备树、设备容器,读取注册表 PnP 信息
核心底层 API:
- SetupAPI:
SetupCopyOemInf、SetupUninstallOemInf、驱动包导入导出 - CfgMgr32.dll (Configuration Manager):设备实例启用 / 禁用 / 删除、硬件扫描、枚举设备树
- 内核侧:
pnp.sys即插即用内核驱动,维护内核设备栈、总线枚举、驱动加载
简化调用栈
pnputil.exe (CLI解析参数)
↓ SetupAPI.dll / CfgMgr32.dll (用户态PnP配置API)
↓ Win32 注册表读写(Enum、Services、DriverStore注册表项)
↓ 内核 pnp.sys 即插即用子系统
↓ 总线驱动(PCI/USB等)、设备驱动
DriverStore 概念要点: Windows 会预先把第三方驱动包复制到 DriverStore 仓库,标记为
oemX.inf;只有在 DriverStore 内的驱动包,才允许系统为硬件加载;INF 原始文件可以不在磁盘,仓库内的副本才是系统使用版本。
二、依赖文件
| 文件 | 路径 | 角色说明 |
|---|---|---|
pnputil.exe |
System32 | 主程序,命令行参数解析、调用 SetupAPI/CfgMgr32 |
setupapi.dll |
System32 | SetupAPI,驱动包导入 / 删除 / 导出、INF 驱动存储管理核心 |
cfgmgr32.dll |
System32 | 配置管理器,设备实例启用 / 禁用 / 删除、硬件枚举、PnP 设备操作 |
advapi32.dll |
System32 | 注册表读写、权限调整;读写 HKLM 系统设备注册表项 |
kernel32.dll / ntdll.dll |
System32 | 基础文件、内存、进程 API |
pnp.sys |
System32\drivers | 内核 PnP 子系统,维护内核设备栈、总线枚举、驱动加载 |
drvstore.dll |
System32 | DriverStore 驱动存储底层管理库,驱动包验证、哈希、权限 |
运行时业务依赖(非静态导入)
- 管理员权限:绝大多数写操作(add/delete driver、disable/remove-device)必须提升管理员;普通用户仅能执行只读 enum 枚举。
- DriverStore 目录:
C:\Windows\System32\DriverStore\FileRepository,NTFS 强权限保护。 - 系统注册表路径
HKLM\SYSTEM\CurrentControlSet\Enum:设备实例树HKLM\SYSTEM\CurrentControlSet\Control\Class:设备类 GUIDHKLM\SYSTEM\CurrentControlSet\Control\DriverStore:驱动仓库元数据
- 总线驱动(pci.sys、usbhub3.sys 等):
scan-devices扫描时,由对应总线驱动上报硬件变更。
三、依赖关系
链路 1:/add-driver 添加驱动包
pnputil.exe
1. 解析INF路径参数
2. SetupAPI调用,校验INF签名、驱动包完整性
3. drvstore.dll 将驱动包复制到DriverStore\FileRepository,生成oemX.inf注册表条目
4. 带 /install:PnP子系统扫描硬件,匹配INF硬件ID,加载驱动到对应设备
链路 2:/enum-devices 枚举设备(只读,低权限可执行)
pnputil → cfgmgr32.dll
↓ 读取 HKLM\SYSTEM\CurrentControlSet\Enum 注册表设备实例信息
↓ 可选参数叠加读取stack/drivers/location等附加信息
↓ 格式化输出文本/xml/csv
链路 3:/disable-device 禁用设备
pnputil.exe(管理员)
↓ cfgmgr32.dll 调用CM_Disable_DevNode
↓ 用户态PnP通知内核pnp.sys
↓ 内核卸载设备驱动栈,设备进入禁用状态
链路 4:/scan-devices 扫描硬件改动
pnputil → cfgmgr32 → 通知内核pnp.sys
↓ pnp.sys遍历各个总线驱动(PCI/USB)
↓ 总线驱动上报新增/移除硬件
↓ PnP匹配驱动,如有新硬件自动尝试加载DriverStore内驱动
- 权限依赖:修改类操作(增删驱动、启停删除设备)强制需要管理员权限;只读枚举
enum-*普通用户可执行。 - 内核依赖:所有设备状态变更最终交由内核
pnp.sys处理;pnputil 本身不能直接卸载内核驱动。 - DriverStore 锁机制:驱动包正在被设备使用时,默认不允许
/delete-driver;必须加/force强制删除,或先/uninstall卸载设备驱动。 - 签名依赖:默认 Windows 驱动签名策略;未签名驱动无法通过
/add-driver /install安装(除非关闭驱动签名强制)。
四、配套链
系统组件分工
| 组件 | 作用 |
|---|---|
| pnputil.exe | 命令行入口,解析参数,调用 SetupAPI/CfgMgr32 |
| SetupAPI.dll | 驱动包 (INF)、DriverStore 仓库管理 |
| CfgMgr32.dll | 设备实例、设备树、硬件枚举、设备启停删除 |
| drvstore.dll | 驱动存储底层:驱动包复制、哈希校验、版本管理 |
| pnp.sys | 内核 PnP 即插即用子系统,内核设备栈管理 |
| 设备管理器 devmgmt.msc | GUI 前端,底层同样调用 SetupAPI/CfgMgr32,和 pnputil 共用同一套底层 API |
高频命令示例
# 列出所有第三方驱动包
pnputil /enum-drivers
# 导入驱动包并自动安装匹配硬件
pnputil /add-driver D:\driver\*.inf /subdirs /install
# 删除驱动包
pnputil /delete-driver oem0.inf /uninstall
# 扫描硬件改动
pnputil /scan-devices
# 禁用指定实例ID设备
pnputil /disable-device "USB\VID_xxxx&PID_xxxx"
安全视角
- 红队 / 恶意程序滥用:管理员权限下,可通过 pnputil 安装恶意未签名驱动(前提:关闭驱动强制签名);删除、禁用安全软件驱动。
- 驱动包安装有签名校验;默认策略阻止无签名驱动加载。
- DriverStore 目录 ACL 严格保护,普通用户无法直接修改里面的驱动文件。
五、逻辑链路
链路 1:只读枚举(enum-drivers /enum-devices)
- pnputil 解析命令行参数。
- 调用 CfgMgr32/SetupAPI 读取注册表内 PnP 元数据。
- 按参数筛选(class、bus、problem、connected)。
- 格式化输出 txt/xml/csv。
全程不修改系统、不与内核 pnp.sys 做状态变更交互,仅读注册表。
链路 2:添加驱动包 /add-driver
- 校验 INF 文件语法、驱动数字签名。
- 将驱动文件完整复制到 DriverStore 仓库,生成 oem*.inf。
- 写入 HKLM 驱动仓库注册表元数据。
- 带
/install:触发 PnP 匹配硬件 ID,对匹配设备加载驱动。
链路 3:删除驱动包 /delete-driver
- 检查驱动包是否正在被设备使用。
/uninstall:先卸载所有正在使用该驱动包的设备。/force:跳过占用检测强制标记删除。- 删除 DriverStore 内驱动文件,清理 oem*.inf 注册表项。
链路 4:禁用设备 /disable-device
- 查找匹配实例 ID / 设备 ID 的 DevNode 设备节点。
- CfgMgr 调用 CM_Disable_DevNode,通知内核 pnp.sys。
- 内核卸载该设备的驱动栈,设备标记为禁用。
链路 5:scan-devices 硬件扫描
- 用户态 API 通知内核 PnP 子系统启动总线扫描。
- pnp.sys 遍历 PCI/USB/SATA 等总线驱动,查询当前连接硬件。
- 检测新增硬件:自动匹配 DriverStore 内 INF 驱动;检测移除硬件:标记设备为已断开。
六、边界(约束、坑点、失效条件)
1. 权限边界
- 只读枚举(enum 系列):普通用户可执行。
- add/delete driver、disable/enable/remove/restart-device:必须管理员权限;UAC 未提升直接报错。
- PPL 受保护设备:即使管理员,部分受保护反恶意驱动设备无法删除 / 禁用。
2.DriverStore 边界
/add-driver仅复制驱动包到仓库;不带/install不会自动安装到硬件,仅存入仓库等待后续硬件匹配。- 驱动包正在被设备占用时,不加
/uninstall无法删除;不加/force会报错。 - DriverStore 文件不能手动直接删除 FileRepository 内文件;只能用 pnputil/SetupAPI 管理,手动删会破坏驱动仓库元数据。
3. 设备操作边界
remove-device:删除设备实例;重启扫描硬件后,如果硬件仍存在,系统会重新发现并重装驱动。disable-device:仅临时禁用;硬件不拔、不删除驱动,重启后设备保持禁用状态。restart-device:软重启设备,不是整机重启;仅重加载该设备驱动栈。/subtree:删除设备连同所有子设备(例如 USB 集线器 + 下游所有 USB 设备)。
4. 扫描边界
scan-devices只扫描即插即用总线;无法扫描静态非 PnP 老式硬件;/async异步扫描,命令返回后扫描仍在后台进行。
5.INF 与签名边界
- 新版 Windows 默认强制驱动签名;未签名 INF 无法
/add-driver /install,需要开启测试签名模式。 - 仅 INF 驱动包支持;纯无 INF 驱动二进制文件无法导入 DriverStore。
6. 高频认知误区
- ❌pnputil 直接操作内核驱动二进制;✅pnputil 是用户态 CLI,依赖 SetupAPI/CfgMgr32,内核动作交给 pnp.sys。
- ❌
/add-driver等同于安装驱动;✅仅添加进驱动仓库,/install参数才会绑定硬件。 - ❌手动删除 FileRepository 文件夹内文件可以清理驱动;✅会损坏驱动存储元数据库,导致设备管理器异常。
- ❌
remove-device会永久删除硬件驱动;✅硬件存在,扫描硬件改动会重新加载驱动。
PnPUtil 组件分工简表
| 组件 | 位置 | 职责 |
|---|---|---|
| pnputil.exe | System32 | 命令行入口,参数解析,调用 SetupAPI/CfgMgr32 |
| setupapi.dll | System32 | 驱动包 INF 导入、DriverStore 管理 |
| cfgmgr32.dll | System32 | 设备实例管理,枚举、启用禁用删除设备 |
| drvstore.dll | System32 | 驱动仓库底层存储、校验、版本管理 |
| pnp.sys | System32\drivers | 内核 PnP 子系统,设备栈、总线枚举 |
| devmgmt.msc | MMC 管理单元,GUI 前端,底层 API 与 pnputil 完全一致 |
setupapi.dll 完整解构
文件路径:
C:\Windows\System32\setupapi.dll定位:Windows 安装程序 API(SetupAPI) 用户态库,是硬件驱动、INF 文件、驱动存储 DriverStore 管理的核心用户态组件;pnputil.exe、设备管理器 devmgmt.msc、Windows 更新安装驱动,全部依赖此 DLL;负责解析 INF、驱动包导入导出、设备实例安装、硬件信息查询。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
SetupAPI 是一套面向设备安装、INF 处理、驱动包管理的用户态 Win32 API 集合,诞生于 Windows 95,后续迭代适配 NT 内核、DriverStore、驱动签名。 核心两大模块:
- INF 解析引擎:读取、解析
.inf文本,解析[Version]、[Manufacturer]、[Models]、[Install]、[CopyFiles]等 INF 区段;处理文件复制、注册表写入、服务注册、硬件 ID 匹配逻辑。 - 驱动存储管理模块:和
drvstore.dll协同,管理DriverStore\FileRepository驱动仓库,驱动包导入 / 删除 / 导出、OEM INF(oemX.inf)注册。
关键区分: SetupAPI不直接操作内核设备栈;设备节点启用 / 禁用 / 删除这类设备实例状态操作,交给
cfgmgr32.dll(配置管理器);SetupAPI 聚焦「驱动包、INF、文件、安装脚本」。
核心 API 分组:
SetupCopyOemInf/SetupUninstallOemInf:驱动包导入、从 DriverStore 删除SetupOpenInfFile/SetupQueryInfValue:INF 文件打开、读取区段键值SetupDiGetClassDevs系列:枚举设备、设备类、硬件 ID(最常用,设备管理器底层)SetupDiBuildDriverInfoList:为设备构建候选驱动列表,匹配 INF 硬件 IDSetupDiInstallDevice:为设备安装驱动包SetupDiDeleteDriverPackage:卸载驱动包
简化调用栈
pnputil.exe / devmgmt.msc / Windows Update
↓ setupapi.dll(INF解析、驱动包管理、SetupDi*设备安装API)
↓ drvstore.dll(DriverStore底层仓库校验、哈希、文件管理)
↓ advapi32.dll(注册表读写)
↓ cfgmgr32.dll(可选:设备节点DevNode操作)
↓ 内核 pnp.sys(PnP即插即用子系统,内核设备栈)
二、依赖文件
| 文件 | 路径 | 角色说明 |
|---|---|---|
setupapi.dll |
System32 | 主库,INF 解析、SetupDi * 全套 API、驱动包管理 |
drvstore.dll |
System32 | DriverStore 底层仓库,驱动包哈希校验、版本管理、仓库元数据 |
cfgmgr32.dll |
System32 | 配置管理器;DevNode 设备节点查询、状态变更,SetupAPI 调用它获取设备实例信息 |
advapi32.dll |
System32 | 注册表读写、安全权限、服务项操作;INF 里 AddReg/DelReg 依赖 |
kernel32.dll / ntdll.dll |
System32 | 文件 IO、内存管理、基础系统调用 |
crypt32.dll |
System32 | 驱动数字签名校验、证书验证;校验 INF + 驱动文件的微软数字签名 |
pnp.sys |
System32\drivers | 内核 PnP 子系统;驱动加载、设备栈构建(SetupAPI 通过 CfgMgr32 间接通信) |
运行时业务依赖
- INF 文件:驱动安装的脚本描述文件,定义硬件 ID、文件复制规则、注册表项。
- DriverStore 仓库目录:
%SystemRoot%\System32\DriverStore\FileRepository,NTFS ACL 保护。 - 系统注册表路径
HKLM\SYSTEM\CurrentControlSet\Control\Class:设备类 GUIDHKLM\SYSTEM\CurrentControlSet\Control\DriverStore:驱动仓库元数据HKLM\SYSTEM\CurrentControlSet\Enum:PnP 设备实例树
- 权限:驱动包增删、设备安装操作需要管理员权限;仅设备枚举、INF 读取可普通用户运行。
三、依赖关系
链路 1:pnputil /add-driver(导入驱动包)
pnputil.exe
↓ setupapi.dll :: SetupCopyOemInf
↓ drvstore.dll 校验驱动包完整性、哈希、数字签名
↓ 将驱动文件复制到DriverStore\FileRepository
↓ 在DriverStore注册表注册,生成 oemX.inf 元数据
↓ 可选:SetupDiInstallDevice(带 /install 参数)调用cfgmgr32,通知pnp.sys匹配硬件加载驱动
链路 2:pnputil /enum-drivers 枚举驱动包
pnputil.exe
↓ setupapi.dll 读取DriverStore注册表元数据
↓ 读取oem*.inf信息,解析INF的版本、厂商、硬件ID
↓ 输出驱动包列表
链路 3:INF 安装,AddReg / CopyFiles 执行
setupapi.dll INF解析引擎
解析INF区段
CopyFiles → 调用kernel32复制驱动SYS/DLL文件
AddReg → 调用advapi32写入HKLM注册表项
AddService → 调用advapi32注册内核驱动服务
链路 4:删除驱动包 /delete-driver
pnputil
↓ setupapi.dll :: SetupUninstallOemInf
↓ drvstore.dll 检查驱动包是否正在被设备占用
↓ 带/uninstall:调用SetupDiUninstallDevice卸载设备上驱动
↓ 删除DriverStore内文件、清理oem注册表项
- 调用方向:上层工具 (pnputil/devmgmt) → setupapi.dll → drvstore /cfgmgr32 /advapi32 → 内核 pnp.sys
- 签名强依赖:现代 Windows,setupapi.dll 会调用 crypt32 校验驱动数字签名;未签名驱动默认拒绝安装。
- 职责边界:SetupAPI不负责内核驱动的加载 / 卸载;驱动真正加载由
pnp.sys内核 PnP 子系统完成,SetupAPI 只准备文件、注册表,发起安装请求。 - INF 依赖:所有驱动包操作必须依托合法 INF 文件;没有 INF,SetupAPI 无法注册驱动包到 DriverStore。
四、配套链
系统组件分工
| 组件 | 作用 |
|---|---|
| setupapi.dll | INF 解析、SetupDi 设备枚举 API、驱动包导入 / 卸载、INF 脚本执行(CopyFiles/AddReg) |
| drvstore.dll | DriverStore 底层存储,驱动包哈希校验、版本管理、仓库锁 |
| cfgmgr32.dll | 设备 DevNode 节点、硬件实例状态查询 / 启用禁用 |
| crypt32.dll | 驱动数字签名验证、证书链校验 |
| pnputil.exe | CLI 前端,调用 SetupAPI 封装命令行参数 |
| devmgmt.msc | MMC 设备管理器 GUI 前端,底层大量调用 SetupDi*API |
| Windows Update | 使用 SetupAPI 下载并安装驱动包到 DriverStore |
典型 API 代码片段示意(C 风格)
// 打开INF文件
HINF hInf = SetupOpenInfFile(L"device.inf", NULL, INF_STYLE_OLDNT, NULL);
// 枚举设备类
HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB, NULL, NULL, DIGCF_PRESENT);
安全视角
- 恶意 INF 风险:管理员权限下,SetupAPI 可执行 INF 脚本,复制文件、写入注册表、注册驱动服务;恶意 INF 可用于安装恶意内核驱动。
- 签名校验是第一道防线;测试签名模式可绕过签名校验。
- 旧版 SetupAPI 存在多个高危 CVE(INF 解析缓冲区溢出、本地提权漏洞)。
五、逻辑链路
链路 1:读取枚举驱动 / 设备(只读操作)
- 上层程序调用 SetupDi 系列 API。
- setupapi.dll 读取
HKLM下 PnP/Class/DriverStore 注册表信息。 - 解析 INF 元数据,提取硬件 ID、厂商、版本。
- 返回设备 / 驱动信息给调用方。
不修改文件、注册表,不与内核 pnp.sys 做状态变更。
链路 2:添加驱动包到 DriverStore
- SetupAPI 打开并解析 INF,校验 INF 语法。
- crypt32 校验驱动包数字签名。
- drvstore.dll 校验驱动包哈希,检查是否已存在同版本驱动。
- 复制驱动文件到 FileRepository,注册 oemX.inf 到 DriverStore 注册表。
- 若带
/install:调用 SetupDiInstallDevice,通知 PnP 子系统匹配硬件 ID,加载驱动。
链路 3:卸载 & 删除驱动包
- SetupAPI 查询哪些设备正在使用该 oem 驱动包。
/uninstall:对每个绑定设备执行 SetupDiUninstallDevice,通知内核 pnp.sys 卸载驱动栈。- drvstore 解除占用锁,删除 FileRepository 内驱动文件。
- SetupAPI 清理 oem*.inf 对应的注册表项。
链路 4:INF 脚本执行(CopyFiles / AddReg / AddService)
- SetupAPI INF 引擎解析
[Install]安装区段。 - CopyFiles:复制 SYS/DLL 到系统目录。
- AddReg:advapi32 写入注册表。
- AddService:注册内核驱动服务项。
- 完成后,PnP 可加载该驱动。
六、边界(约束、坑点、失效条件)
1. 权限边界
- 只读 API(枚举设备、读取 INF):普通用户权限可调用。
- 修改类 API(安装驱动、删除驱动包、写入注册表):必须管理员权限。
- PPL 受保护设备驱动:SetupAPI 无法卸载 / 修改受保护驱动包,即使管理员。
2.INF 解析边界
- SetupAPI 只能处理标准 Windows INF 格式;语法错误、非法区段会直接解析失败。
- INF 只是安装脚本,本身不是驱动;驱动主体是
.sys内核文件。 - INF 脚本执行能力有限:仅支持 CopyFiles/AddReg/AddService 等预定义指令,不能执行任意 exe。
3.DriverStore 边界
- SetupAPI 不能直接操作 FileRepository 内文件;全部文件操作交由 drvstore.dll,维护哈希校验。手动删除 FileRepository 文件,会造成 DriverStore 元数据损坏,SetupAPI 报错。
- 驱动包正在被设备占用时,默认拒绝删除;需要先卸载设备驱动或使用 force 标记。
4. 签名边界
- Win10/11 默认强制驱动数字签名;crypt32 校验失败,SetupAPI 直接拒绝导入安装。
- 测试签名模式 / 安全启动关闭,可绕过签名限制,允许未签名驱动包导入。
5. 与 CfgMgr32 职责边界(极易混淆)
✅ setupapi.dll:驱动包、INF、文件、安装脚本、驱动仓库 ✅ cfgmgr32.dll:设备实例 DevNode、设备状态(启用 / 禁用)
SetupAPI 可以调用 CfgMgr32,但两者职责独立;SetupAPI不能直接禁用设备,该能力属于 cfgmgr32。
6. 高频认知误区
- ❌ setupapi.dll 是内核组件;✅ 用户态 DLL,全部 API 运行在应用层,通过 CfgMgr32 和内核 PnP 通信。
- ❌ SetupDiGetClassDevs 直接扫描硬件总线;✅ 读取注册表中已经缓存的 PnP 设备信息;真正总线扫描由
pnp.sys完成。 - ❌ INF 安装一定立刻加载驱动;✅ 仅当硬件 ID 匹配当前存在设备时,才会加载;仅导入 DriverStore 不绑定硬件,不会加载。
- ❌ setupapi.dll 只给 pnputil 使用;✅ devmgmt.msc、Windows 更新、安装程序、第三方驱动安装器全部依赖它。
setupapi.dll 组件分工简表
| 组件 | 位置 | 职责 |
|---|---|---|
| setupapi.dll | System32 | INF 解析、SetupDi 设备枚举、驱动包安装卸载、INF 脚本执行 |
| drvstore.dll | System32 | DriverStore 底层仓库、哈希校验、版本锁 |
| cfgmgr32.dll | System32 | 设备 DevNode 实例、硬件状态管理 |
| crypt32.dll | System32 | 驱动签名校验 |
| pnp.sys | System32\drivers | 内核 PnP,设备栈、驱动加载 |
cfgmgr32.dll 完整解构
文件路径:
C:\Windows\System32\cfgmgr32.dll定位:Windows 配置管理器(Configuration Manager)用户态库,PnP 子系统的用户态设备节点 (DevNode) 操作核心 API 库;专门用于设备实例、设备树、硬件节点状态管理;与setupapi.dll职责严格划分:setupapi.dll负责驱动包 / INF / 文件安装,cfgmgr32.dll 负责设备节点 DevNode 生命周期与硬件状态控制;pnputil、devmgmt.msc 底层大量调用该 DLL。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
配置管理器(CfgMgr)是 Windows 即插即用 PnP 模型中,用户态与内核 pnp.sys 之间的设备状态交互层。内核维护一棵内核设备树,每个硬件节点叫DevNode,用户态通过 cfgmgr32 提供的 CM_* 系列 Native 风格 API 读写、修改 DevNode 状态。
核心能力
- 设备树枚举:遍历
HKLM\SYSTEM\CurrentControlSet\Enum注册表缓存的设备实例信息,查询实例 ID、硬件 ID、总线、问题码、位置、父 / 子设备层级关系。 - DevNode 状态控制:启用、禁用、重启、删除设备实例(DevNode),下发指令通知内核
pnp.sys修改内核设备栈。 - 设备资源查询:获取硬件分配的 IO、IRQ、内存资源、设备服务名、设备栈信息。
- 设备实例元数据读写:读取设备属性、问题状态、容器 ID、总线信息。
核心 API 前缀
CM_:
CM_Get_Device_ID:读取设备实例 IDCM_Get_DevNode_Status:读取设备状态、问题码CM_Disable_DevNode:禁用设备节点CM_Enable_DevNode:启用设备节点CM_Restart_DevNode:重启设备节点(软重加载设备栈)CM_Query_Remove_DevNode/CM_Remove_DevNode:删除设备实例
关键职责划分(重点区分 setupapi.dll)
- ✅ cfgmgr32.dll:设备实例 DevNode、设备树、硬件节点启停 / 删除、硬件状态
- ✅ setupapi.dll:INF 解析、驱动包导入导出、文件复制、注册表驱动包注册、驱动包安装脚本
简化调用栈
上层工具(pnputil.exe / devmgmt.msc)
↓ cfgmgr32.dll (CM_* API,DevNode管理)
↓ 1. 读取注册表 Enum 设备缓存信息
↓ 2. 通过Win32 IPC/内核通信,向 pnp.sys 下发设备控制IRP
↓ 内核 pnp.sys 处理IRP,修改内核设备栈
cfgmgr32不解析 INF,不处理驱动包文件复制;驱动包安装交给 setupapi.dll。
二、依赖文件
| 文件 | 路径 | 角色说明 |
|---|---|---|
cfgmgr32.dll |
System32 | 主库,全部 CM_* 配置管理器 API 实现,设备树枚举、DevNode 控制 |
setupapi.dll |
System32 | 双向调用;cfgmgr32 可调用 SetupAPI 获取驱动包信息;SetupAPI 调用 cfgmgr32 获取设备实例 |
advapi32.dll |
System32 | 注册表读写,读取HKLM\SYSTEM\Enum设备实例树 |
kernel32.dll / ntdll.dll |
System32 | 基础 IO、内存、NtDeviceIoControlFile,用于和内核 pnp.sys 下发 IRP |
crypt32.dll |
System32 | 部分设备属性、驱动签名辅助查询(非核心) |
pnp.sys |
System32\drivers | 内核 PnP 子系统,接收 cfgmgr32 下发的 IO 控制请求,操作内核设备栈 |
运行时业务依赖
- 注册表设备树:
HKLM\SYSTEM\CurrentControlSet\Enum,保存所有设备实例 DevNode 缓存信息;cfgmgr32 枚举设备优先读此注册表。 - 设备类注册表:
HKLM\SYSTEM\CurrentControlSet\Control\Class,设备类 GUID 元数据。 - 权限约束:
- 只读查询(枚举设备、读取设备状态):普通用户权限即可。
- 修改操作(禁用 / 启用 / 删除 / 重启 DevNode):必须管理员权限。
- 总线驱动(pci.sys, usbhub3.sys 等):内核侧,pnp.sys 与总线驱动交互,完成硬件重枚举。
三、依赖关系
链路 1:pnputil /disable-device(禁用设备)
pnputil.exe
↓ cfgmgr32.dll :: CM_Disable_DevNode
↓ ntdll.dll::NtDeviceIoControlFile,向内核pnp.sys发送IRP_MJ_PNP控制请求
↓ pnp.sys 内核卸载该DevNode对应的驱动栈
↓ 更新内核设备节点状态,同步写入注册表Enum节点状态标记
链路 2:pnputil /enum-devices 枚举设备
pnputil.exe
↓ cfgmgr32.dll CM_Get_Device_ID_List_Size / CM_Get_Device_ID_List
↓ advapi32读取HKLM\SYSTEM\Enum注册表
↓ 按参数过滤class/bus/problem/connected等条件
↓ 返回设备实例列表、硬件ID、问题码
链路 3:pnputil /restart-device 软重启设备
pnputil
↓ cfgmgr32::CM_Restart_DevNode
↓ 发送PNP重启IRP到pnp.sys
↓ 内核卸载设备驱动栈,重新加载驱动、重建设备栈
链路 4:pnputil /remove-device 删除设备实例
pnputil
↓ cfgmgr32::CM_Query_Remove_DevNode(预检查是否可删除)
↓ cfgmgr32::CM_Remove_DevNode
↓ pnp.sys 删除内核DevNode,标记设备实例为已移除
↓ 可选/subtree:递归删除所有子DevNode
- 双向调用关系:
- 上层工具可以同时调用
setupapi.dll+cfgmgr32.dll;SetupAPI 在安装驱动时,会调用 cfgmgr32 查询设备实例。 - cfgmgr32 本身不会安装驱动包;驱动安装必须 setupapi。
- 上层工具可以同时调用
- 内核通信:cfgmgr32 通过IOCTL / IRP和 pnp.sys 通信;不是直接调用内核函数。
- 注册表为只读缓存:
HKLM\Enum只是设备状态快照;真实设备状态在内核 pnp.sys 设备树,注册表只是持久化缓存。
四、配套链
系统组件分工
| 组件 | 作用 |
|---|---|
| cfgmgr32.dll | CM_* API,DevNode 设备节点枚举、启用 / 禁用 / 删除 / 重启,设备状态查询 |
| setupapi.dll | INF 解析、驱动包管理、驱动安装(文件复制、注册 oem 驱动) |
| pnp.sys | 内核 PnP,维护内核设备树、IRP 处理、驱动栈加载卸载、总线枚举 |
| drvstore.dll | DriverStore 驱动仓库管理,和 cfgmgr32 无直接调用链路,由 setupapi 中转 |
| pnputil.exe | CLI 入口,组合调用 setupapi+cfgmgr32 实现全套驱动 / 设备管理 |
| devmgmt.msc | 设备管理器 GUI,设备树展示、启用禁用硬件,底层调用 cfgmgr32 为主 |
典型 C 风格 API 示例
// 获取设备实例ID列表
CM_Get_Device_ID_List_Size(&ulSize, NULL, CM_GETIDLIST_FILTER_PRESENT, 0);
CM_Get_Device_ID_LIST(pBuffer, ulSize, CM_GETIDLIST_FILTER_PRESENT,0);
// 禁用指定DevNode
CM_Disable_DevNode(hDevNode, CM_DISABLE_POLICY_IGNORE);
安全视角
- 管理员权限下,可通过 cfgmgr32 API 批量禁用、删除硬件设备(网卡、磁盘、安全软件驱动设备节点),属于红队常用硬件子系统对抗手段。
- 部分 PPL 受保护进程对应的设备节点,即便管理员调用 CM_Disable_DevNode 也会返回拒绝,内核 pnp.sys 做保护拦截。
- 旧版本 cfgmgr32 存在本地提权、信息泄露类 CVE 漏洞,多集中在设备属性解析逻辑。
五、逻辑链路
链路 1:只读枚举设备(enum-devices)
- 上层调用 cfgMgr32 CM_Get_Device_ID_List。
- cfgmgr32 读取
HKLM\SYSTEM\Enum注册表缓存。 - 根据传入参数(class、bus、problem、connected)筛选设备节点。
- 读取设备属性、硬件 ID、问题码、父子层级。
- 返回数据给调用程序。
此链路不与内核 pnp.sys 交互,仅读取注册表缓存。
链路 2:禁用设备 DevNode
- 调用
CM_Disable_DevNode,传入设备实例句柄。 - cfgmgr32 构造 PNP IO 控制包,通过 NtDeviceIoControlFile 下发 IRP 到 pnp.sys。
- pnp.sys 内核接收 IRP,执行设备停止、卸载设备驱动栈。
- 内核更新 DevNode 状态,同步写入注册表 Enum 节点状态标记。
- 返回执行结果给 cfgmgr32,返回上层程序。
链路 3:删除设备实例 remove-device
CM_Query_Remove_DevNode:预校验设备是否允许移除(部分关键系统设备禁止删除)。CM_Remove_DevNode:下发 IRP 到 pnp.sys。- 内核销毁该 DevNode 节点;
/subtree递归遍历并删除全部子 DevNode。 - 注册表 Enum 中保留旧设备记录,标记为已断开。
⚠️ 物理硬件还存在时,
pnputil /scan-devices触发总线扫描后,pnp.sys 会重新创建 DevNode。
链路 4:restart-device 软重启设备
- CM_Restart_DevNode 发送 PNP 重启 IRP。
- pnp.sys 停止设备,卸载驱动栈,然后重新启动设备、加载驱动。
- 设备节点保留,只是驱动栈重建。
六、边界(约束、坑点、失效条件)
1. 权限边界
- 只读枚举 API:普通用户可调用。
- 修改类 API(Enable/Disable/Restart/Remove DevNode)必须管理员权限;UAC 未提升直接返回错误码。
- PPL 受保护设备节点:内核 pnp.sys 拦截操作,cfgmgr32 调用直接返回失败,即使管理员。
2. 注册表缓存边界
HKLM\Enum是缓存快照,不是实时内核设备树;长时间不扫描硬件,注册表缓存和内核真实设备状态可能不一致。执行pnputil /scan-devices会同步刷新。- 不要手动直接修改 HKLM\Enum 注册表;破坏后 cfgmgr32 枚举异常、设备管理器报错。
3.DevNode 操作边界
CM_Remove_DevNode:仅删除用户态可见设备实例记录,不删除驱动包;驱动包仍保存在 DriverStore,硬件存在则重扫描自动重建 DevNode。CM_Disable_DevNode:禁用状态持久化保存;重启系统后设备依旧保持禁用。restart-device是设备层面软重启,不是整机重启,仅重建单个设备驱动栈。- 系统关键核心设备(系统磁盘、启动总线),禁止删除 / 禁用,内核直接拒绝 IRP 请求,防止系统崩溃。
4. 与 setupapi.dll 边界(高频混淆点)
- cfgmgr32:只管设备实例节点状态,不碰 INF、驱动包文件。
- setupapi.dll:只管驱动包、INF 脚本、文件复制、驱动包入库,不能直接禁用设备。
完整驱动安装流程:setupapi 把驱动包放入 DriverStore → cfgmgr32 创建设备 DevNode,pnp.sys 加载驱动。
5. 内核通信边界
- cfgmgr32 不能直接调用内核函数;全部设备控制请求通过 IOCTL/IRP 交由 pnp.sys 处理。
- 设备操作存在异步场景:部分 PNP 操作 IRP 排队,API 返回成功,但内核侧操作还未完成。
6. 高频认知误区
- ❌ cfgmgr32.dll 是内核组件;✅ 用户态 DLL,运行在应用层,通过 IRP 和内核通信。
- ❌ 删除 DevNode 等于卸载驱动包;❌ 完全两回事,remove-device 只删设备实例,驱动包仍在 DriverStore。
- ❌ 枚举设备时直接扫描硬件总线;✅ 默认读取注册表缓存;真正总线扫描由
pnp.sys(scan-devices 触发)执行。 - ❌ cfgmgr32 可以解析 INF;✅ 完全不支持 INF 解析,INF 属于 setupapi 的职责。
cfgmgr32.dll 组件分工简表
| 组件 | 位置 | 职责 |
|---|---|---|
| cfgmgr32.dll | System32 | CM_* API,设备树枚举、DevNode 启用 / 禁用 / 重启 / 删除,设备状态查询 |
| setupapi.dll | System32 | INF 解析、驱动包导入、驱动包安装 |
| pnp.sys | System32\drivers | 内核 PnP 子系统,内核设备树、IRP 处理、驱动栈管理 |
| pnputil.exe | System32 | 命令行前端,组合调用 setupapi 与 cfgmgr32 |
| devmgmt.msc | MMC 设备管理器 GUI,设备节点管理,大量调用 cfgmgr32 |
advapi32.dll 完整解构
文件路径:
C:\Windows\System32\advapi32.dll定位:Windows 高级 API(Advanced API)用户态系统库,底层封装系统安全、注册表、服务、LSA、审计、权限、加密基础能力;是 Windows 安全子系统核心用户态入口;setupapi.dll/cfgmgr32.dll/pnputil.exe 均大量依赖 advapi32。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
advapi32.dll 本质是用户态封装层,把 Windows 内核安全、注册表、服务控制、审计相关的原生系统调用包装成 Win32 API,分为四大核心业务模块:
- 注册表操作模块:读写、创建、删除注册表项 / 键值(
RegOpenKeyEx、RegSetValueEx、RegDeleteKey),setupapi.dll、cfgmgr32.dll读取HKLM\SYSTEM\Enum、HKLM\System\Control\Class设备注册表全依赖这套 API。 - Windows 服务控制模块(SCM):与
services.exe服务控制管理器通信,创建、删除、启动、停止内核驱动服务与 Win32 服务(OpenSCManager,CreateServiceA/W,StartService),INF 的AddService指令底层调用此模块注册驱动服务。 - 安全与 LSA 模块:访问本地安全机构 LSA,SID、访问令牌、ACL / 安全描述符、权限调整、用户组、权限启用(
OpenProcessToken,AdjustTokenPrivileges,GetSecurityDescriptor)。 - 系统审计与日志模块:事件日志写入、安全审计事件上报(
ReportEvent)。
重要区分:advapi32不实现内核功能;所有底层能力,最终转发至内核
ntoskrnl.exe、lsass.exe(LSA)、services.exe(SCM)。
核心 API 分组:
- Reg* 系列:注册表全套读写
- OpenSCManager / ControlService / CreateService:服务控制管理器 SCM 交互
- AdjustTokenPrivileges、OpenProcessToken:令牌权限操作
- RegQueryInfoKey、RegEnumKeyEx:注册表枚举
简化调用栈
上层程序(setupapi.dll / cfgmgr32.dll / pnputil.exe)
↓ advapi32.dll (Win32高级API封装)
├─注册表API → ntdll.dll → NtCreateKey/NtSetValueKey → ntoskrnl.exe (注册表内核配置管理器cm.sys)
├─服务SCM API → RPC → services.exe (服务控制管理器进程)
└─安全/LSA API → RPC → lsass.exe (本地安全机构)
二、依赖文件
| 文件 | 路径 | 角色说明 |
|---|---|---|
advapi32.dll |
System32 | 主库,实现 Reg 注册表、SCM 服务、LSA 安全、审计事件 Win32 API |
ntdll.dll |
System32 | 原生系统调用层;advapi32 所有内核请求通过 ntdll 发起 Nt * 系统调用 |
kernel32.dll |
System32 | 基础句柄、内存、进程句柄管理 |
rpcrt4.dll |
System32 | RPC 远程过程调用;SCM 服务、LSA 本地安全机构,依赖 RPC 与 services.exe/lsass.exe 跨进程通信 |
lsass.exe |
System32 | 本地安全机构进程;安全描述符、SID、令牌、权限校验后端 |
services.exe |
System32 | 服务控制管理器 SCM 进程;所有服务 / 驱动注册启停后端 |
cm.sys |
System32\drivers | 内核配置管理器,内核注册表实现 |
crypt32.dll |
System32 | 辅助:部分安全描述符、证书相关协同调用 |
运行时业务依赖
- 注册表内核组件
cm.sys:存储 HKLM/HKCU 等配置,所有 Reg*API 最终操作内核配置管理器。 - 两个关键系统进程:
services.exe:SCM,管理驱动服务、win32 服务。INF AddService 注册内核驱动服务,由 SCM 维护。lsass.exe:LSA 本地安全机构,负责安全策略、访问令牌、ACL 校验。
- 权限模型:
- 只读注册表:普通用户大多允许
- 修改 HKLM 系统注册表、创建 / 删除系统服务:管理员权限,部分操作需要
SeSecurityPrivilege等特权。
三、依赖关系
链路 1:setupapi.dll 调用 advapi32,INF AddReg 写入设备注册表
setupapi.dll INF解析引擎
↓ advapi32::RegCreateKeyEx / RegSetValueEx
↓ ntdll NtSetValueKey
↓ cm.sys内核注册表管理器写入HKLM\SYSTEM\Control\Class
链路 2:setupapi INF AddService 注册内核驱动服务
setupapi.dll
↓ advapi32::OpenSCManager + CreateServiceW
↓ rpcrt4.dll RPC IPC
↓ services.exe (SCM服务控制管理器)
↓ SCM写入注册表HKLM\SYSTEM\CurrentControlSet\Services,记录驱动服务信息
链路 3:cfgmgr32.dll 枚举设备,读取 HKLM\SYSTEM\Enum 设备树
cfgmgr32.dll
↓ advapi32::RegOpenKeyEx / RegEnumKeyEx
↓ ntdll → cm.sys读取注册表缓存设备实例信息
链路 4:权限提升,启用系统特权(例如 SeLoadDriverPrivilege)
应用程序
↓ advapi32::OpenProcessToken + AdjustTokenPrivileges
↓ rpcrt4 RPC → lsass.exe LSA校验并修改令牌特权
- 调用方向:上层组件(setupapi/cfgmgr32/pnputil)→ advapi32.dll → ntdll /rpcrt4 → 内核 cm.sys 或系统服务进程
services.exe/lsass.exe - 职责边界:advapi32 只是API 封装转发层,不保存注册表数据、不管理服务生命周期、不维护安全策略,全部交给后端进程 / 内核。
- RPC 依赖:SCM、LSA 不是内核调用,是用户态跨进程 RPC 通信,所以 advapi32 强依赖 rpcrt4.dll。
四、配套链
系统组件分工
| 组件 | 作用 |
|---|---|
| advapi32.dll | Win32 高级 API 封装:注册表、SCM 服务控制、LSA 安全令牌、事件审计 |
| ntdll.dll | 原生 Nt 系统调用入口,advapi32 到内核的桥梁 |
| rpcrt4.dll | RPC 跨进程通信,用于和 services.exe、lsass.exe 交互 |
| cm.sys | 内核配置管理器,内核注册表存储后端 |
| services.exe | SCM 服务控制管理器,管理 Win32 服务、内核驱动服务 |
| lsass.exe | LSA 本地安全机构,安全策略、访问令牌、SID、ACL 校验后端 |
| setupapi.dll | 调用 advapi32 执行 INF AddReg/AddReg,注册驱动服务 |
| cfgmgr32.dll | 调用 advapi32 读取 HKLM\Enum 设备树注册表 |
典型 API 代码片段
// 打开注册表项
RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Enum", 0, KEY_READ, &hKey);
// 打开服务控制管理器句柄
OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
安全视角
- 注册表写入、服务创建 API 是红队高频利用入口:管理员权限下可注册恶意内核驱动服务、修改系统配置注册表项。
- 大量历史高危 CVE 漏洞集中在 advapi32 的安全描述符、注册表参数解析逻辑,存在本地提权、信息泄露风险。
- UAC 会拦截普通用户调用 advapi32 的高权限操作,未提升管理员时,修改 HKLM、创建服务直接返回拒绝访问。
五、逻辑链路
链路 1:读取注册表(cfgmgr32 枚举设备)
- cfgmgr 调用 advapi32
RegOpenKeyEx打开HKLM\SYSTEM\Enum。 - advapi32 调用 ntdll NtOpenKey,发起系统调用。
- 内核
cm.sys查找注册表配置单元,返回键数据。 - advapi32 将内核返回数据包装为 Win32 结果返回给 cfgmgr32。
只读链路,不修改任何持久化数据。
链路 2:INF AddReg,写入系统注册表(setupapi)
- setupapi 解析 INF AddReg 区段,调用 advapi32 RegCreateKeyEx / RegSetValueEx。
- advapi32 通过 ntdll 发起 Nt 系统调用。
- cm.sys 写入配置单元,持久化注册表。
- 返回操作结果。
链路 3:INF AddService,注册内核驱动服务
- setupapi 调用 advapi32
OpenSCManager打开 SCM 管理器。 - advapi32 使用 rpcrt4 建立 RPC 连接到 services.exe 进程。
- 调用
CreateServiceW,SCM 将驱动服务信息写入HKLM\SYSTEM\CurrentControlSet\Services注册表。 - SCM 维护服务数据库,标记为内核驱动类型。
链路 4:调整令牌特权(加载驱动所需权限)
- 程序调用 advapi32
OpenProcessToken拿到进程令牌句柄。 AdjustTokenPrivileges请求启用特权。- RPC 调用 lsass.exe LSA 校验权限策略,修改访问令牌。
- 返回结果,进程获得对应系统特权。
六、边界(约束、坑点、失效条件)
1. 权限边界
- 只读注册表项(HKLM 部分只读分支):普通用户可执行。
- 写入 HKLM 系统注册表、创建 / 删除系统驱动服务、修改安全描述符:必须管理员提升权限;UAC 未提升返回 ERROR_ACCESS_DENIED。
- 部分特权如
SeLoadDriverPrivilege默认只分配给管理员账户,普通用户令牌不含该特权,AdjustTokenPrivileges 启用失败。
2. 注册表边界
- advapi32 的 Reg*API 操作的是内核
cm.sys维护的注册表配置单元;advapi32不直接读取磁盘上的 hive 文件。 - 注册表句柄存在引用计数,忘记关闭句柄会造成句柄泄漏。
- 部分注册表项存在 ACL 保护(例如 HKLM\SECURITY),即使管理员默认也无法直接读取。
3.SCM 服务边界
- CreateService 仅写入服务注册表,不会自动加载内核驱动;SCM 只在启动服务时加载驱动。
- 内核驱动服务类型 SERVICE_KERNEL_DRIVER,需要驱动 sys 文件存在,否则服务启动失败。
- services.exe 崩溃会导致 advapi32 所有 SCM 相关 API 调用全部失败,返回 RPC 通信错误。
4.RPC 与进程边界
- advapi32 和 lsass/services 是跨进程 RPC 通信,不是内核调用;lsass 进程崩溃,所有 LSA 安全相关 API 调用全部失效。
- RPC 存在超时、通道断开场景,高并发下会出现临时调用失败。
5. 职责边界(高频混淆)
✅ advapi32:Win32 包装层,转发注册表、SCM、LSA 请求 ❌ advapi32:不存储注册表 hive、不运行服务、不校验安全策略,后端由 cm.sys、services.exe、lsass 完成
6. 高频认知误区
- ❌ advapi32.dll 是内核模块;✅ 用户态 DLL,运行在应用层,依靠 ntdll 系统调用、RPC 和内核 / 系统进程交互。
- ❌ Reg*API 直接读写磁盘上的注册表 hive 文件;✅ 由内核 cm.sys 管理 hive 缓存,advapi32 操作内核注册表抽象层。
- ❌ CreateService 会立刻加载内核驱动;✅ 仅注册服务元数据,调用 StartService 才通知 SCM 加载驱动。
- ❌ advapi32 只给 setupapi/cfgmgr 使用;✅ 全系统大量程序依赖,包括 services、事件查看器、组策略等。
advapi32.dll 组件分工简表
| 组件 | 位置 | 职责 |
|---|---|---|
| advapi32.dll | System32 | Win32 高级 API 封装:注册表、SCM 服务、LSA 安全令牌、事件审计 |
| ntdll.dll | System32 | 原生 Nt 系统调用 |
| rpcrt4.dll | System32 | RPC 跨进程通信 |
| cm.sys | 内核 | 注册表配置管理器 |
| services.exe | 用户态进程 | SCM 服务控制管理器后端 |
| lsass.exe | 用户态进程 | LSA 本地安全机构后端 |
| setupapi.dll | System32 | 调用 advapi32 完成 INF AddReg/AddService |
| cfgmgr32.dll | System32 | 调用 advapi32 读取设备注册表 Enum |
pnp.sys 完整解构
文件路径:
C:\Windows\System32\drivers\pnp.sys定位:Windows 即插即用(Plug and Play)内核驱动,PnP 子系统内核核心;内核设备树、DevNode 生命周期、PNP IRP 处理、驱动栈枚举 / 构建 / 销毁、硬件热插拔、驱动加载协调全部由 pnp.sys 主控;cfgmgr32.dll、setupapi.dll、pnputil.exe均是用户态前端,真正硬件设备管理的内核逻辑全部在 pnp.sys。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
pnp.sys 属于内核模式 WDF/WDM 驱动框架下的核心总线驱动,系统启动早期由 ntoskrnl 加载,负责维护内核设备树(Kernel Device Tree)。树中每个节点为内核 DevNode,对应一个硬件 / 虚拟设备。 pnp.sys 的核心工作就是处理 PNP IRP(IRP_MJ_PNP),这是整套 Windows 即插即用的消息模型。
四大核心能力
- 内核设备树维护:创建、枚举、标记、销毁内核 DevNode;记录设备状态、总线类型、实例 ID、硬件 ID、设备栈、PDO/FDO。
- PDO:物理设备对象(总线驱动创建,代表真实硬件)
- FDO:功能设备对象(功能驱动创建,实现设备业务能力)
- PNP IRP 调度:IRP_MJ_PNP 是整套 PnP 的核心报文,包含子功能码:启动设备、停止设备、删除设备、查询资源、查询移除、重新枚举等。IRP 沿着设备栈从 PDO 向上逐层传递。
- 驱动加载协调:收到用户态请求 / 总线枚举到硬件 → 通知用户态 PnP 管理器,匹配 Driver INF → SCM 加载.sys 驱动文件 → 构造设备栈。
- 热插拔、资源分配:PCI/USB 等总线上报设备插入 / 拔出,pnp.sys 响应;分配 IO 地址、IRQ、内存资源给设备。
关键区分:
- 用户态:cfgmgr32.dll(DevNode 控制 API)、setupapi.dll(INF / 驱动包管理),只发请求,不操作内核设备树
- 内核态:pnp.sys,真正维护内核设备树,处理 IRP,控制设备启停
简化调用栈
上层应用(pnputil / devmgmt.msc)
↓ cfgmgr32.dll (CM_* API)
↓ ntdll.dll NtDeviceIoControlFile
↓ pnp.sys 接收IOCTL,转换生成 IRP_MJ_PNP
↓ 下发IRP到设备栈(总线驱动、功能驱动)
↓ 结果原路逐层返回
二、依赖文件
| 文件 | 路径 | 角色说明 |
|---|---|---|
pnp.sys |
System32\drivers | PnP 内核主驱动,PNP IRP 处理器、内核设备树管理器 |
ntoskrnl.exe |
System32 | Windows 内核主程序;内存管理、对象管理器、I/O 管理器、驱动加载基础服务 |
iomgr(内置 ntoskrnl) |
内核 I/O 管理器 | IRP 创建、I/O 请求分发、设备对象管理,pnp.sys 强依赖 I/O 管理器 |
cm.sys |
System32\drivers | 内核配置管理器(注册表内核层);持久化 DevNode、硬件配置、驱动服务信息 |
wdf01000.sys |
System32\drivers | WDF 框架;现代驱动大多基于 WDF,pnp.sys 协同 WDF 处理设备生命周期 |
bus驱动(pci.sys / usbhub.sys / acpi.sys) |
System32\drivers | 底层总线驱动;检测硬件插拔、枚举子设备,向上通知 pnp.sys |
cfgmgr32.dll |
System32 | 用户态 API 库,通过 IOCTL 和 pnp.sys 通信,下发设备启停 / 删除指令 |
setupapi.dll |
System32 | 用户态 INF / 驱动包管理;pnp.sys 发现硬件后,通知用户态 PnP 管理器调用 setupapi 匹配驱动 |
运行时业务依赖
- I/O 管理器(I/O Manager,ntoskrnl 内部组件):IRP 的创建、排队、完成回调,pnp.sys 完全依赖 I/O 管理器。
- 内核配置管理器
cm.sys:内核设备树的持久化存储;DevNode 状态、硬件 ID、驱动关联信息写入内核注册表 Hive。 - 总线驱动(ACPI、PCI、USB):硬件探测源;pnp.sys 本身不直接扫描硬件,由总线驱动上报设备变更事件。
- 用户态 PnP 管理器(内置在
cfgmgr32.dll相关用户态组件):负责驱动匹配、INF 查找,内核 pnp.sys 触发设备枚举后,回调用户态做驱动查找。
三、依赖关系
链路 1:pnputil /disable-device(cfgmgr32 禁用设备)
pnputil.exe
↓ cfgmgr32::CM_Disable_DevNode
↓ ntdll NtDeviceIoControlFile,发送IOCTL_PNP控制码
↓ pnp.sys 接收请求,生成IRP_MJ_PNP + IRP_MN_STOP_DEVICE
↓ IRP沿着设备栈向下传递,通知FDO/PDO停止设备、释放硬件资源
↓ pnp.sys 更新内核DevNode状态
↓ cm.sys持久化状态到注册表HKLM\SYSTEM\Enum
链路 2:总线检测新硬件(USB 插入,pnp.sys 枚举设备)
usbhub.sys(总线驱动)检测到USB设备插入
↓ 上报设备检测事件给 pnp.sys
↓ pnp.sys 创建内核DevNode,创建设备对象PDO
↓ 通知用户态PnP管理器
↓ setupapi.dll 查找DriverStore中INF,匹配硬件ID
↓ SCM(advapi32)加载对应功能驱动xxx.sys
↓ pnp.sys构造完整设备栈,发送IRP_MN_START_DEVICE启动硬件
链路 3:pnputil /remove-device 删除设备实例
pnputil
↓ cfgmgr32::CM_Remove_DevNode
↓ IOCTL下发到pnp.sys
↓ pnp.sys发送IRP_MN_QUERY_REMOVE_DEVICE(预检查是否可移除)
↓ IRP_MN_REMOVE_DEVICE:销毁设备栈、释放设备对象
↓ 内核DevNode标记为已删除;cm.sys在注册表保留历史记录
- 调用方向:用户态 (cfgmgr32) → IOCTL → pnp.sys(内核) → IRP 下发到总线 / 功能驱动
- 职责边界:
- pnp.sys不会解析 INF,不管理 DriverStore;驱动包管理交给用户态 setupapi/drvstore。
- pnp.sys不能直接读写磁盘文件;加载驱动 sys 文件由 I/O 管理器 + 内存管理器完成。
- 事件双向通信:总线驱动向上通知 pnp 硬件变更;pnp.sys 回调用户态 PnP 管理器完成驱动匹配。
四、配套链
系统组件分工
| 组件 | 运行层 | 作用 |
|---|---|---|
| pnp.sys | 内核 | PnP 核心,内核设备树维护、IRP_MJ_PNP 处理、设备生命周期管理 |
| ntoskrnl + I/O 管理器 | 内核 | IRP 创建、I/O 请求分发、驱动对象管理 |
| cm.sys | 内核 | 内核注册表,持久化 DevNode 配置 |
| acpi.sys / pci.sys / usbhub.sys | 内核 | 总线驱动,硬件探测、子设备枚举,硬件事件上报 pnp.sys |
| wdf01000.sys | 内核 | WDF 驱动框架,辅助现代驱动处理 PnP 事件 |
| cfgmgr32.dll | 用户态 | CM_* API,向 pnp.sys 下发设备启停 / 删除指令,读取 DevNode 状态 |
| setupapi.dll | 用户态 | INF 解析、驱动包匹配、DriverStore 管理,为 pnp 提供驱动信息 |
| advapi32.dll | 用户态 | SCM 服务 API,加载内核驱动服务 |
安全视角
- 内核层攻击面:pnp.sys 历史存在多个高危 CVE,大多是 PNP IRP 处理逻辑内存损坏漏洞,可实现本地内核提权 (LPE)。
- 恶意驱动可以伪造总线 PDO,和 pnp.sys 交互,注册虚拟设备,用于隐藏进程、文件过滤、内核后门。
- PPL/PPL 保护的设备节点:pnp.sys 内置保护逻辑,收到删除 / 禁用 IRP 时直接拒绝,普通管理员也无法移除。
五、逻辑链路
链路 1:硬件热插拔(设备插入完整 PnP 流程)
- 总线驱动 (usbhub/pci/acpi) 检测硬件,创建 PDO 物理设备对象。
- 总线驱动通知 pnp.sys,pnp.sys 新建内核 DevNode。
- pnp.sys 发起回调到用户态 PnP 管理器。
- 用户态调用 setupapi,基于硬件 ID 在 DriverStore 查找匹配 INF 驱动包。
- SCM 加载对应的功能驱动(xxx.sys),创建 FDO 功能设备对象,挂载到设备栈。
- pnp.sys 发送
IRP_MN_START_DEVICE,驱动初始化硬件、申请内存 / IO 资源。 - pnp.sys 更新内核 DevNode 状态,cm.sys 将设备信息写入
HKLM\SYSTEM\Enum注册表持久化。
链路 2:禁用设备(pnputil /disable-device)
- cfgmgr32 收到上层请求,发送 IOCTL 到 pnp.sys。
- pnp.sys 生成 IRP_MN_STOP_DEVICE,沿着设备栈自上而下传递。
- 功能驱动收到 IRP,停止硬件、释放硬件资源。
- pnp.sys 标记 DevNode 为禁用状态,同步写入注册表。
- 返回执行结果给用户态。
链路 3:设备软重启(pnputil /restart-device)
- cfgmgr32 下发指令到 pnp.sys。
- pnp.sys 发送 IRP_MN_STOP_DEVICE 停止设备,释放资源。
- 再发送 IRP_MN_START_DEVICE,重新初始化驱动与硬件。
- 设备栈保留,仅硬件上下文重置。
链路 4:设备删除(remove-device)
- pnp.sys 发送 IRP_MN_QUERY_REMOVE_DEVICE:询问设备栈是否允许移除。
- 设备驱动确认可移除 → IRP_MN_REMOVE_DEVICE。
- 驱动卸载 FDO,释放资源;pnp.sys 销毁内核 DevNode。
- cm.sys 在注册表保留旧设备记录,标记为已移除。
六、边界(约束、坑点、失效条件)
1. 权限边界
- 用户态发起禁用 / 删除设备:必须管理员权限;普通用户调用 cfgmgr32 会返回拒绝,IOCTL 请求无法下发到 pnp.sys。
- 内核侧 pnp.sys 执行 IRP,不受用户态权限直接控制;但会校验设备 PPL 保护标记,受保护设备直接拦截删除 / 停止 IRP。
2. 职责边界(极易混淆)
✅ pnp.sys:内核设备树、PNP IRP、设备生命周期、硬件事件协调 ❌ pnp.sys:不解析 INF、不维护 DriverStore、不复制驱动文件、不处理数字签名,全部交给用户态 setupapi+drvstore
3. IRP 边界
- IRP 是同步 / 异步混合模型;部分 PNP 操作是异步排队,IOCTL 返回成功,内核 IRP 可能还在设备栈处理中。
- IRP 沿设备栈逐层传递,下层驱动可以拒绝 IRP;例如磁盘驱动拒绝 QueryRemove,设备无法被删除。
- 非法构造恶意 PNP IRP 是经典内核漏洞攻击向量。
4. 硬件枚举边界
- pnp.sys不会直接扫描 PCI/USB 总线;硬件探测完全依赖底层总线驱动(pci.sys、usbhub.sys、acpi.sys)上报事件。总线驱动失效,则 pnp 无法发现新硬件。
- 注册表 HKLM\Enum 只是快照缓存;真实设备状态在内核 pnp.sys 设备树。注册表与内核不一致,执行
pnputil /scan触发总线重枚举同步。
5. 系统稳定性边界
- 系统启动关键设备(系统磁盘、启动总线),pnp.sys 禁止接收停止 / 删除 IRP,防止 BSOD。
- 设备驱动 IRP 处理异常(死锁、内存损坏),会被 pnp.sys 捕获,触发蓝屏 (BSOD)。
6. 高频认知误区
- ❌ pnp.sys 是用户态组件;✅ 内核模式驱动,在内核态运行。
- ❌ pnp.sys 负责查找驱动 INF;✅ 驱动匹配、INF 解析完全在用户态 setupapi。
- ❌ 删除 DevNode 会删除 DriverStore 里的驱动包;❌ 两者独立;remove-device 仅销毁内核设备节点,驱动包仍保留在 DriverStore。
- ❌ pnp.sys 直接访问硬件寄存器;❌ pnp.sys 是管理协调层;硬件寄存器访问由总线驱动 / 功能驱动完成。
pnp.sys 组件分工简表
| 组件 | 位置 | 职责 |
|---|---|---|
| pnp.sys | 内核驱动 | 内核设备树维护、IRP_MJ_PNP 分发、设备生命周期管理 |
| ntoskrnl I/O 管理器 | 内核 | IRP 创建、I/O 请求调度 |
| cm.sys | 内核驱动 | 内核注册表,持久化设备实例信息 |
| pci.sys/acpi.sys/usbhub.sys | 内核驱动 | 底层总线硬件探测,上报设备事件 |
| cfgmgr32.dll | 用户态 | 用户态 DevNode 控制 API,下发 IOCTL 至 pnp.sys |
| setupapi.dll | 用户态 | INF 解析,驱动包匹配 |
drvstore.dll 完整解构
文件路径:
C:\Windows\System32\drvstore.dll定位:Driver Store(驱动程序存储区)用户态核心库,专门负责管理%SystemRoot%\System32\DriverStore\FileRepository驱动仓库;和setupapi.dll深度协同,完成驱动包导入、校验、版本管理、哈希校验、引用计数、驱动包删除;是 Windows 驱动隔离机制的核心组件。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
Driver Store 是 Windows Vista 引入的驱动隔离沙箱机制:驱动包预先复制到系统受保护的FileRepository目录,所有设备使用的驱动都从这个仓库加载,不直接使用下载目录 / 安装包内原始文件;drvstore.dll就是这套仓库的管理引擎。
核心能力
- 驱动包完整性校验:校验驱动包文件哈希、数字签名;防止篡改驱动文件。
- 驱动包导入 / 导出:把 INF+SYS + 配套文件复制进 FileRepository 目录,生成仓库元数据。
- 引用计数管理:记录有多少设备实例正在引用该驱动包;只有引用计数 = 0 时,驱动包才允许删除,防止正在使用的驱动被误删。
- 驱动包版本与重复检测:对比 INF 内版本、厂商、硬件 ID,避免重复导入完全相同驱动包。
- 仓库元数据维护:维护
DriverStore注册表配置项,记录每个驱动包的目录名称、哈希、引用计数、原始 INF 路径。
职责边界区分
setupapi.dll:INF 解析,调用 drvstore 执行仓库操作;drvstore.dll:只管理 DriverStore 仓库本身,不做设备枚举、不处理 PNP IRP,不操作内核设备树;pnp.sys:内核 PnP,加载驱动文件(从 FileRepository 读取 sys),和 drvstore 无直接调用链路。
简化调用栈
pnputil.exe / 第三方驱动安装程序
↓ setupapi.dll (SetupCopyOemInf / SetupUninstallOemInf)
↓ drvstore.dll (驱动仓库核心逻辑)
├─ crypt32.dll 驱动签名校验
├─ advapi32.dll 注册表读写(DriverStore元数据)
└─ kernel32.dll / ntdll.dll 文件IO,复制文件到FileRepository
二、依赖文件
| 文件 | 路径 | 角色说明 |
|---|---|---|
drvstore.dll |
System32 | DriverStore 核心库,驱动包入库、校验、引用计数、仓库元数据管理 |
setupapi.dll |
System32 | 主调用方;SetupAPI 驱动包安装 / 卸载 API 内部调用 drvstore |
crypt32.dll |
System32 | 驱动包数字签名、证书链校验;入库前校验驱动签名 |
advapi32.dll |
System32 | 读写 DriverStore 相关注册表元数据项 |
kernel32.dll / ntdll.dll |
System32 | 文件 IO、目录操作、文件哈希计算、文件复制,访问 FileRepository |
cfgmgr32.dll |
System32 | 间接依赖:查询设备实例,统计驱动包引用计数(由 setupapi 中转) |
ntoskrnl.exe + cm.sys |
内核 | 内核注册表,持久化 DriverStore 元数据 |
运行时业务依赖
- 文件仓库目录:
C:\Windows\System32\DriverStore\FileRepository,NTFS ACL 强保护,普通用户无读写权限。 - 注册表元数据:
HKLM\SYSTEM\CurrentControlSet\Control\DriverStore,保存所有驱动包索引、哈希、引用计数。 - 权限约束:驱动包导入、删除操作必须管理员权限;仅查询驱动包列表可以普通用户执行。
- 驱动签名策略:由
crypt32.dll结合系统驱动签名策略(安全启动、测试签名)校验。
三、依赖关系
链路 1:pnputil /add-driver 导入驱动包
pnputil.exe
↓ setupapi.dll::SetupCopyOemInf
↓ drvstore.dll
1. 读取INF,收集全部关联文件(.sys/.dll等)
2. crypt32校验驱动包数字签名
3. 计算全部文件哈希,校验文件完整性
4. 检查仓库内是否已存在同版本同哈希驱动包,避免重复入库
5. 复制全部文件到FileRepository子目录
6. advapi32写入HKLM\SYSTEM\Control\DriverStore元数据,初始化引用计数=0
链路 2:设备绑定驱动包(pnp.sys 匹配驱动后,引用计数 + 1)
pnp.sys发现硬件,通知用户态PnP管理器
↓ setupapi匹配仓库内驱动包
↓ drvstore.dll:驱动包引用计数 +1
↓ pnp.sys从FileRepository加载.sys驱动文件
链路 3:pnputil /delete-driver 删除驱动包
pnputil.exe
↓ setupapi::SetupUninstallOemInf
↓ drvstore.dll
1. 查询该oem驱动包引用计数
2. 引用计数>0 → 拒绝删除(正在被设备使用)
3. 引用计数=0 → 删除FileRepository目录
4. advapi32清理DriverStore注册表元数据
- 调用方向:上层程序 → setupapi.dll → drvstore.dll → crypt32/advapi32/kernel32
- 单向调用:drvstore 不会主动调用 setupapi;由 SetupAPI 作为入口发起驱动仓库操作。
- 与内核 pnp.sys:无直接调用链路;pnp.sys 仅读取 FileRepository 内的 sys 文件,不感知 drvstore 的引用计数逻辑;引用计数维护完全在用户态 drvstore。
四、配套链
系统组件分工
| 组件 | 运行层 | 作用 |
|---|---|---|
| drvstore.dll | 用户态 | DriverStore 仓库管理:入库、哈希校验、引用计数、元数据、驱动包删除 |
| setupapi.dll | 用户态 | INF 解析,对外暴露 SetupCopyOemInf 等 API,作为 drvstore 的调用入口 |
| crypt32.dll | 用户态 | 驱动数字签名校验 |
| advapi32.dll | 用户态 | 读写 DriverStore 注册表索引 |
| cfgmgr32.dll | 用户态 | 枚举设备实例,统计哪些设备绑定对应驱动包,计算引用计数 |
| pnp.sys | 内核 | 从 FileRepository 加载驱动 sys,设备生命周期,不操作驱动仓库元数据 |
| cm.sys | 内核 | 内核注册表,持久化 DriverStore 配置 |
| pnputil.exe | 用户态 CLI | 驱动管理命令行工具,调用 setupapi 完成入库删除 |
安全视角
- 驱动包篡改防护:入库时记录文件哈希;加载驱动前校验,防止恶意替换 FileRepository 内 sys 文件。
- 旧版本 drvstore 存在 CVE,存在驱动包本地提权漏洞,恶意构造 INF 绕过校验写入 FileRepository。
- FileRepository 目录 ACL 严格保护,默认普通用户无法写入;管理员权限才能新增 / 删除驱动包。
- 驱动包引用计数机制防止正在运行的驱动被删除,避免 BSOD。
五、逻辑链路
链路 1:驱动包入库(add-driver)
- setupapi 传入 INF 路径,调用 drvstore 入口函数。
- drvstore 读取 INF,收集所有关联文件列表。
- crypt32 校验驱动包数字签名;签名不合法直接终止。
- 计算所有文件 SHA 哈希,校验文件完整性。
- 查询 DriverStore 注册表,判断该驱动包是否已存在,避免重复导入。
- 复制全部驱动文件到 FileRepository 生成唯一命名的子文件夹。
- 在
HKLM\SYSTEM\Control\DriverStore写入元数据,初始化引用计数为 0。
链路 2:设备绑定驱动包(引用计数增加)
- pnp.sys 枚举硬件,用户态 PnP 管理器通过 setupapi 匹配仓库内驱动包。
- drvstore 将此驱动包引用计数 + 1。
- pnp.sys 读取 FileRepository 内的.sys 驱动文件,加载到内核,创建设备栈。
链路 3:设备卸载,解除驱动绑定(引用计数减少)
- 设备被删除 / 卸载,setupapi 通知 drvstore。
- drvstore 驱动包引用计数 - 1。
- 引用计数 > 0:驱动包保留在仓库,供其他设备继续使用。
- 引用计数 = 0:驱动包处于闲置状态,允许删除。
链路 4:删除驱动包(delete-driver)
- setupapi 调用 drvstore 删除接口。
- drvstore 读取引用计数,校验是否为 0。
- 引用计数 > 0,返回错误,拒绝删除。
- 引用计数 = 0:删除 FileRepository 下驱动目录,删除注册表 DriverStore 元数据项。
六、边界(约束、坑点、失效条件)
1. 权限边界
- 查询驱动仓库列表:普通用户可读。
- 驱动包导入、删除:必须管理员权限。UAC 未提升直接拒绝。
- FileRepository 目录 ACL 保护,即使管理员,直接手动删文件夹会触发权限拒绝,必须通过 drvstore/setupapi 接口删除(不能手动 rm 删除)。
2. 引用计数边界(高频踩坑点)
- 引用计数是用户态 drvstore 维护的软计数器,内核 pnp.sys 不知道引用计数。
- 引用计数仅跟踪设备实例绑定关系;手动加载驱动(sc create + sc start)不会增加 drvstore 引用计数。
- 残留旧设备实例(注册表 HKLM\Enum 遗留记录)会导致引用计数无法归零,驱动包删不掉。
pnputil /enum-devices可以查找残留设备。
3. 签名与哈希边界
- drvstore 入库校验哈希;入库之后,如果手动修改 FileRepository 内 sys 文件,哈希校验失败,pnp.sys 拒绝加载驱动。
- 安全启动开启时,crypt32 强制校验驱动签名;测试签名模式可绕过签名校验,drvstore 允许未签名驱动入库。
4. 职责边界(重点区分)
✅ drvstore.dll:管理 FileRepository 仓库、驱动包文件副本、引用计数、哈希、元数据 ❌ drvstore.dll:不解析 INF(setupapi)、不创建设备 DevNode(cfgmgr32/pnp.sys)、不加载内核驱动
5. 文件 IO 边界
- drvstore 只负责复制文件入库;驱动加载是 pnp.sys/I/O 管理器直接读取 FileRepository 的 sys 文件,不经过 drvstore。
- FileRepository 目录名是 INF 对应的唯一哈希命名,防止文件名冲突。
6. 高频认知误区
- ❌ drvstore.dll 是内核驱动;✅ 用户态 DLL,完全运行在用户模式。
- ❌ 删除设备 DevNode 会自动删除 DriverStore 驱动包;❌ 删除 DevNode 仅减少引用计数;引用计数归零后,还需要手动执行 delete-driver 才能删驱动包。
- ❌ pnp.sys 调用 drvstore 加载驱动;❌ pnp.sys 直接读取 FileRepository 文件,和 drvstore 没有内核态调用。
- ❌ 手动删除 FileRepository 文件夹等价于 pnputil delete-driver;❌ 手动删会破坏 DriverStore 注册表元数据,导致驱动仓库损坏,设备管理器异常。
drvstore.dll 组件分工简表
| 组件 | 位置 | 职责 |
|---|---|---|
| drvstore.dll | System32 | DriverStore 仓库管理,入库、哈希校验、引用计数、驱动包删除、元数据维护 |
| setupapi.dll | System32 | INF 解析,对外暴露驱动包安装 API,调用 drvstore |
| crypt32.dll | System32 | 驱动数字签名校验 |
| advapi32.dll | System32 | DriverStore 注册表读写 |
| cfgmgr32.dll | System32 | 枚举设备实例,统计驱动包引用计数 |
| pnp.sys | 内核 | 读取 FileRepository 驱动文件,PnP 设备栈管理 |
PnPUtil 英文全称
拆解说明
- PnP:Plug and Play
中文:即插即用(Windows 硬件热插拔、自动识别驱动框架)
- Util:Utility
中文:工具、实用程序
完整释义
pnputil.exe,用于安装 / 删除 / 枚举硬件 INF 驱动包。
PnPUtil 工具完整解析(图片内容 + 官方补充)
一、基础信息
1. 全称
- PnP:Plug and Play(即插即用)
- Util:Utility(实用工具)
2. 工具定位
C:\Windows\system32\pnputil.exe,必须以管理员 CMD/PowerShell 运行,自 Windows Vista 起系统自带,替代老旧 devcon.exe 部分能力Microsoft ...。3. 图片来源
pnputil /? 输出,与微软 Learn 官方语法文档完全一致,是官方标准帮助文本。二、13 大核心命令分类详解(按图片顺序)
一、驱动包仓库管理(驱动存储区 oem*.inf)
1. /add-driver 添加驱动包
/add-driver <inf文件|*.inf> [/subdirs] [/install] [/reboot]/subdirs:递归扫描子目录下所有 INF/install:添加后自动给匹配硬件安装驱动/reboot:操作完成后提示重启示例:
pnputil /add-driver D:\drivers\*.inf /subdirs /install
2. /delete-driver 删除驱动包
/delete-driver oem#.inf [/uninstall] [/force] [/reboot]/uninstall:先卸载已安装设备再删仓库文件/force:强制删除(设备正在占用也删除,慎用)- oem#.inf:由
/enum-drivers查询得到的驱动文件名
3. /export-driver 导出驱动备份
/export-driver <oem#.inf | *> 目标文件夹*代表导出系统内所有第三方驱动,常用于重装系统备份
pnputil /export-driver * D:\DriverBackup
4. /enum-drivers 枚举仓库驱动包
[/class 类名|GUID] [/files] [/ids] [/devices] [/format txt|xml|csv] [/output-file 输出文件]/files:显示驱动关联的全部系统文件/format csv:导出方便 Excel 查看
二、硬件设备控制(单设备批量操作)
5. /disable-device 禁用硬件
6. /enable-device 启用硬件
7. /restart-device 重启硬件(重新枚举加载驱动)
8. /remove-device 彻底删除设备(卸载硬件实例)
<instance ID>:精确单设备实例 ID(设备管理器硬件路径)/deviceid <硬件ID>:批量匹配同 VID/PID 设备(如 USB\Class_03)/class <类名/GUID>:按设备大类筛选(Net/Display/USB 等)/bus <总线名/GUID>:按总线筛选 PCI/USB/ACPI附加标记:/subtree:删除时连带子设备(适用于复合 USB 设备)/force:强制操作关键系统硬件(谨慎)/reboot:操作后需重启生效
9. /scan-devices 扫描硬件变更
- 作用:刷新即插即用总线,识别新插入硬件、恢复被删除设备
/async:后台异步扫描,不阻塞命令行
三、枚举查询类(硬件 / 接口 / 容器 / 设备树)
10. /enum-devices 枚举所有系统设备(最常用排查命令)
/connected//disconnected:只显示在线 / 离线设备/problem [错误码]:筛选有故障代码的异常设备(排查硬件冲突)/stack:输出设备完整驱动堆栈/drivers:显示当前加载的驱动 oem 编号/properties:打印设备全部注册表属性支持导出 txt/xml/csv 日志,用于批量巡检硬件故障。
11. /enum-interfaces 枚举设备功能接口
/enabled//disabled、按设备类 GUID 过滤,用于 USB 复合设备、虚拟设备排查。12. /enum-classes 枚举全部设备大类(Net、Display、Audio 等)
/enum-devices /class 批量筛选设备。13. /enum-devicetree 树形结构展示设备层级
14. /enum-containers 设备容器枚举
15. /? / /help 查看完整帮助(即图片输出内容)
三、关键使用注意事项 ⚠️
- 权限要求:全部命令必须管理员终端执行,普通用户会报权限拒绝。
- oem#.inf 规则:系统内置驱动无法通过
/delete-driver删除,仅第三方厂商驱动存在 oem 编号。 - /force 风险:强制删除正在使用的显卡、磁盘控制器等关键硬件驱动会蓝屏 / 系统崩溃。
- 版本限制:
/remove-device、容器 / 接口枚举等高级参数仅 Windows 10 2004 及以上系统支持,Win7 仅支持基础增删驱动。 - 批量运维场景:配合
/format csv /output-file可用于企业批量巡检硬件故障、驱动备份。
四、高频实用示例
- 备份所有第三方驱动
pnputil /export-driver * C:\DriverBackups
- 批量安装文件夹下全部驱动
pnputil /add-driver D:\Drivers\*.inf /subdirs /install
- 查看所有异常故障硬件并导出日志
pnputil /enum-devices /problem /format csv /output-file C:\HardwareError.csv
- 禁用全部 USB 大容量存储设备
pnputil /disable-device /class USB /deviceid USB\MassStorage
- 刷新硬件检测新设备
pnputil /scan-devices
PnPUtil 运维速查表(管理员权限运行)
一、驱动仓库管理(oem*.inf)
1. 添加 / 安装驱动
# 单个INF添加
pnputil /add-driver x:\driver.inf
# 批量递归添加并自动安装
pnputil /add-driver D:\Drivers\*.inf /subdirs /install
# 添加后重启生效
pnputil /add-driver dev.inf /install /reboot
2. 删除驱动包
# 普通删除
pnputil /delete-driver oem0.inf
# 卸载设备后强制删除
pnputil /delete-driver oem1.inf /uninstall /force
# 删除后重启
pnputil /delete-driver oem2.inf /reboot
3. 导出备份驱动
# 单驱动导出
pnputil /export-driver oem6.inf D:\backup
# 导出全部第三方驱动(重装系统必备)
pnputil /export-driver * D:\DriverBackup
4. 枚举已安装第三方驱动
# 简单列表
pnputil /enum-drivers
# 带文件、关联设备完整信息
pnputil /enum-drivers /files /devices
# 筛选显卡类驱动并导出表格
pnputil /enum-drivers /class "Display" /format csv /output-file C:\display_drv.csv
二、硬件设备操作(禁用 / 启用 / 重启 / 删除)
<实例ID> / /deviceid 硬件ID / /class 设备类 / /bus 总线
/force强制、/reboot重启、/subtree连带子设备1. 禁用设备
# 禁用单USB设备
pnputil /disable-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
# 禁用全部USB存储设备
pnputil /disable-device /class USB /deviceid USB\MassStorage /force
2. 启用设备
pnputil /enable-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
3. 重启设备(重载驱动)
pnputil /restart-device /class "Net" /bus PCI
4. 删除设备实例
# 删除设备+所有子设备
pnputil /remove-device "ACPI\PNP0A08\1" /subtree
# 强制删除关键设备
pnputil /remove-device /class Display /force /reboot
5. 扫描硬件变更(刷新设备管理器)
# 同步扫描
pnputil /scan-devices
# 后台异步扫描
pnputil /scan-devices /async
三、硬件信息枚举 & 故障排查
1. 枚举设备(最常用巡检)
# 只看当前已连接设备
pnputil /enum-devices /connected
# 筛选带故障代码的异常硬件
pnputil /enum-devices /problem
# 完整堆栈+驱动+硬件属性,导出故障日志
pnputil /enum-devices /stack /drivers /properties /format csv /output-file C:\hardware_error.csv
# 只查看显卡设备
pnputil /enum-devices /class Display
2. 树形层级查看设备总线
# 完整设备树
pnputil /enum-devicetree
# 仅在线设备+接口信息
pnputil /enum-devicetree /connected /interfaces
3. 枚举设备功能接口
# 仅启用的设备接口
pnputil /enum-interfaces /enabled
# 筛选USB类接口导出
pnputil /enum-interfaces /class "{884b96c3-56ef-11d1-bc8c-00a0c91405dd}" /output-file usb_interface.txt
4. 枚举设备大类 / 设备容器
# 查看所有硬件分类GUID
pnputil /enum-classes
# 枚举所有物理设备容器
pnputil /enum-containers
# 只查看当前连接的外设容器
pnputil /enum-containers /connected /devices
四、运维高频组合命令
- 重装系统前一键备份全部驱动
md C:\DriverBackup && pnputil /export-driver * C:\DriverBackup
- 批量部署驱动包
pnputil /add-driver D:\Drivers\*.inf /subdirs /install
- 批量导出全机硬件故障报表
pnputil /enum-devices /connected /problem /stack /drivers /format csv /output-file C:\硬件故障清单.csv
- 一键刷新硬件检测新外设
pnputil /scan-devices
⚠️ 安全操作红线
- 所有命令必须管理员 CMD/PowerShell执行,普通用户无权限;
/force参数严禁用于磁盘控制器、显卡、系统总线,极易蓝屏;- 系统自带内置驱动无
oem#.inf,无法通过/delete-driver删除; - Windows 7 仅支持
/add-driver /delete-driver /export-driver /enum-drivers,设备管控类参数仅 Win10 2004 + 可用。
|
功能和用途:
为什么使用
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
在 Windows Vista 以及之后的 Windows 版本中,设备管理器开始采用了新的驱动程序安装和管理模型,称为设备驱动程序安装框架(Device Driver Installation Framework,DDInstall)。这一框架引入了一种新的驱动程序安装机制,其中设备驱动程序包含一个 .inf 文件和相关的文件,通过该 .inf 文件可以描述驱动程序的安装、卸载和配置信息。 为了支持这种新的驱动程序管理模型,并提供一种简单而有效的方式来管理设备驱动程序,微软引入了 通过 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1. pnputil 命令功能对比表
2. 各版本
|
| 命令选项 | Windows 7 | Windows 8/8.1 | Windows 10 | Windows 11 |
|---|---|---|---|---|
/add-driver <驱动路径> /subdirs |
不支持 | 支持 | 支持 | 支持 |
/delete-driver <驱动INF文件> |
不支持 | 支持 | 支持 | 支持 |
/list-drivers |
支持 | 支持 | 支持 | 支持 |
/list-devices |
不支持 | 支持 | 支持 | 支持 |
/install <驱动INF文件> |
不支持 | 不支持 | 支持 | 支持 |
/uninstall <驱动INF文件> |
不支持 | 不支持 | 支持 | 支持 |
/enum-drivers |
不支持 | 不支持 | 支持 | 支持 |
/force |
不支持 | 不支持 | 支持 | 支持 |
3. pnputil 支持的关键功能变化
| 功能 | Windows 7 | Windows 8/8.1 | Windows 10/11 |
|---|---|---|---|
| 添加驱动程序(不含签名) | 不支持 | 不支持 | 支持(通过 /add-driver) |
| 删除驱动程序(通过 INF 文件) | 不支持 | 不支持 | 支持(通过 /delete-driver) |
| 列出所有驱动程序包 | 不支持 | 支持(通过 /list-drivers) |
支持(通过 /list-drivers) |
| 列出已安装设备 | 不支持 | 支持(通过 /list-devices) |
支持(通过 /list-devices) |
| 查看驱动程序包详细信息 | 不支持 | 不支持 | 支持(通过 /enum-drivers) |
| 强制安装不签名驱动程序包 | 不支持 | 不支持 | 支持(通过 /force) |
| 驱动程序包签名验证 | 不支持 | 不支持 | 支持(通过 /force) |
- Windows 7: 仅支持列出已安装的驱动程序包,没有提供添加、删除、安装和卸载驱动程序包的功能。
- Windows 8/8.1: 增强了驱动程序管理功能,支持添加、删除驱动程序包,且可以列出已安装的设备和驱动程序包,但仍缺少对强制安装和驱动程序详细信息的支持。
- Windows 10/11: 提供了最全面的驱动程序管理功能,包括强制安装、不签名驱动程序的支持,并且可以列出和安装/卸载驱动程序包,支持更多命令选项如
/enum-drivers和/force。
在 Windows 10 及更高版本中,pnputil 已成为一个强大而灵活的工具,适用于驱动程序的安装、卸载和管理。
pnputil 命令的底层原理涉及到 Windows 操作系统中设备管理的相关机制。它主要通过以下方式实现其功能:
-
驱动程序管理:
pnputil通过与设备管理器(Device Manager)和设备驱动程序安装框架(DDInstall)交互来实现驱动程序的管理。它可以将驱动程序添加到系统的驱动程序存储库中,从存储库中删除驱动程序,以及列出系统中已安装的驱动程序列表。 -
INF 文件处理:设备驱动程序通常包含一个或多个 INF(信息)文件,用于描述驱动程序的安装、配置和卸载信息。
pnputil可以解析和处理这些 INF 文件,从而实现对驱动程序的安装和卸载操作。 -
驱动程序安装:当用户使用
pnputil安装驱动程序时,它会将驱动程序的信息(通常是包含在一个或多个 INF 文件中)添加到系统的驱动程序存储库中,并通知设备管理器执行相应的安装操作。 -
驱动程序卸载:当用户使用
pnputil卸载驱动程序时,它会从系统的驱动程序存储库中移除相应的驱动程序信息,并通知设备管理器执行相应的卸载操作。 -
命令行界面:
pnputil提供了一个命令行界面,用户可以通过输入不同的命令和选项来执行各种驱动程序管理操作。这使得用户可以通过简单的命令行操作完成复杂的驱动程序管理任务。
pnputil 命令通过与设备管理器和设备驱动程序安装框架交互,解析和处理驱动程序的 INF 文件,并提供简单的命令行界面,实现了对 Windows 操作系统中设备驱动程序的管理。
pnputil 命令在 Windows 系统中依赖于多个 DLL、SYS 文件以及系统 API 接口来实现其功能。以下是 pnputil 命令可能依赖的一些关键文件和接口:
-
SetupAPI.dll:这是 Windows 中的一个核心 DLL 文件,提供了用于设备安装和配置的 API 接口。
pnputil可能使用 SetupAPI.dll 中的函数来解析和处理设备驱动程序的 INF 文件,执行驱动程序的安装和卸载操作等。 -
devmgr.dll:设备管理器相关的 DLL 文件,提供了与设备管理器交互的 API 接口。
pnputil可能使用 devmgr.dll 中的函数来获取系统中已安装的设备驱动程序列表,执行设备的安装和卸载操作等。 -
cfgmgr32.dll:这是 Windows 中的另一个与设备管理相关的 DLL 文件,提供了与设备配置和管理相关的 API 接口。
pnputil可能使用 cfgmgr32.dll 中的函数来获取设备信息,执行设备配置和管理操作等。 -
advapi32.dll:这是 Windows 中的一个核心 DLL 文件,提供了与系统安全性和权限管理相关的 API 接口。
pnputil可能使用 advapi32.dll 中的函数来执行权限检查,确保用户有足够的权限执行设备驱动程序的安装和卸载操作等。 -
Kernel32.dll:这是 Windows 中的一个核心 DLL 文件,提供了与系统核心功能相关的 API 接口。
pnputil可能使用 Kernel32.dll 中的函数来执行文件操作、内存管理等操作。 -
其他系统文件和接口:除了上述文件和接口之外,
pnputil还可能依赖于其他系统文件和接口,以实现其功能。这些文件和接口可能包括在 Windows 系统中的其他 DLL、SYS 文件,以及系统提供的其他 API 接口。
pnputil 命令依赖于多个 Windows 系统文件和接口,以实现设备驱动程序的管理功能。
pnputil 命令的功能可以大致分为以下几类:
-
驱动程序管理:
- 安装驱动程序:将指定的驱动程序添加到系统的驱动程序存储库中,以便后续设备安装时使用。
- 卸载驱动程序:从系统的驱动程序存储库中移除指定的驱动程序信息。
-
驱动程序查询:
- 列出已安装的驱动程序:显示系统中已安装的驱动程序列表,包括驱动程序名称、提供商、版本等信息。
- 查询指定驱动程序信息:显示指定驱动程序的详细信息,包括路径、INF 文件名、驱动程序类别等。
-
INF 文件管理:
- 添加 INF 文件:将指定的 INF 文件添加到系统的驱动程序存储库中,以便后续安装驱动程序时使用。
- 删除 INF 文件:从系统的驱动程序存储库中移除指定的 INF 文件及其相关信息。
-
备份和恢复:
- 备份驱动程序列表:将系统中已安装的驱动程序列表备份到指定位置。
- 恢复驱动程序列表:从指定位置恢复备份的驱动程序列表到系统中。
-
命令行参数管理:
- 提供各种命令行参数和选项,用于执行不同的驱动程序管理操作,例如指定安装路径、搜索路径、驱动程序类别等。
pnputil 命令提供了一组功能丰富的选项,用于管理系统中的设备驱动程序,包括安装、卸载、查询驱动程序信息、管理 INF 文件等。
pnputil 命令的初级应用大纲:
-
安装驱动程序:
- 使用
pnputil -i -a <驱动程序文件路径>命令安装指定路径下的驱动程序。
- 使用
-
卸载驱动程序:
- 使用
pnputil -d -f <驱动程序名称>命令卸载指定名称的驱动程序。
- 使用
-
列出已安装的驱动程序:
- 使用
pnputil -e命令列出系统中已安装的驱动程序。
- 使用
-
查询指定驱动程序信息:
- 使用
pnputil -a <INF 文件路径>命令查询指定 INF 文件的驱动程序信息。
- 使用
-
添加 INF 文件:
- 使用
pnputil -a <INF 文件路径>命令将指定的 INF 文件添加到系统的驱动程序存储库中。
- 使用
-
删除 INF 文件:
- 使用
pnputil -d <INF 文件名>命令从系统的驱动程序存储库中移除指定的 INF 文件及其相关信息。
- 使用
-
备份和恢复驱动程序列表:
- 使用
pnputil -export-driver <导出路径>命令备份驱动程序列表。 - 使用
pnputil -import-driver <导入路径>命令从备份位置恢复驱动程序列表。
- 使用
-
其他选项:
- 可以使用
-i、-d、-e、-a等选项结合其他参数,实现更具体的操作,例如强制卸载-f、搜索路径-i等。
- 可以使用
以上是 pnputil 命令的初级应用大纲,涵盖了常见的驱动程序管理操作及其基本用法。
pnputil 命令的中级应用大纲,包括一些更高级的用法和选项:
-
安装驱动程序:
- 使用
-i选项安装驱动程序时,可以结合-i -a选项,指定驱动程序的架构,如-i -a <x86|x64|ia64>。
- 使用
-
卸载驱动程序:
- 在卸载驱动程序时,可以结合
-f选项强制删除驱动程序,即使其正在被使用。
- 在卸载驱动程序时,可以结合
-
查询指定驱动程序信息:
- 使用
-s选项可以查询指定驱动程序的详细信息,包括驱动程序路径、提供商、驱动程序类别等。
- 使用
-
添加 INF 文件:
- 当添加 INF 文件时,可以结合
-i选项指定搜索路径,以便pnputil命令能够在指定路径下查找 INF 文件。
- 当添加 INF 文件时,可以结合
-
删除 INF 文件:
- 删除 INF 文件时,可以使用
-d选项删除指定 INF 文件,并结合-f选项强制删除。
- 删除 INF 文件时,可以使用
-
备份和恢复驱动程序列表:
- 在备份和恢复驱动程序列表时,可以使用
-export-driver和-import-driver选项指定备份和恢复的路径。结合
pnputil命令,可以使用-export-driver和-import-driver选项进行驱动程序备份和恢复。下面是一个示例批处理脚本,演示如何使用这些选项备份和恢复驱动程序:Copy Code@echo off setlocal enabledelayedexpansion REM 设置备份和恢复路径 set "backup_path=C:\DriverBackup" set "restore_path=C:\DriverBackup" REM 确保备份路径存在 if not exist "%backup_path%" ( echo Creating backup directory: %backup_path% mkdir "%backup_path%" ) echo. REM 备份所有驱动程序 echo Backing up all drivers to %backup_path%... pnputil -e | findstr /i "oem" | for /f "tokens=3 delims= " %%d in ('findstr /i "Published Name"') do ( echo Exporting %%d... pnputil -export-driver %%d "%backup_path%" ) echo Driver backup completed. echo. REM 恢复驱动程序 echo Restoring drivers from %restore_path%... for /r "%restore_path%" %%d in (*.inf) do ( echo Restoring %%d... pnputil -i -a "%%d" ) echo Driver restoration completed. pause此脚本包含两个主要部分:
-
备份驱动程序:使用
pnputil -e命令列出所有已安装的驱动程序,然后使用-export-driver选项将每个驱动程序导出到指定的backup_path目录中。findstr用于筛选出驱动程序的名字。 -
恢复驱动程序:从
restore_path目录中遍历所有.inf文件,然后使用pnputil -i -a选项将每个驱动程序安装回来。
请确保将
backup_path和restore_path设置为合适的路径。运行脚本时,请确保以管理员权限运行,以便执行驱动程序的导出和导入操作。通过此脚本,您可以方便地备份和恢复系统中的驱动程序,以确保系统的稳定性和一致性。
-
- 在备份和恢复驱动程序列表时,可以使用
-
过滤输出信息:
- 可以使用管道符号
|结合其他命令,如findstr(Windows)或grep(Linux)来过滤pnputil输出的信息。
- 可以使用管道符号
-
批量处理:
- 可以编写批处理脚本,结合
pnputil命令批量执行驱动程序管理操作,如安装、卸载、查询等。当编写批处理脚本时,结合
pnputil命令可以批量执行驱动程序管理操作,例如安装、卸载和查询。下面是一个示例批处理脚本,演示如何批量执行这些操作:Copy Code@echo off setlocal enabledelayedexpansion REM 设置驱动程序目录 set "driver_dir=C:\Drivers" REM 批量安装驱动程序 echo Installing drivers from %driver_dir%... for %%f in ("%driver_dir%\*.inf") do ( echo Installing %%f... pnputil -i -a "%%f" ) REM 批量卸载指定驱动程序 echo. echo Uninstalling drivers... set "target_driver=DriverName" for /f "tokens=*" %%d in ('pnputil -e') do ( set "driver=%%d" if "!driver:~0,7!"=="Published Name: " ( set "driver=!driver:~16!" echo Checking driver: !driver! pnputil -f -d !driver! | findstr /i /c:"!target_driver!" if !errorlevel! equ 0 ( echo Uninstalling !driver!... pnputil -f -d !driver! ) ) ) REM 查询已安装的驱动程序 echo. echo Installed drivers: pnputil -e pause此批处理脚本的主要功能包括:
- 设置驱动程序目录。
- 批量安装指定目录下所有驱动程序。
- 批量卸载指定驱动程序。
- 查询已安装的驱动程序。
请确保将
driver_dir设置为你的驱动程序目录,并将target_driver设置为要卸载的驱动程序名称。运行脚本时,它将批量执行所述操作,并输出相应的信息。记得在运行脚本时要以管理员权限运行,以便执行驱动程序的安装和卸载操作。
- 可以编写批处理脚本,结合
-
结合其他命令:
- 可以将
pnputil命令与其他系统管理命令结合使用,如devcon、wmic等,以实现更复杂的系统管理任务。当将
pnputil命令与其他系统管理命令(如devcon、wmic等)结合使用时,可以实现更复杂的系统管理任务,例如:示例:自动化驱动程序管理和故障排除
场景:
假设你是一个系统管理员,需要自动化管理系统中的驱动程序,并在发生故障时快速诊断和修复问题。
步骤:
-
自动安装最新驱动程序: 使用
pnputil安装最新的驱动程序包。bashCopy Codepnputil -i -a <驱动程序.inf> -
使用
wmic检测设备状态: 使用wmic命令检测设备状态,查找可能存在问题的设备。bashCopy Codewmic path Win32_PnPEntity where "Status <> 'OK'" get Caption, DeviceID, Status -
使用
devcon禁用和启用设备: 使用devcon命令禁用和启用可能存在问题的设备,以尝试解决故障。bashCopy Codedevcon disable <设备ID> devcon enable <设备ID> -
记录日志和生成报告: 在执行上述步骤时,记录日志并生成报告,以便后续分析和审查。
示例脚本(Windows Batch):
Copy Code@echo off REM 安装最新驱动程序 pnputil -i -a <驱动程序.inf> REM 检测设备状态 wmic path Win32_PnPEntity where "Status <> 'OK'" get Caption, DeviceID, Status > device_status.txt REM 禁用可能存在问题的设备 for /f "skip=1 tokens=*" %%A in (device_status.txt) do ( for /f "tokens=1,2 delims= " %%B in ("%%A") do ( devcon disable %%B devcon enable %%B ) ) REM 清理临时文件 del device_status.txt这个示例展示了如何结合使用
pnputil、wmic和devcon命令,实现自动化驱动程序管理和故障排除。通过将这些命令结合使用,可以快速有效地管理系统驱动程序并解决潜在的故障问题。 -
- 可以将
以上是 pnputil 命令的中级应用大纲,涵盖了一些更高级的用法和选项,可以帮助用户更灵活地进行驱动程序管理。
pnputil 命令的高级应用大纲,包括更深入的用法和一些高级选项:
-
使用批处理脚本进行自动化操作:
- 创建批处理脚本以自动执行
pnputil命令,以批量安装、卸载或管理驱动程序。批处理脚本,可以自动执行
pnputil命令,以批量安装、卸载或管理驱动程序:Copy Code@echo off setlocal enabledelayedexpansion REM 设置驱动程序目录 set "driver_dir=C:\Drivers" REM 执行安装、卸载或查询操作 echo. set /p action="Enter action (install/uninstall/query): " if /i "%action%"=="install" ( REM 批量安装驱动程序 echo Installing drivers from %driver_dir%... for %%f in ("%driver_dir%\*.inf") do ( echo Installing %%f... pnputil -i -a "%%f" ) echo Driver installation completed. ) else if /i "%action%"=="uninstall" ( REM 批量卸载指定驱动程序 echo. echo Uninstalling drivers... set "target_driver=DriverName" for /f "tokens=*" %%d in ('pnputil -e') do ( set "driver=%%d" if "!driver:~0,7!"=="Published Name: " ( set "driver=!driver:~16!" echo Checking driver: !driver! pnputil -f -d !driver! | findstr /i /c:"!target_driver!" if !errorlevel! equ 0 ( echo Uninstalling !driver!... pnputil -f -d !driver! ) ) ) echo Driver uninstallation completed. ) else if /i "%action%"=="query" ( REM 查询已安装的驱动程序 echo. echo Installed drivers: pnputil -e ) else ( echo Invalid action. Please enter 'install', 'uninstall', or 'query'. ) pause此脚本包含以下功能:
- 设置驱动程序目录。
- 提示用户输入要执行的操作(安装、卸载或查询)。
- 根据用户输入执行相应的操作:
- 如果选择安装,则批量安装指定目录下所有驱动程序。
- 如果选择卸载,则批量卸载指定的驱动程序。
- 如果选择查询,则显示已安装的驱动程序列表。
- 用户输入无效时,显示错误消息。
运行脚本时,请确保将
driver_dir设置为您的驱动程序目录,并根据需要更改target_driver。请以管理员权限运行脚本,以便执行驱动程序的安装和卸载操作。
- 创建批处理脚本以自动执行
-
结合 PowerShell 进行更灵活的管理:
- 利用 PowerShell 脚本结合
pnputil命令,实现更复杂的系统管理任务,如筛选、排序、格式化输出等。一个利用 PowerShell 脚本结合
pnputil命令实现更复杂的系统管理任务的示例。该脚本将执行以下任务:- 筛选指定条件下的驱动程序。
- 对筛选结果进行排序。
- 格式化输出筛选结果。
powershellCopy Code# 设置驱动程序目录 $driverDir = "C:\Drivers" # 筛选条件 $searchTerm = "NVIDIA" # 更改为您想要筛选的条件 # 列出所有驱动程序并筛选符合条件的结果 $drivers = pnputil -e | Where-Object {$_ -like "*$searchTerm*"} # 按照名称排序 $sortedDrivers = $drivers | Sort-Object # 格式化输出 foreach ($driver in $sortedDrivers) { $publishedName = $driver -replace "Published Name: ", "" $originalName = $publishedName -replace "OEM", "" Write-Output "Driver: $originalName" } # 如果需要其他操作,可以在此处扩展脚本此脚本执行以下操作:
- 列出指定目录下所有驱动程序,并根据指定条件筛选出符合条件的结果。
- 对筛选结果按名称进行排序。
- 使用格式化输出将排序后的驱动程序名称显示在控制台上。
您可以根据需要修改
$searchTerm变量以适应不同的筛选条件,并根据需要扩展脚本以执行其他操作。运行脚本时,请确保将$driverDir设置为您的驱动程序目录。
- 利用 PowerShell 脚本结合
-
远程管理:
- 在网络环境中,可以结合远程管理工具如 PowerShell Remoting 或其他远程管理工具,通过远程执行
pnputil命令来管理远程计算机的驱动程序。
- 在网络环境中,可以结合远程管理工具如 PowerShell Remoting 或其他远程管理工具,通过远程执行
-
自定义驱动程序安装和卸载逻辑:
- 利用脚本语言(如 PowerShell、Python 等),结合
pnputil命令,实现自定义的驱动程序安装和卸载逻辑,满足特定需求。使用 PowerShell 结合 pnputil 命令可以实现自定义的驱动程序安装和卸载逻辑。下面是一个简单的示例,演示如何使用 PowerShell 脚本安装和卸载驱动程序:
- 安装驱动程序:
powershellCopy Code# 定义驱动程序路径 $driverPath = "C:\Path\To\Your\Driver\driver.inf" # 使用 pnputil 命令安装驱动程序 pnputil.exe -i -a $driverPath- 卸载驱动程序:
powershellCopy Code# 定义驱动程序名称 $driverName = "YourDriverName" # 使用 pnputil 命令卸载驱动程序 pnputil.exe -d $driverName以上代码中的
$driverPath和$driverName分别表示驱动程序的路径和名称,你需要将其替换为你实际的驱动程序路径和名称。需要注意的是,安装和卸载驱动程序通常需要管理员权限,因此你可能需要以管理员身份运行 PowerShell 脚本。
此外,你可以根据具体需求在 PowerShell 脚本中添加更多的逻辑,例如检查驱动程序是否已安装、安装过程中的错误处理等。
示例 PowerShell 脚本,演示如何结合 pnputil 命令实现自定义的驱动程序安装和卸载逻辑,假设驱动程序文件位于特定文件夹中:
powershellCopy Code# 定义驱动程序文件夹路径 $driverFolder = "C:\Path\To\Your\Driver\Folder" # 获取驱动程序文件列表 $driverFiles = Get-ChildItem -Path $driverFolder -Filter "*.inf" # 安装驱动程序 foreach ($driverFile in $driverFiles) { # 使用 pnputil 命令安装驱动程序 pnputil.exe -i -a $driverFile.FullName } # 卸载驱动程序(可选) # 注意:卸载驱动程序可能会影响系统稳定性,请谨慎使用 # 如果需要卸载,请取消下面这段代码的注释 # foreach ($driverFile in $driverFiles) { # # 提取驱动程序名称 # $driverName = (Get-Content $driverFile.FullName | Select-String -Pattern "DriverName").ToString().Split(":")[1].Trim() # # 使用 pnputil 命令卸载驱动程序 # pnputil.exe -d $driverName # }请将代码中的
C:\Path\To\Your\Driver\Folder替换为你实际的驱动程序文件夹路径。此脚本会遍历指定文件夹中的所有驱动程序文件(.inf 文件),然后使用 pnputil 命令逐个安装这些驱动程序。如果需要,你也可以取消注释以启用卸载驱动程序的逻辑,但请谨慎操作,因为卸载驱动程序可能会影响系统稳定性。
- 利用脚本语言(如 PowerShell、Python 等),结合
-
监视和日志记录:
- 结合系统监视工具,如 Event Viewer(Windows)、syslog(Linux),监视
pnputil命令的执行过程,并记录相关日志信息,以便排查问题和分析执行情况。使用 PowerShell 结合 Event Viewer 来监视
pnputil命令的执行过程,并记录相关日志信息。以下是一个示例脚本:powershellCopy Code# 监视 pnputil 命令执行过程并记录日志 # 定义日志文件路径 $logFile = "C:\Logs\pnputil_log.txt" # 创建日志文件(如果不存在) if (!(Test-Path -Path $logFile)) { New-Item -Path $logFile -ItemType File } # 监视 Event Viewer 中的 System 日志,筛选 pnputil 相关事件 Get-WinEvent -LogName System | Where-Object {$_.Message -like "*pnputil*"} | ForEach-Object { # 提取时间戳和事件消息 $timestamp = $_.TimeCreated $message = $_.Message # 将时间戳和事件消息写入日志文件 Add-Content -Path $logFile -Value "[$timestamp] $message" } # 实时监视日志文件变化并输出到控制台 $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = (Get-Item $logFile).Directory.FullName $watcher.Filter = (Get-Item $logFile).Name $watcher.NotifyFilter = [System.IO.NotifyFilters]'LastWrite' Register-ObjectEvent $watcher "Changed" -Action { Get-Content $logFile | Select-Object -Last 1 } # 持续监视日志文件变化 while ($true) { Wait-Event -Timeout 1 }这个脚本将:
- 监视 Windows 系统日志中的事件,筛选出与
pnputil相关的事件。 - 将筛选到的事件的时间戳和消息写入指定的日志文件。
- 实时监视日志文件的变化,并将最新的日志内容输出到控制台。
你可以将脚本中的
$logFile变量修改为你想要保存日志文件的路径。要运行此脚本,需要以管理员权限运行 PowerShell,并允许脚本执行。 - 监视 Windows 系统日志中的事件,筛选出与
- 结合系统监视工具,如 Event Viewer(Windows)、syslog(Linux),监视
-
结合版本控制系统:
- 将驱动程序管理操作结合版本控制系统,如 Git,以跟踪驱动程序安装、卸载历史记录,并进行版本管理和回滚操作。
-
安全性和权限管理:
- 确保执行
pnputil命令时具有足够的权限,并采取必要的安全措施,以防止未经授权的访问和操作。
- 确保执行
-
定时任务和计划任务:
- 结合操作系统的定时任务或计划任务功能,定期执行
pnputil命令,以确保系统驱动程序的及时更新和管理。
- 结合操作系统的定时任务或计划任务功能,定期执行
以上是 pnputil 命令的高级应用大纲,涵盖了一些更深入和高级的用法和选项,适用于需要更复杂驱动程序管理需求的场景。
pnputil 命令的专家级应用大纲,涵盖了更深入和高级的用法和选项:
-
驱动程序签名和数字证书:
- 理解并处理驱动程序签名和数字证书的相关问题,包括验证签名、安装未签名驱动程序等。
处理驱动程序签名和数字证书相关问题涉及到 Windows 系统中的驱动程序签名策略和数字证书管理。以下是一些常见的问题和解决方法:
-
验证签名: Windows 会在安装驱动程序时验证其数字签名,以确保其完整性和来源可信。你可以使用
signtool工具来验证驱动程序的签名:powershellCopy Codesigntool verify /pa /v "驱动程序路径"其中,
/pa表示验证所有证书,/v表示输出详细信息。 -
安装未签名驱动程序: 默认情况下,Windows 不允许安装未签名的驱动程序。要安装未签名的驱动程序,可以禁用驱动程序强制签名:
- 在 Windows 10/11 中,可以通过以下步骤禁用强制签名:
- 按 Win + X 打开快捷菜单,选择“Windows PowerShell (管理员)”。
- 运行以下命令以禁用强制签名:
powershellCopy Code
bcdedit.exe /set nointegritychecks on - 重启计算机后,安装未签名的驱动程序。
注意:禁用强制签名会降低系统安全性,仅在必要时使用,并在完成任务后重新启用强制签名。
- 在 Windows 10/11 中,可以通过以下步骤禁用强制签名:
-
数字证书管理: 如果你是开发者或者需要为你的驱动程序获取数字证书,可以通过以下步骤:
- 申请数字证书:可以通过向可信的证书颁发机构(CA)申请数字证书来签署你的驱动程序。
- 签署驱动程序:使用颁发的数字证书对驱动程序进行签名。
- 安装签名驱动程序:签名后的驱动程序将被 Windows 接受,并可以顺利安装。
请注意,对于生产环境中的驱动程序,建议始终使用签名的驱动程序,并遵守 Windows 的签名策略,以确保系统的安全性和稳定性。
-
- 理解并处理驱动程序签名和数字证书的相关问题,包括验证签名、安装未签名驱动程序等。
-
驱动程序安装策略和规则:
- 深入了解 Windows 驱动程序安装策略和规则,包括设备驱动程序签名要求、组策略设置等。
Windows 驱动程序安装策略和规则是为了确保系统的安全性和稳定性而设计的。以下是一些关键点:
-
驱动程序签名要求:
- Windows 默认要求所有驱动程序都必须经过数字签名,以确保其来源可信、完整性和兼容性。
- 驱动程序可以使用 Microsoft 签名或者第三方证书签名,但必须由受信任的证书颁发机构(CA)颁发。
-
数字签名级别:
- Windows 驱动程序签名分为两个级别:SHA-1 和 SHA-2。
- SHA-1 级别的签名逐渐被淘汰,推荐使用更安全的 SHA-2 签名。
-
驱动程序签名策略:
- Windows 提供了驱动程序签名策略,用于确定允许安装的驱动程序类型。
- 策略包括:
- 受信任的 Microsoft 代码:只允许安装经过 Microsoft 签名的驱动程序。
- 受信任的受信任发布者:允许安装经过任何受信任的发布者签名的驱动程序。
- 受信任的签名:只允许安装经过特定受信任的发布者签名的驱动程序。
- 不允许任何签名:不允许安装未签名的驱动程序。
-
组策略设置:
- 管理员可以通过组策略设置来修改驱动程序签名策略。
- 可以通过以下路径找到相关组策略设置:计算机配置 → 管理模板 → Windows 组件 → Windows Defender 驱动程序签名。
-
禁用驱动程序签名强制要求:
- 在某些情况下,可能需要暂时禁用驱动程序签名要求,以便安装或测试未签名的驱动程序。
- 可以通过修改系统启动选项来禁用签名强制要求。
请注意,在更改驱动程序签名策略或禁用签名强制要求时,可能会降低系统的安全性,因此建议仅在必要时进行此类操作,并在完成后及时恢复默认设置。
-
- 深入了解 Windows 驱动程序安装策略和规则,包括设备驱动程序签名要求、组策略设置等。
-
驱动程序部署和分发:
- 制定高级驱动程序部署策略,包括离线部署、网络分发、自动化部署等,确保驱动程序的有效分发和管理。
制定高级驱动程序部署策略需要考虑到以下几个方面,包括离线部署、网络分发和自动化部署:
-
离线部署:
- 创建离线驱动程序存储库: 将所有必需的驱动程序文件打包到一个离线存储库中,确保该存储库包含各种硬件设备的驱动程序版本。
- 制定更新策略: 定期更新离线存储库,以确保其中包含最新的驱动程序版本和补丁。
- 分发离线存储库: 将离线存储库复制到本地服务器或者可移动介质中,以便在需要时进行部署。
-
网络分发:
- 配置网络共享: 在内部网络中设置共享文件夹,其中包含所有必需的驱动程序文件。
- 制定访问权限: 确保只有授权用户可以访问共享文件夹,以防止未经授权的人员篡改或者获取驱动程序文件。
- 提供文档和指南: 提供详细的文档和指南,以说明如何从网络共享中获取并安装驱动程序。
-
自动化部署:
- 使用脚本进行部署: 编写脚本来自动化驱动程序的安装过程,可以使用 PowerShell、批处理脚本或者其他脚本语言。
- 集成到部署工具中: 如果组织使用部署工具(如 Microsoft SCCM、PDQ Deploy 等),则可以将驱动程序部署任务集成到这些工具中,以便统一管理和执行部署任务。
- 远程管理工具: 使用远程管理工具来远程安装和配置驱动程序,以便在大规模部署时提高效率。
-
监控和维护:
- 监控部署状态: 定期监控驱动程序部署的状态,确保部署成功并且没有出现错误。
- 处理失败情况: 及时处理部署失败的情况,分析失败原因并采取必要的措施进行修复。
- 定期更新驱动程序: 定期检查和更新驱动程序,以确保系统始终使用最新的稳定版本。
-
安全性考虑:
- 加密传输: 如果通过网络分发驱动程序,则应该确保传输过程中的安全性,可以使用加密协议(如 HTTPS)来加密传输通道。
- 身份验证: 在网络共享或者离线存储库中设置适当的身份验证措施,确保只有授权用户可以访问和下载驱动程序文件。
通过综合考虑上述因素,并根据组织的需求和实际情况,制定和实施高级驱动程序部署策略,可以有效地管理和分发驱动程序,确保系统的稳定性和安全性。
-
- 制定高级驱动程序部署策略,包括离线部署、网络分发、自动化部署等,确保驱动程序的有效分发和管理。
-
定制化驱动程序管理工具:
- 开发自定义工具或脚本,结合
pnputil命令,实现定制化的驱动程序管理解决方案,满足特定环境或需求。结合 pnputil 命令开发定制化的驱动程序管理解决方案是一个不错的选择,可以满足特定环境或需求。以下是一个简单的示例脚本,演示如何使用 PowerShell 和 pnputil 命令来实现驱动程序的安装、卸载和列出已安装的驱动程序:
powershellCopy Code# 定义驱动程序文件夹路径 $driverFolderPath = "C:\Path\To\Drivers" # 安装驱动程序 function Install-Driver { param ( [string]$driverPath ) pnputil.exe -i -a $driverPath } # 卸载驱动程序 function Uninstall-Driver { param ( [string]$driverName ) pnputil.exe -d $driverName } # 列出已安装的驱动程序 function List-InstalledDrivers { pnputil.exe -e } # 示例用法 # 安装驱动程序 Install-Driver -driverPath "$driverFolderPath\driver.inf" # 列出已安装的驱动程序 List-InstalledDrivers # 卸载驱动程序 Uninstall-Driver -driverName "DriverName.inf"这个脚本定义了三个功能函数:
Install-Driver:用于安装指定路径的驱动程序。Uninstall-Driver:用于卸载指定名称的驱动程序。List-InstalledDrivers:用于列出已经安装的驱动程序。
你可以根据实际需求修改路径、文件名和其他参数,定制化这个脚本以满足特定环境或需求。例如,你可以添加错误处理逻辑、日志记录功能或者与其他系统管理工具集成。
- 开发自定义工具或脚本,结合
-
驱动程序性能优化和调优:
- 深入分析和优化系统中的驱动程序,包括性能分析、资源消耗优化等,提升系统稳定性和性能。
对系统中的驱动程序进行深入分析和优化是提升系统稳定性和性能的重要一环。以下是一些可能的步骤和方法:
-
性能分析:
- 使用性能监控工具: 使用性能监控工具(如Windows Performance Monitor、Process Explorer等)来监视系统资源的使用情况,特别是CPU、内存、磁盘和网络。
- 分析驱动程序的性能影响: 通过监视系统性能并对比不同条件下的性能数据,分析驱动程序对系统性能的影响,特别是其对CPU和内存的消耗情况。
-
资源消耗优化:
- 减少内存占用: 优化驱动程序以减少其在内存中的占用,可以通过优化数据结构、减少不必要的内存分配等方式实现。
- 优化CPU利用率: 优化驱动程序的算法和逻辑,减少对CPU的占用,特别是在高负载条件下,以避免系统性能下降。
- 避免内存泄漏: 定期检查驱动程序是否存在内存泄漏问题,并及时修复,以防止内存资源的持续消耗。
-
代码优化:
- 精简代码: 移除不必要的代码和功能,精简驱动程序的代码量,减少潜在的性能影响。
- 优化算法: 优化驱动程序中的算法和逻辑,提高其执行效率和性能表现。
- 使用高效数据结构: 使用高效的数据结构来存储和处理数据,以减少资源消耗并提高性能。
-
硬件适配优化:
- 针对特定硬件进行优化: 如果驱动程序需要适配多种硬件设备,可以针对不同硬件进行优化,以提高性能和稳定性。
- 与硬件厂商合作: 与硬件厂商合作,获取硬件的性能特性和最佳实践,以优化驱动程序的设计和实现。
-
测试和验证:
- 性能测试: 进行性能测试,评估优化后驱动程序的性能表现,确保其满足系统性能要求。
- 稳定性测试: 进行稳定性测试,验证优化后驱动程序的稳定性和可靠性,确保其在各种条件下都能正常工作。
通过以上步骤和方法,可以对系统中的驱动程序进行深入分析和优化,提升系统的稳定性和性能,从而改善用户体验并减少系统故障的发生。
-
- 深入分析和优化系统中的驱动程序,包括性能分析、资源消耗优化等,提升系统稳定性和性能。
-
驱动程序版本控制和回滚机制:
- 建立高级的驱动程序版本控制和回滚机制,保证系统驱动程序的可控性和可靠性。
-
与硬件供应商的合作与沟通:
- 与硬件供应商合作,解决特定硬件驱动程序相关的问题,包括驱动程序定制、优化和更新。
-
系统级驱动程序开发和调试:
- 深入了解驱动程序开发和调试技术,包括 Windows 内核模式驱动程序、调试工具的使用等。
-
驱动程序安全和漏洞管理:
- 关注驱动程序安全问题,实施漏洞管理和修复策略,确保系统安全和稳定。
以上是 pnputil 命令的专家级应用大纲,适用于需要深入驱动程序管理和系统优化的专业人士和系统管理员。
pnputil 命令的顶尖级应用大纲,包含了极为高级和复杂的应用场景和技术:
-
自动化驱动程序管理系统:
- 设计并实施一个自动化的驱动程序管理系统,结合
pnputil命令、脚本和自定义工具,实现驱动程序的自动安装、更新和维护。
- 设计并实施一个自动化的驱动程序管理系统,结合
-
智能化驱动程序匹配和部署:
- 开发智能算法,根据硬件配置和系统需求,自动匹配最适合的驱动程序,并进行自动化部署和配置。
-
驱动程序的动态加载和卸载:
- 实现动态加载和卸载驱动程序的机制,根据系统需求和资源利用率进行动态管理,提升系统性能和稳定性。
-
基于云平台的驱动程序管理:
- 将驱动程序管理系统部署到云平台,实现跨平台、跨地域的统一驱动程序管理和分发,灵活应对多样化的部署需求。
-
驱动程序行为分析和优化:
- 运用数据分析和机器学习技术,对驱动程序的行为进行分析和优化,提升系统的响应速度和资源利用效率。
-
驱动程序安全与漏洞管理:
- 实施高级的驱动程序安全策略,包括漏洞扫描、安全补丁管理、访问控制等,确保系统安全和稳定运行。
-
驱动程序与应用程序的集成:
- 将驱动程序管理系统与应用程序集成,实现驱动程序的智能化管理和优化,提升应用程序的性能和用户体验。
-
驱动程序性能监控和调优:
- 建立高级的驱动程序性能监控系统,实时监测驱动程序的性能指标,并进行调优和优化,提升系统整体性能。
-
驱动程序持续集成与交付:
- 实施持续集成和交付(CI/CD)流程,确保驱动程序的持续更新和交付,保持系统与硬件的良好兼容性和稳定性。
以上是 pnputil 命令的顶尖级应用大纲,适用于需要极为高级、复杂和智能化驱动程序管理解决方案的专业团队和企业。
pnputil 是一个命令行实用程序,它用于管理 Windows 系统中的设备驱动程序。它提供了一种简单的方式来安装、卸载、列出和导出设备驱动程序。
`C:\Users\Administrator>pnputil /?
Microsoft PnP 工具
PNPUTIL [/add-driver <...> | /delete-driver <...> |
/export-driver <...> | /enum-drivers |
/enum-devices [<...>] | /enum-interfaces [<...>] |
/disable-device <...> | /enable-device <...> |
/restart-device <...> | /remove-device <...> |
/scan-devices [<...>] | /?]
命令:
/add-driver <filename.inf | *.inf> [/subdirs] [/install] [/reboot]
将驱动程序包添加到驱动程序存储中。
/subdirs - 遍历驱动程序包的子目录。
/install - 在任何匹配的设备上安装/更新驱动程序。
/reboot - 根据需要重新启动系统以完成此操作。
示例:
添加驱动程序包:
pnputil /add-driver x:\driver.inf
添加多个驱动程序包:
pnputil /add-driver c:\oem\*.inf
添加和安装驱动程序包:
pnputil /add-driver device.inf /install
/delete-driver <oem#.inf> [/uninstall] [/force] [/reboot]
从驱动程序存储中删除驱动程序包。
/uninstall - 从任何使用驱动程序包的设备中卸载驱动程序包。
/force - 删除驱动程序包,即使有设备正在使用它。
/reboot - 根据需要重新启动系统以完成此操作。
示例:
删除驱动程序包:
pnputil /delete-driver oem0.inf
强制删除驱动程序包:
pnputil /delete-driver oem1.inf /force
/export-driver <oem#.inf | *> <目标目录>
从驱动程序存储中将驱动程序包导出到目标目录中。
示例:
导出驱动程序包:
pnputil /export-driver oem6.inf .
导出所有驱动程序包:
pnputil /export-driver * c:\backup
/enum-drivers
枚举驱动程序存储中的所有第三方驱动程序包。
示例:
枚举所有 OEM 驱动程序包:
pnputil /enum-drivers
/disable-device | /deviceid [/reboot]
禁用系统上的设备。
/deviceid <device ID> - 禁用带匹配设备 ID 的所有设备。
/reboot - 根据需要重新启动系统以完成此操作。
示例:
禁用设备:
pnputil /disable-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
禁用具有特定硬件/兼容 ID 的所有设备:
pnputil /disable-device /deviceid "USB\Class_03"
/enable-device | /deviceid [/reboot]
启用系统上的设备。
/deviceid <device ID> - 启用带匹配设备 ID 的所有设备。
/reboot - 根据需要重新启动系统以完成此操作。
示例:
启用设备:
pnputil /enable-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
启用具有特定硬件/兼容 ID 的所有设备:
pnputil /enable-device /deviceid "USB\Class_03"
/restart-device | /deviceid [/reboot]
重启系统上的设备。
/deviceid <device ID> - 重启带匹配设备 ID 的所有设备。
/reboot - 根据需要重新启动系统以完成此操作。
示例:
重启设备:
pnputil /restart-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
重新启动具有特定硬件/兼容 ID 的所有设备:
pnputil /restart-device /deviceid "USB\Class_03"
/remove-device | /deviceid [/subtree] [/reboot]
尝试从系统中删除设备。
/deviceid <device ID> - 删除带匹配设备 ID 的所有设备。
/subtree - 删除整个设备子树,包括任何子设备。
/reboot - 根据需要重新启动系统以完成此操作。
示例:
删除设备:
pnputil /remove-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
删除具有特定硬件/兼容 ID 的所有设备:
pnputil /remove-device /deviceid "USB\Class_03"
/scan-devices [/instanceid <实例 ID>] [/async]
扫描系统以查找任何设备硬件更改。
/instanceid <实例 ID> - 在设备子树中扫描更改。
/async - 异步扫描更改。
示例:
扫描设备:
pnputil /scan-devices
/enum-devices [/connected | /disconnected] [/instanceid <实例 ID>]
[/class <name | GUID>] [/problem []] [/deviceids]
[/relations] [/drivers]
枚举系统上的所有设备。
/connected | /disconnected - 按连接的设备筛选或
按断开连接的设备筛选。
/instanceid <实例 ID> - 按设备实例 ID 筛选。
/class <名称 | GUID> - 按设备类名称或 GUID 筛选。
/problem [<代码>] - 按出现问题的设备筛选或
按特定问题代码筛选。
/bus [<name | GUID>]-显示总线枚举器名称和总线类型 GUID 或
按总线枚举器名称或总线类型 GUID 筛选。
/deviceids-显示硬件/兼容 ID。
/relations - 显示父级和子级设备关系。
/drivers - 显示匹配的驱动程序和已安装的驱动程序。
/stack-显示设备堆栈信息。
/interfaces - 显示设备接口。
/properties - 显示所有设备属性。
示例:
仅枚举系统上已连接的设备:
pnputil /enum-devices /connected
枚举具有特定实例 ID 的设备:
pnputil /enum-devices /instanceid "ACPI\PNP0A08\1"
枚举具有特定类的所有设备:
pnputil /enum-devices /class Display
pnputil /enum-devices /class {4d36e97d-e325-11ce-bfc1-08002be10318}
枚举具有特定问题代码的所有设备:
pnputil /enum-devices /problem 28
pnputil /enum-devices /problem 0xA
枚举具有特定总线的所有设备:
pnputil /enum-devices /bus PCI
pnputil /enum-devices /bus {c8ebdfb0-b510-11d0-80e5-00a0c92542e3}
枚举具有问题的所有设备并显示硬件/兼容 ID:
pnputil /enum-devices /problem /deviceids
/enum-interfaces [/enabled | /disabled] [/class ]
枚举系统上的所有设备接口。
/enabled | /disabled - 按启用的接口筛选或
按禁用的接口筛选。
/class <GUID> - 按接口类 GUID 筛选。
示例:
仅枚举系统上的已启用接口:
pnputil /enum-interfaces /enabled
枚举具有特定接口类 GUID 的所有接口:
pnputil /enum-interfaces /class {884b96c3-56ef-11d1-bc8c-00a0c91405dd}
/?
显示使用情况屏幕。`
使用 pnputil 可以完成以下任务:
安装设备驱动程序:将设备驱动程序添加到驱动程序存储库并安装它们。这对于管理员或高级用户来说是很有用的,可以通过命令行界面批量安装驱动程序。
卸载设备驱动程序:从系统中移除不需要的设备驱动程序。这对于解决驱动程序冲突或进行系统清理是很有帮助的。
列出已安装的设备驱动程序:显示系统中已安装的设备驱动程序列表。这可以提供有关系统中设备驱动程序状态的信息。
导出设备驱动程序:将已安装的设备驱动程序导出到指定的文件夹,以便备份或共享给其他计算机。
以下是使用 pnputil 的一些示例:
安装设备驱动程序:
pnputil /add-driver <inf文件路径> /install
使用上面的命令将指定的 .inf 文件安装为设备驱动程序。
卸载设备驱动程序:
pnputil /remove-driver <驱动程序名称>
使用上面的命令卸载指定名称的设备驱动程序。
列出已安装的设备驱动程序:
pnputil /enum-drivers
使用上面的命令列出系统中已安装的设备驱动程序。
导出设备驱动程序:
pnputil /export-driver <驱动程序名称> /copyfiles <目标文件夹路径>
使用上面的命令将指定名称的设备驱动程序导出到指定的目标文件夹。
安装设备驱动程序:
pnputil /add-driver <inf文件路径> /install
该命令将指定的 .inf 文件安装为设备驱动程序。
卸载设备驱动程序:
pnputil /remove-driver <驱动程序名称>
该命令将卸载指定名称的设备驱动程序。
列出已安装的设备驱动程序:
pnputil /enum-drivers
该命令将列出系统中已安装的设备驱动程序。
导出设备驱动程序:
pnputil /export-driver <驱动程序名称> /copyfiles <目标文件夹路径>
该命令将指定名称的设备驱动程序导出到指定的目标文件夹。
显示帮助信息:
pnputil /?
该命令将显示 pnputil 命令的帮助信息,包括所有可用的参数和示例。
列出指定硬件ID的设备驱动程序:
pnputil /enum-drivers /class <硬件ID>
该命令将列出指定硬件ID的设备驱动程序。
列出指定设备驱动程序的详细信息:
pnputil /enum-drivers /all
该命令将列出所有已安装设备驱动程序的详细信息,包括名称、供应商和版本等。
重启计算机以完成设备驱动程序的安装或卸载:
pnputil /restart
该命令将重启计算机以使设备驱动程序的安装或卸载生效。
清理非常驻内存的设备驱动程序:
pnputil /clean-driverstore
该命令将清理驱动程序存储库中的非常驻内存驱动程序。
强制删除指定设备驱动程序:
pnputil /delete-driver <驱动程序名称> /force
该命令将强制删除指定名称的设备驱动程序,即使驱动程序正在使用中也会被删除。
列出所有第三方驱动程序:
pnputil /enum-drivers /thirdparty
该命令将列出所有第三方设备驱动程序。
列出指定类别的设备驱动程序:
pnputil /enum-drivers /class <类别名称>
该命令将列出指定类别的设备驱动程序。
将设备驱动程序安装到指定的设备实例ID:
pnputil /add-driver <inf文件路径> /install /installfrom <设备实例ID>
该命令将指定的 .inf 文件安装为设备驱动程序,并将其安装到指定的设备实例ID。
删除驱动程序包:
pnputil /delete-driver <驱动程序名称>
该命令将删除指定名称的驱动程序包。
显示设备实例ID和设备描述符:
pnputil /enum-devices /verbose
该命令将显示设备实例ID和设备描述符的详细信息。
导出驱动程序包:
pnputil /export-driver <驱动程序名称> <导出文件路径>
该命令将指定名称的驱动程序包导出到指定路径的文件中。
恢复所有从 Windows 更新或驱动程序存储库备份中删除的驱动程序:
pnputil /restore-driver
该命令将恢复所有从 Windows 更新或驱动程序存储库备份中删除的驱动程序。
查找启动启动失败的设备并将其禁用:
pnputil /disable-device <硬件ID>
该命令将查找由于驱动程序问题而启动失败的设备,并将其禁用。
在检测到未知设备时自动安装设备驱动程序:
pnputil /add-driver <inf文件路径> /install
该命令将在检测到未知设备时自动安装指定的 .inf 设备驱动程序文件。
列出所有已安装的驱动程序:
pnputil /enum-drivers
该命令将列出系统中所有已安装的驱动程序。
列出所有设备实例ID:
pnputil /enum-devices
该命令将列出系统中所有设备的实例ID。
安装指定的驱动程序包:
pnputil /add-driver <inf文件路径>
该命令将安装指定的 .inf 文件中的驱动程序包。
删除指定的驱动程序包:
pnputil /delete-driver <驱动程序名称>
该命令将删除指定名称的驱动程序包。
导入驱动程序包到驱动程序存储库(驱动程序存储库是系统用于驱动程序管理的位置):
pnputil /add-driver <inf文件路径> /install
该命令将指定的 .inf 文件导入到驱动程序存储库,并让系统可以自动安装该驱动程序。
在 Windows Server 2022 中,pnputil 命令用于管理设备驱动程序的安装、删除、列出等操作。以下是根据功能对 pnputil 命令选项进行的分类:
1. pnputil 命令功能分类表 (Windows Server 2022)
| 功能类别 | 命令选项 | 说明 |
|---|---|---|
| 驱动程序包管理 | /add-driver <驱动路径> /subdirs |
添加指定路径下的驱动程序包(包括子目录中的 INF 文件)。 |
/delete-driver <驱动INF文件> |
删除指定的驱动程序包,要求提供 INF 文件路径。 | |
/enum-drivers |
列出所有已安装的驱动程序包信息。 | |
/list-drivers |
列出系统中所有已安装的驱动程序包。 | |
/force |
强制安装不符合签名要求的驱动程序包。 | |
| 驱动程序安装与卸载 | /install <驱动INF文件> |
安装指定路径下的驱动程序包。 |
/uninstall <驱动INF文件> |
卸载指定路径下的驱动程序包。 | |
| 设备管理 | /list-devices |
列出已安装的设备列表。 |
/device <设备ID> |
显示指定设备的详细信息。 | |
| 驱动程序信息查询 | /enum-device <设备ID> |
列出与指定设备相关的所有驱动程序包。 |
| 驱动程序包详细信息 | /driver-info <驱动INF文件> |
显示指定驱动程序包的详细信息。 |
2. pnputil 常用命令选项
| 命令选项 | 功能描述 |
|---|---|
/add-driver <驱动路径> /subdirs |
添加驱动程序包,/subdirs 选项会包括子目录中的 INF 文件。 |
/delete-driver <驱动INF文件> |
删除指定的驱动程序包,要求指定驱动程序包的 INF 文件路径。 |
/enum-drivers |
显示所有已安装的驱动程序包。 |
/list-drivers |
列出系统中所有已安装的驱动程序包。 |
/install <驱动INF文件> |
安装指定路径下的驱动程序包。 |
/uninstall <驱动INF文件> |
卸载指定路径下的驱动程序包。 |
/list-devices |
列出已安装的设备及其相关信息。 |
/device <设备ID> |
显示指定设备的详细信息。 |
/enum-device <设备ID> |
列出与指定设备相关的所有驱动程序包。 |
/driver-info <驱动INF文件> |
显示指定驱动程序包的详细信息,包括版本、提供商等信息。 |
/force |
强制安装不符合签名要求的驱动程序包。 |
3. pnputil 命令选项详解
| 选项 | 说明 |
|---|---|
/add-driver <驱动路径> /subdirs |
将指定路径下的驱动程序包添加到驱动程序存储库中。如果路径包含子目录,可以通过 /subdirs 选项递归包含子目录。 |
/delete-driver <驱动INF文件> |
删除指定的驱动程序包,通常需要提供 INF 文件路径。此操作会从系统中删除驱动程序包。 |
/enum-drivers |
列出所有已安装的驱动程序包,显示每个驱动的 INF 文件名称、版本号、提供商等信息。 |
/list-drivers |
显示所有已安装的驱动程序包及其基本信息(例如提供商、版本、文件位置等)。 |
/install <驱动INF文件> |
从指定路径安装驱动程序包。通常用于手动安装特定驱动。 |
/uninstall <驱动INF文件> |
卸载指定驱动程序包,删除驱动包并将其从系统中移除。 |
/list-devices |
列出系统中已安装的所有设备及其信息,如设备 ID、驱动程序状态等。 |
/device <设备ID> |
显示指定设备的详细信息,包括设备 ID、驱动程序、状态、驱动版本等。 |
/enum-device <设备ID> |
列出与指定设备相关的所有驱动程序包信息。 |
/driver-info <驱动INF文件> |
显示指定驱动程序包的详细信息,包括版本号、提供商、日期、安装路径等。 |
/force |
强制安装不符合签名要求的驱动程序包,通常用于安装未经认证的第三方驱动程序。 |
4. 常见用法示例
| 用法 | 说明 |
|---|---|
pnputil /add-driver C:\Drivers\xyz.inf /subdirs |
安装 C:\Drivers 目录下的所有驱动程序包(包括子目录)。 |
pnputil /delete-driver C:\Drivers\xyz.inf |
删除指定路径下的驱动程序包(如 xyz.inf)。 |
pnputil /list-drivers |
列出系统中所有已安装的驱动程序包。 |
pnputil /install C:\Drivers\xyz.inf |
安装指定路径下的驱动程序包。 |
pnputil /uninstall C:\Drivers\xyz.inf |
卸载指定路径下的驱动程序包。 |
pnputil /list-devices |
列出所有已安装的设备信息。 |
在 Windows Server 2022 中,pnputil 命令提供了强大的功能,允许管理员管理设备驱动程序包、安装、卸载设备驱动、查询驱动程序信息以及强制安装不签名的驱动程序包。以上总结了常见功能及命令选项,帮助系统管理员更高效地使用该工具进行驱动程序管理。

浙公网安备 33010602011771号