[TOC]
0x00 前言简述 Q: 什么是WMI? 答: WMI出现至今已经多年,但很多人对它并不熟悉。知道它很好很强大,但不知道它从哪里来,怎么工作,使用范围是什么?
WMI有一组API我们不管使用VBScript、PowerShell脚本还是利用C#的来访问WMI的类库,都是因为WMI向外暴露的一组API。这些API是在系统安装WMI模块的时候安装的,通过他们我们能够能拿到我们想要的类。 WMI有一个存储库。尽管WMI的多数实例数据都不存储在WMI中,但是WMI确实有一个存储库,用来存放提供程序提供的类信息,或者称为类的蓝图或者Schema。 WMI有一个Service。WMI总是能够响应用户的访问,那是因为它有一个一直运行的Windows服务,名字叫Winmgmt。停止这个服务,所有对WMI的操作都将没有反应。 WMI是可扩展的。人人都知道WMI能干很多事情,读取本机硬盘信息、读取远程计算机的用户信息、读取域用户信息等等。基本上你能想到的获取或者更改资源的操作它都能干。可谓吃得少干得多。它为什么这么能干呢?这基于WMI的可扩展性。WMI对资源的操作,不是它自己实现了什么方法,而完全取决于向它注册的提供程序。 WMI是管理员日常必备的强大工具之一,是脚本伴侣。当然也可以把一个大型系统建立在WMI以及WMI的提供程序之上
Q: WMI 可以做什么? 答: 通过使你的驱动程序成为 WMI 提供程序,你可以:
使自定义数据可用于 WMI 使用者。
允许 WMI 使用者通过标准接口而不是自定义控制面板应用程序来配置设备。
通知驱动程序定义事件的 WMI 使用者,无需使用者轮询或发送 Irp。
通过只收集请求的数据并将其发送到单个目标来减少驱动程序开销。
用描述性驱动程序定义的类名和可选说明注释数据和事件块,然后 WMI 客户端可以枚举并显示给用户。
Q: WMI 管理的常用命令以及工具
wmic.exe - Cmd 命令
Get-CimClass - Powershell 命令
Get-CimInstance - Powershell 命令
Get-WmiObject - Powershell 命令
0x01 命令解析 1.Get-CimClass 命令 - 获取特定命名空间中CIM类的列表 语法参数:
[TOC]
0x00 前言简述 Q: 什么是WMI? 答: WMI出现至今已经多年,但很多人对它并不熟悉。知道它很好很强大,但不知道它从哪里来,怎么工作,使用范围是什么?
WMI有一组API我们不管使用VBScript、PowerShell脚本还是利用C#的来访问WMI的类库,都是因为WMI向外暴露的一组API。这些API是在系统安装WMI模块的时候安装的,通过他们我们能够能拿到我们想要的类。 WMI有一个存储库。尽管WMI的多数实例数据都不存储在WMI中,但是WMI确实有一个存储库,用来存放提供程序提供的类信息,或者称为类的蓝图或者Schema。 WMI有一个Service。WMI总是能够响应用户的访问,那是因为它有一个一直运行的Windows服务,名字叫Winmgmt。停止这个服务,所有对WMI的操作都将没有反应。 WMI是可扩展的。人人都知道WMI能干很多事情,读取本机硬盘信息、读取远程计算机的用户信息、读取域用户信息等等。基本上你能想到的获取或者更改资源的操作它都能干。可谓吃得少干得多。它为什么这么能干呢?这基于WMI的可扩展性。WMI对资源的操作,不是它自己实现了什么方法,而完全取决于向它注册的提供程序。 WMI是管理员日常必备的强大工具之一,是脚本伴侣。当然也可以把一个大型系统建立在WMI以及WMI的提供程序之上
Q: WMI 可以做什么? 答: 通过使你的驱动程序成为 WMI 提供程序,你可以:
使自定义数据可用于 WMI 使用者。
允许 WMI 使用者通过标准接口而不是自定义控制面板应用程序来配置设备。
通知驱动程序定义事件的 WMI 使用者,无需使用者轮询或发送 Irp。
通过只收集请求的数据并将其发送到单个目标来减少驱动程序开销。
用描述性驱动程序定义的类名和可选说明注释数据和事件块,然后 WMI 客户端可以枚举并显示给用户。
Q: WMI 管理的常用命令以及工具
wmic.exe - Cmd 命令
Get-CimClass - Powershell 命令
Get-CimInstance - Powershell 命令
Get-WmiObject - Powershell 命令
0x01 命令解析 1.Get-CimClass 命令 - 获取特定命名空间中CIM类的列表 语法参数: 1 2 3 Get-CimClass [[-ClassName] <System.String>] [[-Namespace] <System.String>] -CimSession <Microsoft.Management.Infrastructure.CimSession[]> [-MethodName <System.String>] [-OperationTimeoutSec <System.UInt32>] [-PropertyName <System.String>] [-QualifierName <System.String>] [<CommonParameters>] Get-CimClass [[-ClassName] <System.String>] [[-Namespace] <System.String>] [-ComputerName <System.String[]>] [-MethodName <System.String>] [-OperationTimeoutSec <System.UInt32>] [-PropertyName <System.String>] [-QualifierName <System.String>] [<CommonParameters>]
基础示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Get-CimClass ; (Get-CimClass).count Get-CimClass -ClassName *disk* Get-CimClass -ClassName Win32* -MethodName Term* Get-CimClass -ClassName Win32* -PropertyName Handle Get-CimClass -ClassName Win32*Disk* -QualifierName Association Get-CimClass -Namespace root/CIMV2 | Where-Object CimClassName -like Win32* | Select-Object CimClassName $s = New-CimSession -ComputerName Server01, Server02Get-CimClass -ClassName *disk* -CimSession $s Get-CimClass -ClassName *disk* -ComputerName Server01, Server02
2.Get-CimInstance - 从CIM服务器获取类的CIM实例 基础语法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Get-CimInstance -CimSession <Microsoft.Management.Infrastructure.CimSession[]> [-Filter <System.String>] [-KeyOnly] [-Namespace <System.String>] [-OperationTimeoutSec <System.UInt32>] [-Property <System.String[]>] [-ResourceUri <System.Uri>] [-Shallow] [<CommonParameters>] Get-CimInstance -CimSession <Microsoft.Management.Infrastructure.CimSession[]> [-Namespace <System.String>] [-OperationTimeoutSec <System.UInt32>] -Query <System.String> [-QueryDialect <System.String>] [-ResourceUri <System.Uri>] [-Shallow] [<CommonParameters>] Get-CimInstance [-ClassName] <System.String> -CimSession <Microsoft.Management.Infrastructure.CimSession[]> [-Filter <System.String>] [-KeyOnly] [-Namespace <System.String>] [-OperationTimeoutSec <System.UInt32>] [-Property <System.String[]>] [-QueryDialect <System. String>] [-Shallow] [<CommonParameters>] Get-CimInstance [-InputObject] <Microsoft.Management.Infrastructure.CimInstance> -CimSession <Microsoft.Management.Infrastructure.CimSession[]> [-OperationTimeoutSec <System.UInt32>] [-ResourceUri <System.Uri>] [<CommonParameters>] Get-CimInstance [-ClassName] <System.String> [-ComputerName <System.String[]>] [-Filter <System.String>] [-KeyOnly] [-Namespace <System.String>] [-OperationTimeoutSec <System.UInt32>] [-Property <System.String[]>] [-QueryDialect <System.String>] [-Shallow] [<CommonParameters>] Get-CimInstance [-InputObject] <Microsoft.Management.Infrastructure.CimInstance> [-ComputerName <System.String[]>] [-OperationTimeoutSec <System.UInt32>] [-ResourceUri <System.Uri>] [<CommonParameters>] Get-CimInstance [-ComputerName <System.String[]>] [-Filter <System.String>] [-KeyOnly] [-Namespace <System.String>] [-OperationTimeoutSec <System.UInt32>] [-Property <System.String[]>] [-ResourceUri <System.Uri>] [-Shallow] [<CommonParameters>] Get-CimInstance [-ComputerName <System.String[]>] [-Namespace <System.String>] [-OperationTimeoutSec <System.UInt32>] -Query <System.String> [-QueryDialect <System.String>] [-ResourceUri <System.Uri>] [-Shallow] [<CommonParameters>]
基础示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Get-CimInstance -ClassName Win32_Process Get-CimInstance Win32_ComputerSystemProduct Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_Process|format-table processid,name,executablepath |Select-Object -First 10 Get-CimInstance -Namespace root -ClassName __Namespace Get-CimInstance -Query "SELECT * from Win32_Process WHERE name LIKE 'P%'" Get-CimInstance -ClassName Win32_Process -Filter "Name like 'P%'" Get-CimInstance -Class Win32_Process -Namespace ROOT\CIMV2 -Filter "name = 'qq.exe'" |format-table processid,name,executablepath $x = New-CimInstance -ClassName Win32_Process -Namespace root\cimv2 -Property @{ "Handle" =0 } -Key Handle -ClientOnlyGet-CimInstance -CimInstance $x $x = Get-CimInstance -Class Win32_Process -KeyOnly$x | Invoke-CimMethod -MethodName GetOwner$x = Get-CimInstance -Class Win32_Process -Property Name,KernelModeTime$x | Invoke-CimMethod -MethodName GetOwner$x ,$y = Get-CimInstance -ClassName Win32_Process$x | Format-Table -Property Name,KernelModeTime -AutoSize Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName Server01,Server02 $s = New-CimSession -ComputerName Server01,Server02Get-CimInstance -ClassName Win32_ComputerSystem -CimSession $s Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_Process -Filter "name = 'qq.exe'" | Invoke-CimMethod -Name Terminate Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_Service -Filter "State='Running'" Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_Service -Filter "name='spooler'" |Invoke-CimMethod -Name startservice Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_Service -Filter "name='spooler'" |Invoke-CimMethod -Name stopservice Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_Product |format-table name,version | Select-Object -First 10 Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_Process -Filter "NOT ExecutablePath LIKE '%Windows%'" | format-table ExecutablePath Get-CimInstance -Namespace ROOT\CIMV2 -Class win32_directory -filter "drive='f:' and filename='kk'" |select-object -first 10 Get-CimInstance -Namespace ROOT\CIMV2 -Class win32_directory -filter"drive='f:' and filename='test'" |Invoke-CimMethod -Name delete Get-CimInstance -Namespace ROOT\CIMV2 -Class win32_useraccount Get-CimInstance -Namespace ROOT\CIMV2 -Class win32_useraccount-filter "name='%UserName%'" |Invoke-CimMethod -Name rename("newUserName" ) Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_Group |format-table caption,InstallDate,LocalAccount,Domain,SID,Status Get-CimInstance -Namespace ROOT\CIMV2 -Class win32_computersystem |select-object Name,Domain,Manufacturer,Model,Username,Roles Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_QuickFixEngineering |select-object Caption,Description,HotFixID,InstalledOn Get-CimInstance -Namespace ROOT\SecurityCenter2 -Class AntiVirusProduct | select-object displayName,productState, pathToSignedProductExe Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_OnBoardDevice | select-object Desciption,DeviceType,Enabled,Status Get-CimInstance -Namespace ROOT\CIMV2 -classname Win32_DiskDrive Get-CimInstance -Namespace ROOT\CIMV2 -Class Win32_NTEventlogFile -filter "logfilename='windows powershell'" |Invoke-CimMethod -Name ClearEventlog
3.Get-WmiObject - 获取 WMI 类有关信息 描述: 获取 Windows Management Instrumentation (WMI) 类的实例或有关可用类的信息。
Tips: 从 PowerShell 3.0 开始,此 cmdlet 已被Get-CimInstance. Tips: Get-Alias gwmi
可以看到 gwmi 是 Get-WmiObject 的别名
语法参数: 1 2 3 4 5 6 7 8 9 10 11 Get-WmiObject [[-Class] <System.String>] [[-Property] <System.String[]>] [-Amended] [-AsJob] [-Authentication {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Authority <System.String>] [-ComputerName <System.String[]>] [-Credential <System.Management.Automation.PSCredential>] [-DirectRead] [-EnableAllPrivileges] [-Filter <System.String>] [-Impersonation {Default | Anonymous | Identify | Impersonate | Delegate}] [-Locale <System.String>] [-Namespace <System.String>] [-ThrottleLimit <System.Int32>] [<CommonParameters>] Get-WmiObject [[-Class] <System.String>] [-Amended] [-AsJob] [-Authentication {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Authority <System.String>] [-ComputerName <System.String[]>] [-Credential <System.Management.Automation.PSCredential>] [-EnableAllPrivileges] [-Impersonation {Default | Anonymous | Identify | Impersonate | Delegate}] [-List] [-Locale <System.String>] [-Namespace <System.String>] [-Recurse] [-ThrottleLimit <System.Int32>] [<CommonParameters>] Get-WmiObject [-Amended] [-AsJob] [-Authentication {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Authority <System.String>] [-ComputerName <System.String[]>] [-Credential <System.Management.Automation.PSCredential>] [-DirectRead] [-EnableAllPrivileges] [-Impersonation {Default | Anonymous | Identify | Impersonate | Delegate}] [-Locale <System.String>] [-Namespace <System.String>] -Query <System.String> [-ThrottleLimit <System.Int32>] [<CommonParameters>] -ComputerName : 指定管理操作的目标计算机。输入完全限定域名(FQDN)、NetBIOS名称或IP地址。 -Authentication : WMI 连接的身份验证级别 (`Default, None, Connect, Call, Packet, PacketIntegrity, PacketPrivacy, Unchanged`) -Credential : 默认是用户帐户名称系统会提示用户输入密码。 -Filter: 用WMI查询语言WQL的语法, 指定要用作筛选器的Where子句, 使用WMI查询语言(WQL)的语法。
简单示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 Get-WmiObject Win32_UserAccount Get-WmiObject Win32_Processor Get-WmiObject -Class Win32_Process Get-WmiObject -Class Win32_Bios | Format-List -Property * Get-WmiObject -class win32_OperatingSystem Get-WmiObject -Class Win32_OperatingSystem | Format-List BootDevice,BuildNumber,BuildType,Caption,CodeSet,CountryCode Get-WmiObject -class win32_ComputerSystem Get-WmiObject -class Win32_LogicalDisk Get-WMIObject -Class Win32_DiskDrive Get-WmiObject -Class Win32_Product | Select-Object -Property Name,Version,IdentifyingNumber Get-WMIObject -Class Win32_PhysicalMemory gwmi Win32_PhysicalMemory | %{$sum = 0} { $sum += $_ .Capacity } {Write-Host ($sum / 1GB) "GB" } Get-WmiObject win32_OperatingSystem FreePhysicalMemory Get-WmiObject -class Win32_NetworkAdapterConfiguration gwmi Win32_PerfFormattedData_Tcpip_NetworkInterface | select Name,CurrentBandwidth gwmi Win32_DiskDrive | %{$sum = 0} { $sum += $_ .Size } {Write-Host ($sum / 1GB) "GB" } Get-WmiObject Win32_LogicalDisk | Foreach-Object { 'Disk {0} has {1:0.0} MB space available' -f $_ .Caption, ($_ .FreeSpace / 1MB) } Get-WmiObject -Class Win32_Service -ComputerName 10.1.4.62 Get-WmiObject Win32_Service -Credential FABRIKAM\administrator -ComputerName Fabrikam (Get-WmiObject -Class Win32_Service -Filter "name='WinRM'" -ComputerName Server01).StopService() Get-WmiObject -Namespace "root/default" -List Get-WmiObject -Namespace "root/cimv2" -List Get-WmiObject Win32_LogicalDisk -filter "DeviceID = 'c:' " Get-WmiObject win32_service -filter "name='WinRM'" Get-WmiObject -Query "select * from win32_service where name='WinRM'" | Format-List -Property PSComputerName, Name, ExitCode, Name, ProcessID, StartMode, State, Status Get-WmiObject -query 'select * from SoftwareLicensingService' | Select OA3xOriginalProductKey,ClientMachineID,KeyManagementServiceProductKeyID Get-CimInstance -Namespace ROOT/WMI -Class MSAcpi_ThermalZoneTemperature wmic /namespace:\\root\cimv2 PATH Win32_PerfFormattedData_Counters_ThermalZoneInformation get Temperature $t = Get-WmiObject -Namespace "root/wmi" -ClassName MSAcpi_ThermalZoneTemperature foreach ($temp in $t .CurrentTemperature) { $currentTempKelvin = $temp / 10 $currentTempCelsius = $currentTempKelvin - 273.15 $currentTempFahrenheit = ( 9/ 5 ) * $currentTempCelsius + 32 Write-host $currentTempCelsius .ToString() "C" : $currentTempFahrenheit .ToString() "F" : $currentTempKelvin "K" } Get-CimInstance -Namespace ROOT/WMI -Class MSAcpi_ThermalZoneTemperature | % { $currentTempKelvin = $_ .CurrentTemperature / 10 $currentTempCelsius = $currentTempKelvin - 273.15 $currentTempFahrenheit = (9/5) * $currentTempCelsius + 32 "InstanceName: " + $_ .InstanceName+ " ==>> " + $currentTempCelsius .ToString() + " 摄氏度(C); " + $currentTempFahrenheit .ToString() + " 华氏度(F) ; " + $currentTempKelvin + "开氏度(K)" } (get-wmiobject -class win32_quickfixengineering).InstalledOn | Sort-Object | select -Last 1
语法示例:
简单示例: