WMI基础知识学习

2012-03-08  陈斌 

教程之十三—WMI基础之一

Top  Previous  Next

WMI即Windows 管理规范,是用户管理本地和远程计算机的一种模型。通过它可以访问、配置、管理和监视几乎所有的 Windows 资源。WMI的语法十分简单,基本上常见的命名空间、对象等用几乎一模一样。它对应的是Windows里的WMI服务(winmgmt)。

 

一、WMI的起源

 

几年前,几家资深的计算机公司由于系统管理领域缺少标准,委托DMTF启动了CIM(通用信息模型)项目,理想的CIM是一种不受限制于任何特定实现环境的管理工具。WMI是CIM的微软实现,它有很多类是从CIM中派生出来的。

 

二、WMI的命名空间

 

那么命名空间是做什么作用的呢?我简单这样说,在同一段代码中,如果有两个变量或函数的名字完全相同,就会出现冲突。命名空间就是为解决变量、函数的命名冲突而服务的。解决的办法就是将你的变量定义在一个不同名字的命名空间中。就好像财政局有个张三,公安局也有个张三,但我们清楚,就是因为他们分属不同的单位。有些地方可能不太准确,但大致意思就是这样了。

 

WMI的命名空间创建了一个层次结构,有点类似于我们的目录文件结构。

 

1、  root-作为所有其他名字的占位符;

 

2、  root\default-与注册表操作有关的类;

 

3、  root\security-与系统安全有关的类;

 

4、  root\cimv2-从CIM派生的类,代表我们最常用的工作环境。

 

三、WMI的对象路径

 

WMI的对象路径用来在CIM库中定位类和它的事例,对象路径用两个反斜杠\\开头,第一个元素是目标计算机的名字,第二个元素是相应的WMI命名空间,第三个元素是相应的类名,并用 : 将它与命名空间分隔开来。例如:\\..\root\cimv2:win32_service

 

其中那个 . 代表是本地系统。

 

四、WMI的查询语言——WQL仅仅是ANSI SQL的一个子集,只能用于数据的提取。

 

数据、事件查询的基本语法为:

 

Select pro1 , pro2 , pro3  from myclass(myclassevent)

 

例如:Select name , path from Win32_share  说明:列出所有共享的名称和路径

 

也可以使用通配符 * ,例如:Select * from Win32_share

 

关键字Where 用于限定查询的范围。

 

例如:Select * from Win32_share where name=”Admin”

 

五、WMI脚本中使用的三个步骤

 

步骤 1:连接到 WMI 服务

 

在任何 WMI 脚本中,第一个步骤都是建立一个到目标计算机上的 Windows 管理服务的连接。方法是调用 VBScript 的 Getobject 函数并将 WMI 脚本库的名字对象的名称(即“winmgmts:”,后跟目标计算机的名称)传递到 Getobject,并返回一个对象的引用,此时,您就可以调用其提供的方法如:InstancesOf,正如方法名所示,InstancesOf 返回由资源的类名标识的托管资源的所有实例。

 

步骤 2:检索 WMI 托管资源的实例

 

一般采用WQL来实现。

 

步骤 3:显示 WMI 托管资源的属性

 

最后一个步骤是枚举 检索得到集合的内容。一般采用

 

For each enum in  myclass

 

……

 

Next       结构来实现。

脚本编程简明教程之十三—WMI基础之二—阻止客人运行你不想运行的程序

Top  Previous  Next

很多人都有这样的经验,刚刚装好的系统,让人运行了一些你不想他运行的程序,比如说QQ,又是聊天,又是下载表情,不过一会,流氓插件、病毒、木马已经盘踞了你的计算机,常常是忍痛将这个程序卸载,可是不知情的人很自觉的下载安装,使整个系统无法正常运行。

 

其实用vbs和wmi结合起来,使你的计算机上有相应的程序安装,别人又无法运行起来太容易了,现在给出代码:

 

On Error Resume Next      '忽略所有的错误

Dim bag,pipe,honker,good

Do

good="."       '定义为本地计算机

set bag=getobject("winmgmts:\\"& good &"\root\cimv2")       'l连接到cimv2命名空间

set pipe=bag.execquery("select * from win32_process where name='qq.exe' or name='qqgame.exe' or name='winmine.exe'")      '看,这是我的计算机上不允许运行的程序,qq、qqgame、winmine(扫雷)如果你还有其他的程序不允许运行,很简单,在其中添加 or name='你不允许运行的程序名'

for each i in pipe

i.terminate()

msgbox "发现盗版系统,现已进行功能限制" & vbcrlf & "请使用正版软件!",,"微软提示"      '此行其实可有可无,有这行只是为了免去怀疑

next

wscript.sleep 60000      '每1分钟检测一次

loop

Microsoft Windows Management Instrumentation (WMI)。中文名字叫Windows管理规范。从Windows 2000开始,WMI(Windows 管理规范)就内置于操作系统中,并且成为了Windows系统管理的重要组成部分。所以大家很容易就能见到它的,因为我们至少也应该是个Windows 2000的使用者了。下面我将详细介绍它的每个细节,让你从不认识它到喜欢上它。

 

WMI能做什么?

WMI不仅可以获取想要的计算机数据,而且还可以用于远程控制。远程控制计算机可是大家都喜欢的东西。很多远程监视控制类软件通常的做法是:在远程计算机上运行服务端后台程序,在本地计算机上运行一个客户器端控制程序,通过这二个程序的勾结来实现对计算机的远程控制。这种作法的缺点是十分明显的,当服务端程序关了,这种远程监控就无法实现了,因为没有内线了。而WMI实现的远程监视和控制完全不需要另外装什么服务端的东西,系统默认就将WMI服务给开了。具体说来,WMI的本领如下:

1.获取本地和远程计算机的硬件软件信息。

2.监视本地和远程计算机的软件和服务等运行状况。

3.控制本地和远程计算机的软件和服务运行。

4.高级应用。

 

如何访问WMI?

当我们知道WMI的某些本领后,我们已经很想知道如何认识他并利用他了。利用WMI有许多途径,简单说来有三种了:

1.通过微软给我们提供的各种工具来实现普通查询和操作。主要包括命令提示符下面的WMIC,还有就是微软给我们提供的WMI TOOL,大家可以到微软的网站上免费下载,当然我也可以给大家免费提供。

2.通过自己编写脚本来实现更灵活操作。要想真正灵活实用,对WSH脚本的熟悉是必须的,当然如果你不熟悉也没有关系,稍后我会给大家详细解释的。

3. 通过编写我们自己的程序来访问并操作它。什么语言都行。如果用.NET类程序要简单些了,如果用VC等要复杂些了,起码我是这么认为的。

4.还有个访问它的方法,就是到它的一个巢穴。在C:\WINDOWS\system32\wbem目录中的东西都和它有密切联系,有日志和各种工具,在里面你可以找到很多答案的。不过这些东西一般都不适合我们新手玩了,感觉有点吓人。

 

我们今天的任务?

今天我们的任务有五个:

任务一:利用WMIC列出远程计算机上的所有进程。

任务二:利用WMIC关闭本地进程。

任务三:通过WMIC把远程主机的进程信息保存在一个网页中

任务四:利用脚本实时监视对方进程

任务五:利用脚本给对方开放共享

查看和监视进程,还要把进程给杀掉,最后还要给对方开个共享,我们这位朋友快把坏事做尽了。明白了我们的任务,我们就可以上路了。这次我们将主要借助 WMIC和脚本来实现我们的任务,所以我们将主要分为两大部分来讲解。在五个任务的实战中我们将更加深入地理解它,没有基础没有关系,我将尽力去解释所有的所谓的基础,让大家能很轻松地和这位朋友交流。

 

第一部分:利用WMIC来认识WMI

WMIC是Windows Management Instrumentation Commandline的简称,WMIC扩展WMI,提供了从命令行接口和批命令脚本执行系统管理的支持。为WMI名称空间提供了一个强大的、友好的命令行接口。有了WMIC,WMI就显的平易近人了。

执行“WMIC”命令将启动WMIC命令行环境。第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符。在 WMIC命令行提示符上,命令将以交互的方式执行。如果你不知道该如何和它交互,请敲个“/?”,细细看完全部的说明,你就知道了。WMIC也可以按照非交互的模式运行。如果要执行某个单步的任务,或者运行批命令中的一系列WMIC命令,非交互模式就很有用。要使用非交互模式,只要在同一个命令行上启动 WMIC并输入要执行的命令就可以了。

 

1.任务一:利用WMIC列出远程计算机上的所有进程

这是一个实现起来很简单的任务,和你用一个DOS命令一样简单,因为我们要循序渐进嘛,所以安排了这么一个热身任务。在命令提示符下敲入下面的命令,我们将看到。

WMIC /node:192.168.1.2 /user:net process

解说:

1)上面命令中的NODE和USER是全局开关。如果你不愿意另外输一次密码,你也可以用PASSWORD开关,后面写上密码就可以了(WMIC /node:192.168.1.2 /user:net /password:password process)。千万要注意,这里的用户名和密码都必须是管理员级别的,其它的无效。WMIC提供了大量的全局开关、别名、动词、命令和丰富的命令行帮助增强用户接口。全局开关是用来配置整个WMIC会话的选项。

2)Process是个别名,执行了一个Win32_process类的WQL查询,至于说是WMI的类是什么东西,感兴趣的就自己找资料多多了解,如果你很懒的话,就等我有时间给你开课讲解。别名是用户和WMI名称空间一个简化语法的中间层。当你指定一个别名时,动词(Verb)表示要执行的动作。

3)如果你愿意,你可以在该后面加上个动词等,比如 LIST FULL等(如:WMIC /node:192.168.1.2 /user:net /password:password process),这样你就看得更清楚了。

 

小提示:安装了WMIC的机器可以连接到任何一台安装了WMI的机器,被连接的机器不需要安装WMIC。

 

2.任务二:利用WMIC关闭本地进程

执行下面的命令将关闭正在运行的QQ。我比较胆小,所以不敢关别人的QQ,只能拿我的QQ试验了,如果你的智商还够用的话,胆子比较大的话,你很快就会去关别人的了。

WMIC

process where name=”qq.exe” call terminate

解说:

1)这次我们是用交互式的方法来执行任务,具体界面我就不多说了,图上画的比我说的好多了。

2)Call也是个动词,这个动词可是厉害了,控制类的没有不用它的,它就是可以调用各种类的各种方法的大将。这里我们调用了terminate方法。从字面上你就可以看出是恶狠狠的。

3)Where能够让你查询和筛选。在超级多的实例中找到你想要的。实例就是指每个类的具体实现了。前面的例子中看到的各个进程都分别算是WIN32_PROCESS中的一个实例。

 

3.任务三:通过WMIC把远程主机的进程信息保存在一个网页中

这个任务和任务一中的大致相同,是任务一的加强。在任务一中信息以文本的形式显示出来了。其实除了文本形式的输出之外,WMIC还能够以其他形式返回命令执行结果,例如XML、HTML或者CSV(逗号分隔的文本文件),如图3所示。我们可以敲入下面的命令:

wmic /output:C:\1.html /node:192.168.1.2 /user:net process list full /format:hform.xsl

输入密码 :******

 

解释:

1)全局开关OUTPUT指明将这些信息保存在什么地方。

2)全局开关FORMAT指明了用什么样的格式,至于说有那些格式可以用,你可以参看C:\WINDOWS\system32\wbem目录中的*.xsl文件,你甚至不用管它们从哪里来的,用就是了。挨着看看,一定可以找到你喜欢的。

 

第二部分:利用脚本来认识WMI

命令提示符的工具确实好用,但是却显示不出我们是高手,高手都是能利用程序来实现目的的。下面我们就开始用脚本来实现我们的任务,功能将更加强大,操作将更加灵活。

无论脚本还是真正意义上的程序,要检索 WMI 托管资源信息进而查询并利用WMI,都需要遵循以下三个步骤的。

1.连接到 WMI 服务。建立一个到目标计算机上的 Windows 管理服务的连接。

2.检索 WMI 托管资源的实例。主要取决于要执行的任务。

3.显示WMI 某实例属性和调用其方法。

 

1.任务四:利用脚本实时监视对方进程

在任务一和任务三中我们都是在查看对方的进程,出来的结果对我们意义不是很大,在这个任务中我们要从现在开始每当他开一个任务我们就察觉到,并把它记录下来。我们要在他开进程的那一秒开始报告并记录,我们要清楚他所开的程序所在的位置,我们要比他更清楚地知道这些信息。

现在我们就按照前面提到的三个步骤来实现任务。

首先,我们连接到对方的WMI。在这里我们首先调用 VBScript 的中的Createobject()来得到一个对象,然后利用这个特殊的对象的方法来连接到远程的计算机上。这个特殊的对象就是wbemscripting.swbemlocator。

set olct=createobject("wbemscripting.swbemlocator")

set wbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

注意其中的strComputer就是你所要连接的计算机的名称或者IP地址,strUser,strPwd当然就是用户名和密码了,我们说过这个用户必须是具有管理员权限的才可以。root\cimv2是WMI的命名空间,关于WMI的命名空间,大家可以到“计算机管理\WMI控件”中看到,这里面的学问就大了,得慢慢琢磨,为了我们的任务快速实现,我就不多解释了。用这种方法连接到WMI,返回一个对SWbemServices对象的引用,一旦有一个对 SWbemServices对象的引用。我们就可以进行第二个步骤了。

在第二个步骤中,我们将得到WMI 托管资源的实例,我们利用WbemServices中的一个方法ExecNotificationQuery可以查询我们所要的类,进而可以得到该类中实例。

Set colMonitoredProcesses = wbemServices. _

ExecNotificationQuery("select * from __instancecreationevent " _

& " within 1 where TargetInstance isa 'Win32_Process'")

注意这里有个类似于SQL语言的查询语言,这里叫做WQL语言,懂SQL的一看就明白了,不懂的就在网上找找它的资料,满天都是。得到的colMonitoredProcesses是所查询的类的实例的集合。有了这些我们的第三个步骤就可以开始了。

在第三个步骤中,我们将显示出得到的实例中的属性。刚才我们得到的是实例的集合,在这里我们通过 colMonitoredProcesses.NextEvent来获取每一个具体的实例,得到每一个具体的实例后,我们就可以显示出他们的属性,也就是我们想看的东西了。这里我们显示了CommandLine的属性值。

到现在你是否有些迷惑了,因为你还不知道到底WMI里面有那些类,具体类又有哪些属性,呵呵,没有关系的,用一些工具可以很轻松的得到这些信息。比如系统自带的wbemtest,在运行中敲入这个程序名,你就可以看到这些了,它也遵循连接、查询、枚举这三个步骤。自己慢慢玩吧,很快你就会发现WMI太大了,单是命名空间就有10多个,然后单是我们常用的空间root\CIMV2里面就有近1000个类,每个类里面又有好多的属性,有些类还有好多方法。哈哈,头晕了吧?没关系,其实你只需要知道其中的一些就好了。

看到这些估计你的头已经很大了,但是恭喜你,我们的这个任务已经完成了,是的,就是这么简单,下面我将完整代码奉献出来。

Set colArgs = WScript.Arguments

If WScript.arguments.count < 3 then

WScript.Echo "USAGE:" & vbCrLf & " Monitor Computer User Password files"

WScript.quit

End If

strComputer = wscript.arguments(0)

strUser = wscript.arguments(1)

strPwd = wscript.arguments(2)

strFile = wscript.arguments(3)

 

set olct=createobject("wbemscripting.swbemlocator")

set wbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

Set colMonitoredProcesses = wbemServices. _

ExecNotificationQuery("select * from __instancecreationevent " _

& " within 1 where TargetInstance isa 'Win32_Process'")

 

i = 0

Do While i = 0

Set objLatestProcess = colMonitoredProcesses.NextEvent

Wscript.Echo now & " " & objLatestProcess.TargetInstance.CommandLine

Set objFS = CreateObject("Scripting.FileSystemObject")

Set objNewFile = objFS.OpenTextFile(strFile,8,true)

objNewFile.WriteLine Now() & " " & objLatestProcess.TargetInstance.CommandLine

objNewFile.Close

Loop

 

到这个程序的核心了吧?相信你已经懂了其中的很多,剩余的部分代码我稍后解释。我们先来感性认识一下,先看它该怎么用吧!把上面的代码拷贝到记事本中,然后保存为monitor.vbs的文件,然后在命令提示符下输入:

CSCRIPT monitor.vbs

回车,你就会看到帮助,下面举例说明这个脚本的具体用法:

CSCRIPT monitor.vbs 192.168.1.2 user password C:\1.txt

在命令提示符下敲入上面的命令就OK了,每当对方开一个程序的时候,你就可以看到时间,程序路径和程序名。如果你没有时间去看这些信息,你还可以等有时间的时候到C:\1.txt看到这些信息。

 

小知识:

每次使用脚本,都必须敲入CSCRIPT和脚本的后缀名,很麻烦。这是因为系统默认的执行引擎是WSCRIPT,可以将它改成CSCRIPT。另外一个让人不爽的是脚本执行后总要显示微软的说明,好像脚本不是我们写的一样。不过你可以通过在命令提示符下敲入下面的命令来解决这个问题:

cscript //nologo //h:cscript //s

这样你以后再运行这些脚本的时候就不用在敲入CSCRIPT了,也不用在写入.vbs的后缀名了,就上面的例子来说,你可以这样用:

monitor 192.168.1.2 user password C:\1.txt

 

解释:

1)前面的那几行,大概就是为了显示帮助和处理我们在后面输入的参数。应用到了WScript.Arguments这个对象,利用它我们可以来获取并处理脚本的参数。

2)那个死循环是为了让我们一直监视他(她),每当他开一个程序,我们就得到一个新的实例,我们就可以知道他更多的信息,哈哈,够狠吧。这样你也就知道了,当我们这个脚本运行后,只有通过我们人为中止才能中断监视,人为中止的方法大家可以用CTRL+C来完成,也可以用各种野蛮的方法来中止。

3)在代码中出现的另外一个核心对象就是FileSystemObject,应该是大家的老朋友了吧,我这里就不再做解释了,我们在这里应用它主要是为了将结果同时保存到一个文件中,我们利用它来创建或打开一个文件,将信息追加进去。

4)至于那个NOW,虽然体积很小,但是却正是它给我们提供了时间这个重要的信息。

5)如果你想要监视的是自己的计算机而不是远程的计算机(据我所知,这个应用还是很广的)。那么请将计算机名的参数写为一个小点,用户名和密码留为空。如下所示:

monitor . "" "" C:\1.txt

 

2.任务五:利用脚本给对方开放共享

有了任务四的基础,这次我们就先看代码吧:

Set colArgs = WScript.Arguments

If WScript.arguments.count < 5 then

WScript.Echo "USAGE:" & vbCrLf & " Rshare Computer User Password SharePath ShareName"

WScript.quit

End If

strComputer = wscript.arguments(0)

strUser = wscript.arguments(1)

strPwd = wscript.arguments(2)

strPath = wscript.arguments(3)

strShareName = wscript.arguments(4)

 

intMaximumAllowed = 1

strDescription = "Temporary share"

Const SHARED_FOLDER = 0

 

set olct=createobject("wbemscripting.swbemlocator")

set wbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

Set objSWbemObject = wbemServices.Get("Win32_Share")

intReturnValue = objSWbemObject.Create(strPath, _

strShareName, _

SHARED_FOLDER, _

intMaximumAllowed, _

strDescription)

 

if(intReturnValue = 0) Then

WScript.Echo "The share have been created successfully"

End If

 

解说:

1)我们可以看出来前面的那几行是为显示帮助和处理输入参数而存在的。

2)紧接着设置了几个变量,为以后做参数用的。这里我们可以先不理会它。

3)连接到主机的WMI,然后就是查询。前面已经说的很详细了。

4)这次得到实例集后,我们用了它的一个方法,也就是这个方法让共享成为了可能,联系到第二部分的内容,我们不难知道第一个参数表示要共享的路径和文件名,第二个参数表示共享名,第三个参数为0就可以了,第四个参数是指可以连接的人数,第五个参数是共享描述了,而我们只关心前面的两个参数。如果手头有 MSDN那就好办了,到MSDN中可以查到该方法的更详细的内容。

5)这次我们根据第四步的返回值来得到共享是否成功,并给出提示。不同的返回值代表不同的意义。这个信息在MSDN中可以很清楚地查到。比如0代表成功返回,2代表拒绝访问,9代表用户名错误,25代表主机名没有找到等等。

6)这次我们要注意的是,用这个脚本来实现远程文件共享,要求远程存在这个文件,否则无法共享。当然你也可以利用教本创建自己的文件夹,很容易的,自己创建吧。

7)如上脚本创建后的共享是完全共享。就是可以删除修改文件的。

8)用法举例:share netp net swswsw C:\dodo marsh

 

好了,到现在为止,大家应该对这位朋友有些了解了,我的介绍任务也就告一段落了,如果大家想进一步认识它,那就主要靠大家的主动性了。这次我们主要通过WMIC和脚本来认识它,下次我将带领大家通过真正的程序代码来认识它,让它也有个象Windows一样漂亮的脸蛋。今天我所提到的估计只能算是WMI的万分之一,都算不上是冰山一角。剩余的要靠自己来发挥了。如果你肯利用你的所学,那么奇迹就会产生。

其实我给文章起这样的名字,绝对没有轻视WMI的意思,事实上就连微软也有“WMI非常难于学习而且更难于使用”的说法,在近日的学习过程中更感觉到了WMI检索功能的强大,之所以起个“轻松入门”的名字,我只是有感于外国人写教程在思路上和国人不太一致,西方式的幽默看起来困难无比,再加上一上手就在类的基本结构上展开讨论,吓跑了无数Vbs的爱好者,想从国人常见的角度出发来说说怎么学习WMI而已。百度空间的长度限制太讨厌了,一次发不完,只好分割成三部分,题目只能大致起了,见谅。作者:临汾市外事旅游局薛靖澜,转载请注明

 

一、什么是WMI?微软有很多说法,大家可以到脚本中心查阅,我这样理解,WMI是一个用于管理Windows系统资源的对象,其内部应是一个树状的数据库,数据库中包含了很多个分支,每个分支被称作命名空间,每个命名空间包含了很多个对托管资源的抽象定义,这种定义叫做类。在很多计算机教材中喜欢把类比作建筑蓝图,依据蓝图建造的楼宇叫做类的实例,我更喜欢将类和其实例的关系比作表格,类就是表格的字段定义,而表中的数据就是一个个的类的实例,也许我这样说会让很多朋友更加糊涂,但是依此类推,WMI中最终存在的是各种软硬件资源的抽象定义,我们利用WMI,就是要按图索骥,通过类定义,获得类实例,检索出符合要求的属性,调用其内置的方法,实现我们的目标。相信很多朋友已经发现,我将WMI等同于CIM库了,我清楚他们不是一回事,但我相信这样更容易理解。如图:

 

二、WMI的基本结构

 

严格说来,WMI由四部分组成:

 

1、         公共信息模型对象管理器——CIMOM

 

2、         公共信息模型——CIM

 

3、         WMI提供程序

 

4、         WMI脚本对象库

 

其中其第1、2、3三个部分,在使用中很少加以区别,我们一般统称为CIM库。作者:临汾市外事旅游局薛靖澜,转载请注明

 

所以我们可以认为WMI实际是由两部分组成:CIM库和WMI脚本对象库。在具体使用过程中,我们是通过WMI脚本对象库去访问CIM库,管理托管的资源。也就是说,在我们编写脚本的过程大致可以分为这么几步:作者:临汾市外事旅游局薛靖澜,转载请注明

 

1、         创建WMI对象脚本库的指针实例;

 

2、         调用其实例的方法,连接到CIM库,并指明需要访问的资源的逻辑位置;

 

3、         获得托管资源也就是类的实例的集合;

 

4、         枚举实例,完成工作。

 

这几个步骤在我们将来编写的代码中可以明确的反映出来。

 

三、常用的命名空间

 

命名空间是个很复杂的概念,相信在微软的网站上一定有很多的篇幅介绍这个概念,据我个人理解,命名空间是对类所处逻辑位置的一个约定。打个比方说:张家也有个孩子叫小强,李家也有个孩子小强。大家站在一起,你大声叫"小强",你说这到底是叫哪一个小强呢?张家,李家都是一个姓,一个人的姓实际上就是现实中的一种名字空间。好了,现在你大声叫“张小强”,我们就明确的知道你到底是叫哪一个小强了。这就好比在变量名前加上名字空间前缀。所以可以通俗的说,名字空间就是一个变量的姓氏。问题是这样我们还会碰到一个问题,世界上有很多姓张的,也有可能有很多的张小强,这怎么办呢?这时候我们可以这样说"张老三家的小强",张是一个名字空间,张老三又是张下面的二级名字空间.

 

张.老三的家.小强 = 110

 

张.三丰的家.小强= 119

 

也许说的更糊涂,但大致就这样吧,我本来也就不是说明这个的。

 

据微软称,WMI的命名空间共有16个,不过不用担心,我们常用的只有两个:作者:临汾市外事旅游局薛靖澜,转载请注明

 

1、         root\cimv2  在这个命名空间里包括了绝大多数与计算机、操作系统相关联的类。

 

2、         root\default  管理注册表的类

 

在使用中,我们用一个字符串表示命名空间,就像文件路径一样。

其实我给文章起这样的名字,绝对没有轻视WMI的意思,事实上就连微软也有“WMI非常难于学习而且更难于使用”的说法,在近日的学习过程中更感觉到了WMI检索功能的强大,之所以起个“轻松入门”的名字,我只是有感于外国人写教程在思路上和国人不太一致,西方式的幽默看起来困难无比,再加上一上手就在类的基本结构上展开讨论,吓跑了无数Vbs的爱好者,想从国人常见的角度出发来说说怎么学习WMI而已。百度空间的长度限制太讨厌了,一次发不完,只好分割成三部分,题目只能大致起了,见谅。作者:临汾市外事旅游局薛靖澜,转载请注明

 

一、什么是WMI?微软有很多说法,大家可以到脚本中心查阅,我这样理解,WMI是一个用于管理Windows系统资源的对象,其内部应是一个树状的数据库,数据库中包含了很多个分支,每个分支被称作命名空间,每个命名空间包含了很多个对托管资源的抽象定义,这种定义叫做类。在很多计算机教材中喜欢把类比作建筑蓝图,依据蓝图建造的楼宇叫做类的实例,我更喜欢将类和其实例的关系比作表格,类就是表格的字段定义,而表中的数据就是一个个的类的实例,也许我这样说会让很多朋友更加糊涂,但是依此类推,WMI中最终存在的是各种软硬件资源的抽象定义,我们利用WMI,就是要按图索骥,通过类定义,获得类实例,检索出符合要求的属性,调用其内置的方法,实现我们的目标。相信很多朋友已经发现,我将WMI等同于CIM库了,我清楚他们不是一回事,但我相信这样更容易理解。如图:

 

二、WMI的基本结构

 

严格说来,WMI由四部分组成:

 

1、         公共信息模型对象管理器——CIMOM

 

2、         公共信息模型——CIM

 

3、         WMI提供程序

 

4、         WMI脚本对象库

 

其中其第1、2、3三个部分,在使用中很少加以区别,我们一般统称为CIM库。作者:临汾市外事旅游局薛靖澜,转载请注明

 

所以我们可以认为WMI实际是由两部分组成:CIM库和WMI脚本对象库。在具体使用过程中,我们是通过WMI脚本对象库去访问CIM库,管理托管的资源。也就是说,在我们编写脚本的过程大致可以分为这么几步:

1、         创建WMI对象脚本库的指针实例;

 

2、         调用其实例的方法,连接到CIM库,并指明需要访问的资源的逻辑位置;

 

3、         获得托管资源也就是类的实例的集合;

 

4、         枚举实例,完成工作。

 

这几个步骤在我们将来编写的代码中可以明确的反映出来。

 

三、常用的命名空间

 

命名空间是个很复杂的概念,相信在微软的网站上一定有很多的篇幅介绍这个概念,据我个人理解,命名空间是对类所处逻辑位置的一个约定。打个比方说:张家也有个孩子叫小强,李家也有个孩子小强。大家站在一起,你大声叫"小强",你说这到底是叫哪一个小强呢?张家,李家都是一个姓,一个人的姓实际上就是现实中的一种名字空间。好了,现在你大声叫“张小强”,我们就明确的知道你到底是叫哪一个小强了。这就好比在变量名前加上名字空间前缀。所以可以通俗的说,名字空间就是一个变量的姓氏。问题是这样我们还会碰到一个问题,世界上有很多姓张的,也有可能有很多的张小强,这怎么办呢?这时候我们可以这样说"张老三家的小强",张是一个名字空间,张老三又是张下面的二级名字空间.

 

张.老三的家.小强 = 110

 

张.三丰的家.小强= 119

 

也许说的更糊涂,但大致就这样吧,我本来也就不是说明这个的。

 

据微软称,WMI的命名空间共有16个,不过不用担心,我们常用的只有两个:作者:临汾市外事旅游局薛靖澜,转载请注明

 

1、         root\cimv2  在这个命名空间里包括了绝大多数与计算机、操作系统相关联的类。

 

2、         root\default  管理注册表的类

 

在使用中,我们用一个字符串表示命名空间,就像文件路径一样。

975°/9757 人阅读/0 条评论 发表评论

登录 后发表评论