
个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化《Windows Internals》读书笔记 10.4.1WMI 概述——Windows 管理基础设施的统一入口1. 什么是 WMI为什么它值得单独学习2. 一句话先理解WMI 到底是什么3. WMI 的核心组成Namespace、Class、Instance、Property、Method、Provider3.1 Namespace命名空间3.2 Class类3.3 Instance实例3.4 Property属性3.5 Method方法3.6 Provider提供程序4. WMI 的工作流程一次查询是怎么走通的4.1 发起请求4.2 进入 WMI API / COM 接口4.3 WMI 服务Winmgmt接收请求4.4 解析命名空间与类4.5 调用 WMI Provider4.6 返回结果5. WMI 能做什么为什么它在运维里特别重要5.1 信息查询5.2 硬件清点5.3 服务与进程管理5.4 事件监控5.5 脚本自动化6. 从企业桌面运维视角理解 WMI7. 常见 WMI / CIM 查询示例7.1 查询操作系统信息7.2 查询 BIOS 信息7.3 查询计算机系统信息7.4 查询磁盘信息7.5 查询服务信息7.6 查询网卡配置8. WMI、WMIC、CIM、PowerShell 之间到底是什么关系8.1 WMI 是底层管理体系8.2 WMIC 是旧的命令行工具8.3 Get-WmiObject 是旧 PowerShell 风格8.4 Get-CimInstance 是更推荐的新方式8.5 它们的关系可以这样记9. 学习 WMI 时要注意什么9.1 权限问题9.2 类名和命名空间要搞清楚9.3 远程连接依赖环境9.4 性能开销9.5 不要把 WMI 当成“万能答案”10. 本节小结11. 写在最后1. 什么是 WMI为什么它值得单独学习在学习 Windows Internals 时我们会频繁接触到一个非常重要的名字WMI。WMI 的全称是Windows Management Instrumentation它本质上是 Windows 提供的一套统一管理基础设施用于完成以下事情读取系统信息访问硬件与设备对象查询服务和进程状态监控系统事件配合脚本做自动化管理支持远程运维和集中化管理很多人第一次接触 WMI 时会误以为它只是一个“查信息的工具接口”。但实际上WMI 不是一个单点功能而是一整套管理对象模型 数据访问框架 自动化运维基础能力。换句话说WMI 不是一个具体的命令而是 Windows 中统一访问和管理系统对象的一层管理接口。这也是为什么很多企业级桌面支持、PowerShell 脚本、资产盘点工具、远程巡检方案底层都离不开 WMI。从这张图中我们可以先建立一个整体印象WMI 可以连接系统信息可以连接硬件设备可以连接服务与进程可以连接事件与告警还可以和PowerShell / VBScript / WMIC等工具协作所以从定位上看WMI 就像 Windows 的一个“统一管理入口层”。2. 一句话先理解WMI 到底是什么如果你想用最通俗的话来理解 WMI我建议先记住下面这句话WMI 是 Windows 把系统中的各种可管理对象统一抽象出来后提供给管理员、脚本和运维工具使用的一套管理框架。这里的“可管理对象”包括但不限于操作系统版本BIOS 信息CPU / 内存 / 磁盘网卡与网络配置进程与服务事件日志用户与账户补丁与系统状态也就是说很多原本散落在不同组件中的信息在 WMI 里都可以通过统一的方式来访问。比如你想知道当前系统版本是多少机器序列号是什么哪些服务正在运行当前有哪些进程网卡 IP 和 DNS 是什么某个事件是否触发过这些都可以通过 WMI 去获取。3. WMI 的核心组成Namespace、Class、Instance、Property、Method、Provider真正理解 WMI关键不是死记命令而是先把它的对象模型搞清楚。很多人学 WMI 卡住根因就在这里看到了命令却没看懂底层对象关系。WMI 的核心组成主要包括以下几个部分组件作用可以怎么理解Namespace命名空间类似文件夹用来组织 WMI 对象Class类对象模板定义一类对象长什么样Instance实例某个类在系统中的具体对象Property属性描述对象的特征、状态、配置值Method方法对象可以执行的操作Provider提供程序负责把真实系统数据映射到 WMI结合这张图我来用更白话的方式解释一下3.1 Namespace命名空间命名空间可以理解为WMI 世界里的“目录结构”或“逻辑容器”。常见命名空间包括root\cimv2root\defaultroot\subscriptionroot\securitycenter2其中最常见的就是root\cimv2很多常用类都在这里。3.2 Class类类可以理解为一个模板。比如Win32_OperatingSystem这个类就是“操作系统对象”的模板。它规定了这个对象有哪些属性可以做哪些操作会暴露什么信息3.3 Instance实例实例就是类在系统中的真实对象。例如Win32_OperatingSystem这个类通常会对应当前系统这一条实例Win32_Process这个类会对应系统里当前运行的多个进程实例Win32_Service这个类会对应系统中的多个服务实例类是模板实例才是真实数据。3.4 Property属性属性就是对象的具体信息比如NameVersionManufacturerStatusProcessId这些字段就是 WMI 查询时最常看到的内容。3.5 Method方法方法表示这个对象可以执行的动作。例如某些服务类对象可能支持StartService()StopService()这说明 WMI 不只是“读”还可以“管”。3.6 Provider提供程序Provider 是整个 WMI 体系中非常关键但容易被忽略的一层。它的作用是把底层真实系统数据映射成 WMI 对象让外部工具能够统一访问。也就是说WMI 本身更像一个统一访问框架真正的数据通常来自具体的 Provider 和系统组件。4. WMI 的工作流程一次查询是怎么走通的理解 WMI 还有一个很重要的角度就是它的工作链路。当我们执行一条 WMI 查询时并不是“命令一打结果直接出来”那么简单。它背后其实有一条完整的数据流。从这张图可以看到WMI 查询通常会经历以下过程4.1 发起请求请求可能来自PowerShellVBScriptWMIC旧第三方管理工具自动化平台企业运维脚本4.2 进入 WMI API / COM 接口工具不是直接去读系统底层而是先通过 WMI 的接口层进入。这一层负责接收请求封装为 WMI 调用交给 WMI 服务处理4.3 WMI 服务Winmgmt接收请求WMI 服务会对请求进行接收验证路由分发这是 WMI 运行的核心服务层。4.4 解析命名空间与类系统会定位到具体的NamespaceClass查询对象并根据查询内容决定应该调用哪个 Provider。4.5 调用 WMI ProviderProvider 去访问底层真实组件比如硬件进程服务网络配置事件数据然后把这些数据按 WMI 模型返回回来。4.6 返回结果最后查询结果再回到上层工具比如 PowerShell 窗口中输出。所以一次 WMI 查询的本质流程可以概括为PowerShell / 管理工具 / 脚本WMI API / COM 接口WMI 服务 Winmgmt命名空间与类解析对应 Provider底层系统真实数据这张链路图很重要因为它解释了为什么 WMI 不是简单命令而是一套体系化的管理通道。5. WMI 能做什么为什么它在运维里特别重要对于桌面运维、系统管理员、自动化工程师来说WMI 最有价值的地方在于它把“信息查询、对象管理、事件监控、脚本自动化、远程运维”串成了一条线。从图中我们可以看到WMI 最常见的能力包括5.1 信息查询例如系统版本当前用户安装补丁BIOS 信息主板信息5.2 硬件清点例如CPU内存磁盘网卡显示器信息这在企业资产盘点中非常实用。5.3 服务与进程管理例如查询服务状态查询进程状态控制某些服务启停获取进程路径、PID 等信息5.4 事件监控WMI 支持事件订阅这意味着你可以监控进程创建监控 USB 插入监控系统状态变化接收触发式告警5.5 脚本自动化WMI 与 PowerShell 结合后威力非常大。我们可以做批量采集信息批量巡检自动生成报表远程查询故障定位辅助脚本这也是为什么很多企业 IT 场景里WMI 经常被拿来作为底层信息源。6. 从企业桌面运维视角理解 WMI如果你是桌面支持工程师WMI 的价值会更直观。因为你日常面对的问题很多都可以通过 WMI 先拿到关键数据。比如在企业桌面运维场景中WMI 常见用途包括场景WMI 可以做什么终端资产采集获取序列号、型号、BIOS、硬盘信息故障排查读取启动项、事件、性能相关对象服务与进程检查查询服务状态、进程路径、依赖关系网络配置读取获取 IP、DNS、网关、网卡信息自动化脚本做批量巡检、远程查询、报表输出这张图其实已经把 WMI 在企业桌面运维中的价值讲得很清楚了WMI 不只是 Windows Internals 里的理论知识它在桌面支持现场是实实在在能用起来的。7. 常见 WMI / CIM 查询示例下面我给几个非常常见、非常适合入门理解的示例。说明现代 PowerShell 更推荐优先使用Get-CimInstance旧写法中常见Get-WmiObject。7.1 查询操作系统信息Get-CimInstance-ClassName Win32_OperatingSystem也可以查看指定字段Get-CimInstance-ClassName Win32_OperatingSystem|Select-ObjectCaption,Version,BuildNumber,LastBootUpTime7.2 查询 BIOS 信息Get-CimInstance-ClassName Win32_BIOS|Select-ObjectManufacturer,SMBIOSBIOSVersion,SerialNumber7.3 查询计算机系统信息Get-CimInstance-ClassName Win32_ComputerSystem|Select-ObjectManufacturer,Model,UserName,TotalPhysicalMemory7.4 查询磁盘信息Get-CimInstance-ClassName Win32_LogicalDisk|Select-ObjectDeviceID,VolumeName,FileSystem,Size,FreeSpace7.5 查询服务信息Get-CimInstance-ClassName Win32_Service|Select-ObjectName,State,StartMode,StartName7.6 查询网卡配置Get-CimInstance-ClassName Win32_NetworkAdapterConfiguration-FilterIPEnabled True|Select-ObjectDescription,IPAddress,DefaultIPGateway,DNSServerSearchOrder这些命令背后的共同点就是都在通过统一的 WMI / CIM 对象模型获取系统信息。8. WMI、WMIC、CIM、PowerShell 之间到底是什么关系这一块很多初学者都会混淆我这里帮你理清楚。8.1 WMI 是底层管理体系WMI 是 Windows 的对象管理基础设施。8.2 WMIC 是旧的命令行工具WMIC 是一个旧时代的命令行入口它底层也是访问 WMI。例如旧写法wmic os get Caption,Version,BuildNumber但现在它已经逐渐退出主流不建议作为首选。8.3 Get-WmiObject 是旧 PowerShell 风格例如Get-WmiObject-ClassWin32_OperatingSystem这个命令很多老脚本里还会见到但从今天的实践来看建议逐渐转向Get-CimInstance。8.4 Get-CimInstance 是更推荐的新方式例如Get-CimInstance-ClassName Win32_OperatingSystem它背后对应的是CIMCommon Information Model思路更现代也更适合新脚本。8.5 它们的关系可以这样记底层对象与系统数据ProviderWMI / CIM 对象模型Get-CimInstanceGet-WmiObjectWMIC一句话总结WMI 是体系WMIC 是旧工具Get-WmiObject 是旧入口Get-CimInstance 是当前更推荐的现代入口。9. 学习 WMI 时要注意什么WMI 很强大但使用时也要注意一些实际问题。9.1 权限问题有些 WMI 类和操作需要管理员权限。如果权限不够可能会报错或者返回不完整信息。9.2 类名和命名空间要搞清楚不是所有类都在同一个命名空间里。大多数常用类在root\cimv2但并不是全部。9.3 远程连接依赖环境如果你要做远程 WMI 查询需要考虑网络是否可达防火墙是否放行凭据是否正确DCOM / WinRM 等配置是否满足9.4 性能开销高频率、大范围 WMI 查询会带来一定开销。所以在企业批量巡检脚本中要注意查询粒度和执行频率。9.5 不要把 WMI 当成“万能答案”WMI 很强但它不是所有问题的唯一解。实际排障中仍要结合事件查看器任务管理器资源监视器可靠性监视器ProcMonProcess ExplorerAutoruns正确姿势不是“只看 WMI”而是把 WMI 当成底层对象信息入口之一。10. 本节小结这一节的重点不是记几个命令而是先把 WMI 的定位建立起来。我把今天这节内容浓缩成 6 句话WMI 是 Windows 的统一管理基础设施。它通过对象模型把系统信息、硬件、服务、事件等统一暴露出来。WMI 的核心理解离不开命名空间、类、实例、属性、方法和 Provider。WMI 本身更像访问框架真实数据通常来自底层 Provider 和系统组件。它在企业桌面运维中非常重要尤其适合资产采集、故障排查和自动化脚本。现代 PowerShell 实践中更推荐优先使用 Get-CimInstance。如果用一句最简单的话来总结WMI 是 Windows 管理世界里的“统一入口”它让管理员和脚本能以对象化方式理解并管理系统。11. 写在最后当我们刚开始学习 Windows Internals 时容易觉得 WMI 很抽象。但只要你把它和企业桌面支持、PowerShell 脚本、系统资产盘点、远程管理联系起来它就会一下子变得非常具体。很多时候排障不是先盯着图形界面而是先把底层对象数据拿出来。而 WMI正是帮助我们完成这件事的重要抓手。如果你后面还想继续往下学我建议下一步重点关注WMI 常见类的分类与命名规律Get-CimInstance的更多实战写法WMI 事件订阅WMI 在企业资产盘点中的批量化应用WMI 与 PowerShell 自动化结合的落地思路 返回顶部点击回到顶部