WMI学习总结

WMI

WMI,是Windows 2K/XP管理系统的核心;对于其他的Win32操作系统,WMI是一个有用的插件。WMI以CIMOM为基础,CIMOM即公共信息模型


对象管理器(Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一


个访问操作系统构成单元的公共接口。有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系


统的不同部分都可以插入WMI,如图所示,工具软件和脚本程序可以方便地读写WMI。
中文名 WMI 
外文名 Windows Management Instrumentation 
适用范围 Windows/XP系统 
使用者 计算机用户


定义
WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远


程计算机。
简介
Windows 2K/XP和Windows 98 都支持WMI;如果为NT 4.0和Windows 95加上了 Service Pack 4或更高版本,N
T 4.0和Win95也支持WMI。因此,用WMI进行远程管理时,并非一定要用Windows 2K/XP(当然,如果WMI脚本在一台没有性能监视器的


Win9x机器上运行,就不能在远程Win9x系统上查询Windows 2K/XP的性能监视器。
如前所述,WMI允许通过一个公共的接口访问多种操作系统构成单元,因此不必分别对待各种底层接口或所谓的“提供者”。利用WMI可


以高效地管理远程和本地的计算机;与此相对,并非所有的Windows 2K/XP命令行工具都支持远程运行。
WMI是WBEM模型的一种实现。WBEM即Web-Based Enterprise Management,或基于Web的企业管理,WBEM由DMTF(Distributed Management 


Task Force,分布式管理任务组)在许多厂商的帮助下创立,包括Compaq、Sun、Microsoft等。WBEM的目标是,为管理企业环境开发一


个标准的接口集。WBEM模型最关键的部分是它的数据模型(或描述和定义对象的方式)、编码规范(Encoding Specification),以及


在客户端和服务器端之间传输数据的模式。
WBEM的数据模型是CIM(Common Information Model,公共信息模型)。CIM是一个用来命名计算机的物理和逻辑单元的标准的命名系统


(或称为命名模式),例如硬盘的逻辑分区、正在运行的应用的一个实例,或者一条电缆。
CIM是一个面向对象的模型,使用一组面向对象的术语进行描述。CIM包含类(Class),类是被管理单元的模板。类的实例称为对象


(Object),对象代表着底层系统的一个具体单元。名称空间(Namespace)是一个类的集合,每个名称空间面向一个特定的管理领域。


类包含属性(Property)和方法(Method)。
CIM分三层。第一层是核心模型(Core Model),这一层包含的类定义对于所有管理领域来说都是共同的。第二层是公共模型(Common 


Model),这一层包含的类定义对于特定的管理领域来说是公共的,但与具体的操作系统和系统设计无关。第三层是扩展模型


(Extension model),这一层包含的类定义与特定的操作系统或技术有关。
WMI是Microsoft扩展CIM 2.0得到的面向Win32系统的扩展模型。引用WMI类和属性的形式是“扩展前缀_类名称.属性名称”,例如


Win32_ComputerSystem. Name,其中Win32是CIM模式cimv2名称空间内WMI扩展类的前缀,ComputerSystem是类,Name是属性。
编写WMI脚本的很大一部分工作涉及到读取和设置属性值。当前,WMI提供的方法还很有限,但随着时间的推移,相信WMI和CIM提供的方


法都会越来越丰富。
操作方法
利用WMI软件开发包(SDK)可以方便地查看可用的CIM和Win32类。WMI SDK可以从MSDN下载。
WMI SDK要求操作系统必须是Windows 2K/XP或者NT 4.0 SP4或更高版本;尽管Win9x系统上可以安装WMI支持软件,但SDK不能在Win9x上


运行。另外,为支持SDK的ActiveX控件,SDK还要求有IE 5.0或更高版本。SDK对机器性能的最低要求是:Pentium处理器,32 Mb的RAM,


40 Mb的磁盘空间,以及至少要有800 x 600、256色的显示设备。对于运行Windows 2K/XP的机器来说,这些要求应该不会成为问题。


CIMOM默认以服务的形式运行,但如果机器没有网卡,CIMOM不能作为服务运行,不过此时可以作为一个应用运行,只需执行winmgmt.exe


即可。winmgmt.exe在\%systemroot%\system32\wbem的WMI主目录下。
SDK必须由管理员组的成员安装。安装过程很简单,执行WMISdk.exe启动向导,指定安装的目标目录(默认是\program files\wmi)。选


择要安装的可选组件(默认安装除了SNMP支持以外的所有组件),最后点击Finish。安装SDK不需要重新启动。安装完成后,“开始/程


序”菜单上会增加一个WMI SDK组。
点击WMI SDK程序组的WMI CIM Studio。CIM Studio提示连接名称空间,并显示默认连接的名称空间是root\cimv2,确认即可。如果你用


Administrator身份登录Windows,再次点击确定以当前身份登录;如果你用其他的身份登录Windows,请改用Administrator登录。
假设我们要在当前的机器上查找一个对象:C:驱动器。我们不知道C:驱动器在CIM或WMI中的具体名称,浏览CIM Studio列出的数百个类


又太麻烦,怎么办呢?可以使用Find按钮(左边上方的望远镜,参见图三)。图二显示了点击Find按钮后显示的Search for Class对话


框,在这里输入我们猜想C:驱动器的类名称中应当包含的单词,然后点击Go!按钮。由于我们正在寻找一个命名的磁盘分区,而且我们知


道Windows把这种分区叫做logical disk或logical drive,因此这里的搜索关键词可以是logical。当然,搜索关键词也可以是disk,但


这时会有大量的搜索结果出现。
图二显示了搜索关键词logical得到的结果。选择Win32_LogicalDisk并点击OK,图三的窗口出现(为什么不选择CIM_LogicalDisk?前面


已经提到,WMI管理的所有对象都带有Win32前缀。如果选择CIM_LogicalDisk然后要求显示出它的实例,不可能看到可用逻辑驱动器的任


何具体信息,只能看到对应每一个可用逻辑驱动器的Win32_LogicalDisk条目)。现在,窗口的右边显示出Win32_logicalDisk类的属性


。可以看到,属性的值都为空,这是因为我们正在查看的是一个类,而不是类的具体实例。要显示出Win32_LogicalDisk类的实例,点击


右边上面的Instances按钮(右数第四)。
点击Instances按钮之后,窗口显示出当前机器上所有逻辑驱动器的实例,包括网络逻辑驱动器。点击设备ID为“C:”的实例,显示出图


四的结果。右边窗格包含了当前实例的属性和方法,当前逻辑驱动器的名称显示在右边窗格的上方。
利用脚本可以修改这些属性或调用这些方法。如果对某个属性的含义不太清楚,只需选择Win32_LogialDisk类或


Win32_LogicalDisk.DeviceID="C:"实例,再点击Help按钮。大多数对象的属性和方法都有详细的说明。
功能
现在很多朋友仍然在使用管理员账号密码为空的系统,这样就为黑客制造了可乘之机,其中系统自带的WMI是最方便的入侵通道。WMI


(Windows管理规范)作为一项Windows管理技术,方便用户对计算机进行远程管理。但是它的易用性也导致了系统的安全性大幅下降。


让用户的电脑除了自己账号密码的保护外再没有什么安全保护措施。本期我们就向大家介绍“菜鸟”级的黑客都可以轻易利用的入侵通


道——WMI(Windows管理规范)。
小知识:什么是WMI?
WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源,比如


用户可以在远程计算机器上启动一个进程;设定一个在特定日期和时间运行的进程;远程启动计算机;获得本地或远程计算机的已安装


程序列表;查询本地或远程计算机的Windows事件日志等等。
本质善良的WMI
从WMI本来的功能看,它是为了让计算机的管理更容易,同时方便管理员远程操作系统而产生的,那么它又怎么会为“菜鸟”级的入侵者


提供方便呢?
一般情况下,在本地计算机上执行的WMI操作也可以在远程计算机上执行,只要用户拥有该计算机的管理员权限。如果用户对远程计算机


拥有权限并且远程计算机支持远程访问,那么用户就可以连接到该远程计算机并执行拥有相应权限的操作。
WMI能够成为远程控制下的一个合法通道,有了这个通道,入侵者不需要对自己进行伪装,不必再为探测出对方账号的密码为空后,找不


到连接对方系统的通道而发愁。只要进行简单几个步骤就可以轻易地入侵到别人的电脑中。下面,我们就来看看,到底该如何利用WMI通


道。
WMI被利用为虎作伥
前面介绍了WMI的原理,下面我们实际了解下,如何通过WMI进行入侵。在网上,有很多利用WMI的小工具,这里我们就以rots.vbs工具进


行简单的演示,看一个“菜鸟”黑客如何轻易地入侵。
1.扫描135端口
要寻找可以通过WMI入侵的远程计算机,只要对135端口进行扫描就可以了。因为WMI服务默认打开的就是135端口。我们本次实例采用的


是NTscan扫描工具,因为它不但可以对IPC$、SMB、WMI这些信息进行扫描,同时还可以对扫描到的远程账户进行弱口令猜测,功能相对


来说比较强大。
运行NTscan,在程序窗口的“配置”区域中进行设置。首先在“起始IP”和“结束”选项中输入扫描的IP地址范围,接着选择“WMI扫描


”选项,并且在“扫描打开端口的主机”选项后输入“135”,最后点击“开始”按钮就开始进行扫描(如图)。
2.开启终端服务
找到可以入侵的远程计算机以后,就可以开始入侵操作了。首先使用的工具是一个名为rots.vbs的脚本程序,通过它可以开启远程计算


机的终端服务。脚本会自动判断目标系统类型,如果不是Windows 2000 Server及以上版本的系统,脚本就会提示是否要取消操作。因为


Windows 2000 Pro以下版本不能安装终端服务。
然后是开启终端服务。开启工具的使用方法非常简单,命令格式为:cscript rots.vbs <目标IP> <用户名> <密码> [服务端口] [自动


重启选项]
其中,[服务端口]和[自动重启选项]为可选参数,默认情况下,程序开启的终端服务端口为3389,如果用户需要修改,在[服务端口]选


项中填入你要的端口即可,而[自动重启选项]选项则是在开启终端服务以后重启系统用的。
举个例子:cscript.exerots.vbs 192.168.0.6 Administrator "" 4466 /r
上面这段实例的意思是开启192.168.0.6这台远程计算机的终端服务,并且将端口更改为4466,服务安装完成后自动重启。
屏闭135端口防御入侵
从上面的介绍大家都可以看出,整个过程中使用的端口都是135。所以为了防止别人通过WMI进行入侵,我们可以使用防火墙对135端口进


行屏蔽,这样就可以达到防范类似的入侵。用户加强自己的账号密码强度,也可以有效防范入侵。
关闭135端口的方法
我们使用到十六进制的编辑器,比如:WINHEX、UltraEdit等软件。运行UltraEdit,通过工具栏上的“打开文档”按钮找到系统


SYSTEM32文件夹下的rpcss.dll。接着点击“搜索”菜单中的“查找”命令,在弹出的窗口中查找“3100330035”这个字符串,找到后将


它替换为“3000300030”,并另存为其他的文件目录中,建议保存在C盘根目录下。
重新启动系统,用启动盘启动到DOS状态下,进入C盘后运行:copyrpcss.dllc:\windows\system32\rpcss.dll,然后重新启动计算机,


就会发现135端口已经被关闭。
使用网络防火墙也可以通过端口限制的手段进行屏蔽135端口。我们以天网网络防火墙为例。打开天网防火墙界面,依次点击“IP规则管


理→增加规则”,然后在弹出的窗口界面中,在数据包方向中选择“接收或者发送”,在数据包类型中选择“TCP”,最后在本地端口中


输入“135”,然后就是确定退出,最后保存规则即可。以后如果有数据从135端口进行传输,天网就会自动进行拦截。
识别代号
世界厂商识别代号
申请WMI的企业应向工作机构提出申请,申请时应如实填写《世界制造厂识别代号(WMI)申请表》,并提交相应的证明材料。
========

WMI入门 如何使用WMI

  知道了WMI是什么以后,肯定想要知道如何使用WMI干活。它能写“Hello World”吗?WMI没那么无聊,它一上来就会问你“你想要


什么?”或者“你想要更改什么?”。。。


WMI工具
  Windows本身提供了几个WMI工具供用户使用,包括WMIC.exe、WBEMTest.exe和WMI Administrative Tools等。前两个是系统自带的


,最后一个需要自己下载安装。不过说实话,我最喜欢WMI Administrative Tools。下载WMI Administrative Tools在这里。下面以WMI 


Administrative Tools为例说明如何使用工具使用WMI。


  下载并安装WMI Administrative Tools之后,会有4个工具,最常用的是其中的WMI CIM Studio。在开始菜单里单击它,你会发现它


是以网页形式在IE浏览器中打开的。


使用步骤如下:
  1、单击页面上部的电脑图标,会显示一个对话框,单击“Connect”按钮,如图1所示;


image


            图1


  2、任何时候出现如图2所示的登陆对话框,单击OK按钮即可;


image


            图2


  3、选择合适的命令空间(这里选择常用的root\cimv2),然后单击OK按钮,如图3所示;


image


            图3


  4、直接双击右侧类名,或者单击上部的望远镜按钮,在弹出的查找对话窗中输入你要查找的完整类名或者类名的一部分,单击Go按


钮查找;并在查找结果中选择你要查看的类名,单击OK按钮,如图4所示;


image


            图4


  5、单击右上部倒数第4个实例按钮,即可得到本机所有安装的软件列表,如图5所示;


image


            图5


任何WMI类以及实例的查看均可参考以上步骤。 


脚本操作WMI
  以前对WMI的操作都是通过VB Script进行的,现在更多人倾向于使用PowerShell来访问WMI类和对象。下面给出使用PowerShell命令


查询本机安装的所有软件列表的示例:


复制代码
PS C:\Users\luke> Get-WmiObject -Class Win32_Product | select name


name
----
HelpDesk
Windows Installer Clean Up
XML Notepad 2007
Microsoft Network Monitor 3.4
Microsoft Visual Studio 2010 Service Pack 1
ScreenRecorder
Microsoft Office Visual Web Developer 2007
Microsoft Office Visual Web Developer MUI (English) 2007
...
复制代码
比使用带界面的WMI要简单的多,而且还可以有很多筛选条件。


.Net操作WMI
  使用.Net中的高级语言来操作WMI也非常的方便。下面示例演示C#操作WMI获得本机安装软件的列表的代码:


复制代码
using System;
using System.Management;


namespace WMIDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementPath wmiPath = new ManagementPath(@"\\.\root\cimv2:Win32_Product");
            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"]));
            }
        }
    }
}


========

探索PowerShell WMI对象



http://marui.blog.51cto.com/1034148/296083
我记得在xp时代,经常使用的工具有一个叫做WMI Administrative Tools,是微软官方提供的用来查看、编辑WMI对象的,只是现在好似


不支持新的系统了。但是,在Win7、Server 2008下,这些功能都可以方便的通过PowerShell来完成。
首先,先来认识一下什么是WMI对象:
WMI是作为一个基本的数据库存在于Windows系统中的。我们可以连接到WMI服务请求查询其中所包含的信息。WMI包括了系统方方面面的


信息,包括:
  .  机器信息:制造商、型号、序列号等
  .  BIOS信息
  .  OS信息
  .  CPU信息:种类、制造商、速度、版本
  .  服务器内存总量
  .  磁盘信息:容量、格式等
  .  网络信息:MAC、IP等
  .  其他
可以看出WMI内容是多么的丰富,几乎包括了计算机的方方面面。
利用PowerShell查看WMI成员
在PowerShell中通过以下命令列出WMI对象:
get-wmiObject -list -namespace “root\CIMV2″ <enter> 


需要具体查看某个类的成员,使用下面的命令(例如类"win32_process"):
get-wmiobject -class win32_process -namespace "root\cimv2" | get-member 


可以看到每个有的成员是属性(Property),而有的则是方法(Method)。
那么,有两个问题:
为什么要使用-namespace "root\cimv2"? 
cimv2是WMI的一个命名空间,每个命名空间下有不同的WMI对象成员。cimv2是其默认设置。可以按照以下步骤进行修改:
控制面板 -> 管理工具 -> 计算机管理 -> 服务和应用程序 -> 右键"WMI控制" -> 属性 -> 高级
参数"-namespace"并非必须,但是,使用它有两个好处,一是保证我们能准确的查看指定命名空间下的WMI对象,因为有时默认命名空间


并非我们所希望查看的;二是如果不指定命名空间,被设置过的计算机可能拒绝我们的访问请求。
注:因为我使用英文版系统,上述步骤中个别名称可能不准确。


在如上图所示的界面,即可修改默认路径。
另一个问题是,查看成员的类型有什么用?
如果一个成员是方法,那么,我们可以调用它。如果一个成员是属性,我们则可以查看它的值。但是,需要注意的是,不同的属性成员


有不同的数据结构,有的是"System.String",有的是"System.UInt32",有的则是"System.String[ ]",在使用时,应当注意数据格式


,否则会报错的。
如果我们需要管理网络中的计算机,则需要指定计算机名称:
get-wmiObject -list -namespace “root\CIMV2″ -computername 计算机名 <enter> 
好了,现在来具体操作,查看具体信息。
例:
查看BIOS信息
get-wmiobject -class win32_bios -namespace "root\cimv2" <enter> 
运行结果:
 
查看服务信息
get-wmiobject -class win32_service -namespace "root\cimv2" | format-list * <enter> 
查看机器信息
get-wmiobject -class win32_computersystem | format-list * <enter> 
 
在网络管理环境中的多数情况下,我们可能要查看不同的计算机信息,因此,就需要使用计算机这一参数,例如:
查询本地计算机的网络信息
$name="." 
 
$items = get-wmiObject -class win32_NetworkAdapterConfiguration '
-namespace "root\CIMV2" -ComputerName $name | where{$_.IPEnabled -eq “True”}  
 
foreach($obj in $items) {  
Write-Host "DHCP Enabled:" $obj.DHCPEnabled  
Write-Host "IP Address:" $obj.IPAddress  
Write-Host "Subnet Mask:" $obj.IPSubnet  
Write-Host "Gateway:" $obj.DefaultIPGateway  
Write-Host "MAC Address:" $ojb.MACAddress  

如果查询对象是其他机器,只需给变量"$name"赋与其他值即可。
例如:
$name=read-host "Enter Computer Name"
write-host "Computer:"$name 
 
$items = get-wmiObject -class win32_NetworkAdapterConfiguration '
-namespace "root\CIMV2" -ComputerName $name | where{$_.IPEnabled -eq “True”}  
 
foreach($obj in $items) {  
Write-Host "DHCP Enabled:" $obj.DHCPEnabled  
Write-Host "IP Address:" $obj.IPAddress  
Write-Host "Subnet Mask:" $obj.IPSubnet  
Write-Host "Gateway:" $obj.DefaultIPGateway  
Write-Host "MAC Address:" $ojb.MACAddress  

配合更多的查询命令,便可以方便的写出一个查询计算机信息的脚本,在本教程的结束部分,我会尽可能多的提供各种常用脚本。
========

你可能感兴趣的:(Win32,wmi)