WMI轻松入门帮助教程基础+进阶一步一步来.docx

上传人:b****3 文档编号:5305091 上传时间:2022-12-15 格式:DOCX 页数:11 大小:21.81KB
下载 相关 举报
WMI轻松入门帮助教程基础+进阶一步一步来.docx_第1页
第1页 / 共11页
WMI轻松入门帮助教程基础+进阶一步一步来.docx_第2页
第2页 / 共11页
WMI轻松入门帮助教程基础+进阶一步一步来.docx_第3页
第3页 / 共11页
WMI轻松入门帮助教程基础+进阶一步一步来.docx_第4页
第4页 / 共11页
WMI轻松入门帮助教程基础+进阶一步一步来.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

WMI轻松入门帮助教程基础+进阶一步一步来.docx

《WMI轻松入门帮助教程基础+进阶一步一步来.docx》由会员分享,可在线阅读,更多相关《WMI轻松入门帮助教程基础+进阶一步一步来.docx(11页珍藏版)》请在冰豆网上搜索。

WMI轻松入门帮助教程基础+进阶一步一步来.docx

WMI轻松入门帮助教程基础+进阶一步一步来

◎WMI轻松入门之一——

◎基本概念2007年07月15日星期日上午01:

12其实我给文章起这样的名字,绝对没有轻视WMI的意思,事实上就连微软也有“WMI非常难于学习而且更难于使用”的说法,在近日的学习过程中更感觉到了WMI检索功能的强大,之所以起个“轻松入门”的名字,我只是有感于外国人写教程在思路上和国人不太一致,西方式的幽默看起来困难无比,再加上一上手就在类的基本结构上展开讨论,吓跑了无数Vbs的爱好者,想从国人常见的角度出发来说说怎么学习WMI而已。

XX空间的长度限制太讨厌了,一次发不完,只好分割成三部分,题目只能大致起了,见谅。

一、什么是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轻松入门之二——连接到指定的CIM命名空间2007年07月15日星期日上午01:

13四、常用的脚本对象库

WMI脚本对象库由24个对象组成,在脚本中心有一副脚本库对象模型的图,有兴趣的朋友可以参考一下,作为入门,我们一般只用到其中的四个对象,其继承和层级关系如下:

SwbemLocator教本库对象→SwbemServicesWMI服务对象→SwbemObjectSet类实例集合对象→SwbemObject类的实例

好了,现在让我们来举个例子,详细说明一下这四个对象在脚本中的应用方法:

例一:

用来检索计算机上安装的光驱:

strComputer="."

SetobjSWbemLocator=CreateObject("WbemScripting.SWbemLocator")

SetobjSWbemServices=objSWbemLocator.ConnectServer

SetcolItems=objSWbemServices.ExecQuery("Select*fromWin32_CDROMDrive")

ForEachobjItemincolItems

WScript.Echo"光盘驱动器的类型:

"&objItem.Caption

WScript.Echo"盘符是:

"&objItem.Id

Next

例二:

用来检索CPU型号

strComputer="."

SetobjSWbemLocator=CreateObject("WbemScripting.SWbemLocator")

SetobjSWbemServices=objSWbemLocator.ConnectServer

SetobjSWbemObjectSet=objSWbemServices.InstancesOf("Win32_Processor")

ForEachobjSWbemObjectInobjSWbemObjectSet

Wscript.echo"CPU的型号为:

"&objSWbemObject.name

Next

请注意,这两个脚本虽然简单,却代表了WMI脚本设计中最普遍的东西,可以说是很典型的脚本。

让我们来仔细观察一下这两个脚本,讨论讨论一下脚本访问WMI的基本方法:

我们可以看到整个脚本的执行过程基本相同:

①定义了SwbemLocator的实例;SwbemServices、SwbemObjectSet、SwbemObject对象;创建了SwbemLocator的实例;②通过SwbemLocator的ConnectServer方法连接到WMI,获得SwbemServices的实例集合;③枚举集合中的每个实例;④显示各实例的一些属性。

让我们来详细说明一下各行代码的详细含义,并请仔细回想我们第二部分WMI基本结构中谈到的编写WMI脚本的基本步骤:

(注意:

考虑到脚本的简易,我们编写的脚本一般只在本地计算机进行检索,我们只介绍涉及本地的这一部分,涉及到访问远程计算机的部分我们就省略了,其实随着计算机安全技术的发展,仅凭WMI访问远程计算机的可行性是越来越小了)

1、连接到指定的CIM命名空间

要用WMI对象编程,必须首先创建WMI对象脚本库的实例,连接到目标计算机的CIM命名空间。

方法一:

步骤一、建立SwbemLocator对象的实例。

代码为:

SetobjSWbemLocator=CreateObject("WbemScripting.SWbemLocator")

然后用SwbemLocator对象的ConnectServer方法(SwbemLocator对象只有1个只读属性Security_和1个方法ConnectServer)建立WMI服务的连接,返回一个命名空间的连接(SwbemServices对象),代码为:

SetobjSWbemServices=objSWbemLocator.ConnectServer()

ConnectServer方法共有8个参数,所有参数都是可选的,其参数格式如下:

ConnectServer([strComputName],[strNamespace],[strUser],[strPassword],[strLocale],[strAuthority],[iSecurityFlags],[objwbemNamedValueSet])

考虑到WMI的复杂性,在使用中我们如果只是在本地计算机上进行检索和查询,那么我们只需要设置第1、2个参数,其它参数都可以省略;如果想连接到远程计算机,一般需要对前4个参数进行设置,我们也只对此做个简单的介绍。

strServer——计算机名,缺省为本机,本机也可以用”.”

strNamespace——需要登录的CIM命名空间,例如:

"root\CIMV2",缺省为"root\CIMV2"。

方法二:

用moniker名字法建立WMI服务的连接,这也是微软推荐的连接方法

moniker名字法是利用GetObject函数直接建立WMI服务的连接,它的要点就是通过编写一个moniker字符串作为GetObject函数的参数,然后返回一个SwbemServices对象。

关于moniker字符串的完整格式如下:

"winmgmts:

[{SecuritySettings}!

][\\ComputerName][\Namespace][:

ClassName][.KeyProperty='Value']"

"winmgmts:

"是前缀,表示为WMI服务,必须使用;第二部分用来验证权限和假冒级别的,省略。

第三部分为计算机名字:

"\\.\"是计算机名字,默认可省略,其余同上;第四部分CIM命名空间:

缺省的命名空间为"root\CIMV2",默认可省略。

第五部分为类名。

第六部分为属性值。

注意:

当该moniker字符串不包括最后2项时(即为:

"winmgmts:

[\\ComputerName][\Namespace]"),则GetObject(moniker字符串)返回的是一个命名空间的已验证的连接(SwbemServices对象);当不包括最后1项时,返回的是一个CIM类(SWbemObject对象);当包括最后2项时,返回的是一个类的单独实例(SWbemObject对象)。

◎WMI轻松入门之三——获得类的实例2007年07月15日星期日上午01:

152.获得类的实例

我们有4种方法获得类的实例,其中方法1和方法2是通过SwbemServices对象的InstancesOf方法和ExecQuery方法来获得某个类的多个实例组成的集合对象。

方法3和方法4则是返回单独的类的实例,即返回的是一个SWbemObject对象。

1)InstancesOf方法获得类的实例集合

InstancesOf方法的语法参数格式如下:

SwbemServices.InstancesOf(strClass)

strClass为类名,例如"Win32_Service"

回顾例二,就是用语句:

SetobjSWbemObjectSet=objSWbemServices.InstancesOf("Win32_Processor")来获得"Win32Processor"类的所有实例集合,然后我们可以用

ForEachobjSWbemObjectInobjSWbemObjectSet

……

Next

语句获得每一个类的实例SWbemObject对象,然后就可以根据我们的需要,进行相应的操作。

2)ExecQuery方法获得类的实例集合

与InstancesOf方法不一样的是,ExecQuery方法可以通过查询语句,只返回匹配部分实例和属性。

ExecQuery方法的语法参数格式如下:

SwbemServices.ExecQuery(strQuery)

strQuery为WMI查询语言(WQL)构造的一个查询语句字符串。

例如:

SetobjSWbemObjectSet=objSWbemServices.ExecQuery("selectProcessorIdfromWin32_ProcessorwhereDeviceID='cpu0'")

3)Get方法获得一个类的实例(SWbemObject对象)

此方法也就不必再用ForEachobjSWbemObjectInobjSWbemObjectSet:

……:

Next语句从SWbemObjectSet对象中获得每一个类的实例SWbemObject对象,Get方法的语法参数格式如下:

SwbemServices.Get([strObjectPath][.KeyProperty='Value'])

strObjectPath是类的名字

KeyProperty是主键属性名

Value是指定的主键属性值

这里要注意的是如果要获得一个类的实例,则strObjectPath.KeyProperty='Value'中的任何一项都不能省略,例如:

SetobjSWbemServices=GetObject("winmgmts:

")

SetobjSWbemObject=objSWbemServices.Get("Win32_Processor.DeviceID='cpu0'")

Wscript.echo“CPU的型号为”:

"&objSWbemObject.ProcessorId

看,结果一样,脚本却简化了不少。

4)直接用moniker名字法获得一个类的实例

在说明Moniker名字法的时候我们说过,当包括最后2项时,返回的是一个类的单独实例,如:

SetobjSWbemObject=GetObject("winmgmts:

Win32_Processor.DeviceID='cpu0'")

Wscript.echo"首枚CPU序列号:

"&objSWbemObject.ProcessorId

是不是更加简单?

仅仅2条语句就获得了CPU的序列号。

3.读取类的实例属性,调用类的方法

实在是太多了,你可以参照C:

/WINDOWS/system32/wbem/cimwin32.mfl文件中,对所有类的属性和方法的描述。

也可以用下列代码查询,虽然看起来有点困难,不过看的多了也就明白了。

strClass=inputbox("请输入你要查询的类")

strComputer="."

strNameSpace="root\cimv2"

ConstwbemFlagUseAmendedQualifiers=&h20000

SetobjWMIService=GetObject("winmgmts:

\\"&strComputer&"\"&strNameSpace)

SetobjClass=objWMIService.Get(strClass,wbemFlagUseAmendedQualifiers)

strMOF=objClass.GetObjectText_

WScript.EchostrMOF

◎WMI脚本:

修改磁盘卷标2007年07月10日星期二下午11:

04'==========================================================================

'

'修改磁盘卷标

'在Windows中,WMI主要是一个读取信息的技术,我这样理解不知道对不对

'但是我知道绝大多数的类都不允许对其属性进行修改,

'Win32_LogicalDisk是我知道的少数允许修改属性的类

'当然修改属性完成后不要忘记用Put_方法提交改变

'代码很简单就不仔细解释了,当然磁盘卷标不要起的太长

'

'==========================================================================

'

strComputer="."

SetobjWMIObject=GetObject("winmgmts:

\\"&strComputer&"\root\cimv2")

SetcolDevices=objWMIObject.ExecQuery_

("Select*fromWin32_LogicalDiskWhereDeviceId='D:

'")

ForEachobjDeviceincolDevices

objDevice.VolumeName="工作盘"

objDevice.Put_

Next

◎WMI脚本:

建立和删除共享文件夹2007年07月10日星期二下午10:

42'==========================================================================

'

'在局域网建立共享的脚本

'GetObject函数用Moniker名字法连接到WMI创建引用在本机有三步

'1、"winmgmts:

"是前缀,表示为WMI服务,必须

'2、\\.\"代表本机,

'3、CIM命名空间:

"root\cimv2"就是CIM命名空间,缺省可省略

'4、建立共享主要使用Win32_Share类的Create函数'

'

'intCreate//0表示成功完成

'(StringSharePath;//共享路径,就是你要共享的文件夹的的路径

'StringShareName;//共享后,访问时的标示名称

'IntShareType;//共享类型,一般赋0即可,表示磁盘共享

'IntMaxUsers;//最大用户数

'StringDescription;//描述

'StringPassWord;//访问密码

')

'

'==========================================================================

ConstFILE_SHARE=0

ConstMAXIMUM_CONNECTIONS=25

strComputer="."

SetobjWMIService=GetObject("winmgmts:

\\"&strComputer&"\root\cimv2")

SetobjNewShare=objWMIService.Get("Win32_Share")

errReturn=objNewShare.Create_

("C:

\Finance","FinanceShare",FILE_SHARE,_

MAXIMUM_CONNECTIONS,"PublicsharefortheFinancegroup.")

IferrReturn=0ThenMsgBox"共享文件设置成功!

"

'==========================================================================

'

'删除共享用Delete函数,没有任何参数

'只要用WQL筛选出符合条件的共享,调用函数就可以了

'

'==========================================================================

strComputer="."

SetobjWMIService=GetObject("winmgmts:

\\"&strComputer&"\root\cimv2")

SetcolShares=objWMIService.ExecQuery_

("Select*fromWin32_ShareWhereName='FinanceShare'")

ForEachobjShareincolShares

objShare.Delete

Next

◎转几个WMI脚本,头一个是:

关机、注销或者重启的脚本2007年07月07日星期六下午09:

03'==========================================================================

'

'注销/重起/关闭本地WindowsNT/2000计算机。

基本思路如下:

'

'Win32ShutDown(flag)中flag的参数:

'0注销

'0+4强制注销

'1关机

'1+4强制关机

'2重起

'2+4强制重起

'8关闭电源

'8+4强制关闭电源

'

'==========================================================================

main

submain()

shutdown

endsub

SubShutDown()

DimConnection,WQL,SystemClass,System

SetConnection=GetObject("winmgmts:

root\cimv2")

'

WQL="SelectNameFromWin32_OperatingSystem"

SetSystemClass=Connection.ExecQuery(WQL)

ForEachSystemInSystemClass

System.Win32ShutDown(0+4)

Next

EndSub

◎WMI脚本:

收集计算机硬件信息2007年07月07日星期六下午09:

22'==========================================================================

'

'都差不多,脚本中没有列出来的还有:

'用户名:

Win32_UserAccount

'已经使用的盘符:

Win32_LogicalDisk

'所有共享:

Win32_share

'所安装的打印机:

Win32_Printer

'计算机的主板:

Win32_BaseBoard

'1394采集卡:

Win32_1394Controller

'笔记本电池:

Win32_Battery

'BIOS的:

Win32_BIOS

'物理总线的:

Win32_Bus

'系统缓存内存:

Win32_CacheMemory

'光驱:

Win32_CDROMDrive

'

'==========================================================================

Setwmi=GetObject("winmgmts:

\\")

msg=""

Setcpus=wmi.instancesof("win32_processor")

msg=msg&"CPU:

"

ForEachcpuIncpus

msg=msg+cpu.caption&vbcrlf&"型号为:

"<rim(cpu.name)&vbCrLf&vbCrLf

Next

'

Setmem=wmi.instancesof

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1