WMI —— Windows Management Instrumentation【推荐新的MI】
Windows Management Instrumentation
大多会被翻译为“Windows管理规范”,Instrumentation
含义为仪器仪表、器乐谱写等,类似可以操作的界面或规范或手册一类,也可以看做“工具”,但明显和实用类的工具含义上有所不同。百度百科中为“插桩”,指的是获取计算机软件或者硬件状态的数据的技术,具体解释很贴切,但是“插桩”两个字感觉很“陌生”,不贴切。
WMI就是用来获取Windows系统信息(软硬件、网络等)的技术,并提供可供vbs、powershell、.NET/C#等各种编程语言使用的接口。
WMI底层是基于COM的。同时WMI在性能上并不是很好。WMI目前已经不推荐使用,其最新版本(或替代品)为
Windows Management Infrastructure
(MI),它与WMI完全兼容,使用WMI方式可以访问MI,现代编程更推荐直接使用MI。Why Use MI?介绍到,MI使用新的本地API和
.NET API
(不再需要使用复杂的COM代码与WMI交互),SDK开箱即用,减少开发时间;与PowerShell紧密集成;基于最新的标准。其具体使用可直接参见官方文档。How to Implement a Managed MI Client
WMI介绍
WMI出现至今已经二十多年,很多人一般对它并不熟悉。虽然很好很强大,但是似乎使用很少、具体是什么也不清楚。
- WMI有一组API。
通过WMI向外暴露的一组API,使用VBScript、PowerShell脚本或利用C#,可以访问 WMI
的类库。这些API是在系统安装WMI模块的时候安装的,通过它们能够拿到我们想要的类和信息。
- WMI有一个存储库。
尽管WMI的多数实例数据都不存储在WMI中,但是WMI确实有一个存储库,用来存放提供程序提供的类信息,或者称为类的蓝图或者Schema。
【此处参考自下面列出的:WMI入门(一):什么是WMI。“蓝图”两个字感觉太让人摸不着头脑了,然后搜了多资料都没找到“蓝图”对应的英文到底什么?】
- WMI有一个Service。
WMI总是能够响应用户的访问,那是因为它有一个一直运行的Windows服务,名字叫Winmgmt
。停止这个服务,所有对WMI的操作都将没有反应。
- WMI是可扩展的。
WMI可以获取或操作各种系统信息,读取本机硬盘信息、内存信息、网络信息、读取远程计算机的用户信息、读取域用户信息、重启、关机、关闭进程、创建进程等等。基本上,你能想到的获取或者更改资源的操作,它都能干。WMI之所以功能这么强大,是基于WMI的可扩展性。
WMI对资源的各种操作,完全取决于向它注册的提供程序,并不是它自己实现了什么方法。
WMI存储库是用于存储WMI静态数据的存储空间。WMI服务扮演着WMi提供者、管理应用和WMI存储库之间的协调者角色,一般来说,它是通过一个共享的服务进程Svchost
来实施工作的。
WMI服务和上层应用之间是通过COM/DCOM接口来实现的
WMI本身的组织架构是一个数据库架构,WMI 服务使用 DCOM(TCP 端口135)或 WinRM 协议(SOAP–端口 5985)。
WMI的简单使用
WMI的使用通常的方法一般是 PowerShell 中,此外则是VB Script
、.NET
中。
比如,powershell 中获取本机安装的所有软件列表:
Get-WmiObject -Class Win32_Product | select name
C# 操作 WMI 获得本机安装软件的列表:
ManagementPath wmiPath = new ManagementPath(@"\\.\root\cimv2:Win32_Product");
using ManagementClass wmiClass = new ManagementClass(wmiPath);
ManagementObjectCollection instances = wmiClass.GetInstances();
Console.WriteLine("Name, Vendor");
foreach (ManagementObject product in instances)
{
Console.WriteLine(String.Format("{0}, {1} ", product["Name"], product["Vendor"]));
}
WMI:如何查找需要的类(WMI类的层次结构)
WMI的类是以命名空间和继承层次方式组织的,呈树形结构。
命名空间的根是root
,在它的下面还有十几个命名空间,最常用的是root\cimv2
。命名空间的信息存储在静态类__Namespace
类中,要查询当前命名空间下的所有命名空间,可以查看__Namespace
类的实例。
以下是使用PowerShell
查询到的命名空间:
PS ...> Get-WmiObject -Class __namespace -Namespace root | select name
name
----
subscription
DEFAULT
MSAPPS11
CIMV2
msdtc
Cli
SECURITY
HyperVCluster
SecurityCenter2
RSOP
PEH
WebAdministration
StandardCimv2
WMI
directory
Policy
virtualization
Interop
Hardware
ServiceModel
SecurityCenter
Microsoft
aspnet
Appv
此外,__Win32Provider
类可以查询当前系统中有哪些提供程序。
CIM_*
类是WMI的核心类和公共类,很多时候也被称为CIM核心类和公共类。
Win32_*
是Win32扩展类,查询实例大多在Win32扩展类中查询。例如Win32_Product
、Win32_LogicalDisk
等。
关于WMI类的查找,可以从以下几个官方地址入手:
Powershell 使用 WMI 查询实例
- Powershell 查询 BIOS 信息
Get-WmiObject -Class Win32_BIOS
- Powershell 查询计算机信息
Get-WmiObject -Class Win32_Operatingsystem
- Powershell 查询命名空间
Get-WmiObject -Class __namespace -Namespace root | select name
- Powershell 查询杀毒软件
Get-WmiObject -Namespace root\SecurityCenter2 -Class AntiVirusProduct
#注意:在旧版中查询杀软的WMI命名空间为 SecurityCenter
Powershell 操作 WMI 的对象使用的是内置模块Get-WmiObject
,常见查询的类为Win32_Service
、Win32_BaseService
、Win32_TerminalService
、Win32_SystemDriver
使用 wmic 操作 WMI
wmic是管理WMI的一个工具或组件,可以直接在命令行工具中作为命令使用。通常在第一次使用时会进行安装。
- 查询系统版本
> wmic os get caption
Caption
Microsoft Windows 10 专业版
- 查询系统结构
> wmic os get osarchitecture
OSArchitecture
64-bit
wmic OS get Caption,CSDVersion,OSArchitecture,Version
- 查询本机所有盘符
> fsutil fsinfo drives
驱动器: C:\ D:\ E:\ I:\ Z:\
> wmic logicaldisk list brief
DeviceID DriveType FreeSpace ProviderName Size VolumeName
C: 3 7604596736 310957813760 SSDOS
D: 3 83163639808 189146894336 新加卷
E: 2 7084277760 123010543616 TC
I: 5
Z: 5
> wmic logicaldisk get description,name,size,freespace /value
Description=Local Fixed Disk
FreeSpace=7603585024
Name=C:
Size=310957813760
Description=Local Fixed Disk
FreeSpace=83163017216
Name=D:
Size=189146894336
Description=Removable Disk
FreeSpace=7084277760
Name=E:
Size=123010543616
Description=CD-ROM Disc
FreeSpace=
Name=I:
Size=
Description=CD-ROM Disc
FreeSpace=
Name=Z:
Size=
- 查看系统中⽹卡的IP地址和MAC地址
wmic nicconfig get ipaddress,macaddress
- ⽤户列表
wmic useraccount list brief
- 查看当前系统是否有屏保保护,延迟是多少
wmic desktop get screensaversecure,screensavertimeout
- 域控机器
wmic ntdomain list brief
- 查询杀毒软件
需要在cmd中执行。
wmic /namespace:\\root\securitycenter2 path antispywareproduct GET displayName,productState, pathToSignedProductExe && wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName,productState, pathToSignedProductExe
- 查询启动项
wmic startup list brief | more
或
wmic startup list full
- 获取打补丁信息
wmic qfe list
- 获取BIOS主板序列号
wmic bios get serialnumber
参考
- WMI入门(一):什么是WMI
- WMI入门(三):我需要的类在哪里?
- WMI 体系结构
- WMI的讲解(是什么,做什么,为什么),内容介绍并没有标题写得那么好。
- 另,推荐Windows WMIC命令使用详解(附实例)