天天看点

WMI学习技术知识必须要知道的内容(1)(转)

WMI和软件开发

通常软件开发工作可以进行分类,这取决于它们将重点放在结构的哪个部件—应用程序、Schema或提供程序。

应用程序开发—通过收集和分析管理数据以及报告和反应事件通知来交付产品

              WMI对象模型通信时,应用程序可以使用:

              WMI COM API       (C,C++)

              WMI 脚步 API      (VBScript,JSript)

Schema开发—包括将变更应用于WMI Schema,他可以通过如下技术完成:

            MOF文件

            WMI COM API         (C,C++)

            WMI 脚本 API        (VBScript,JSript)

提供程序开发—授予访问有关被管理环境特定部分的信息。是WMI相关开发中最难的一部分切记。

通过探索WMI脚本对象模型开始,我们将发现它包含了很多对象及其他方法、属性和事件。

wbem脚本类型库wbemscripting存放在文件wbemdisp.tlb。

WMI脚本对象模型

如何在WMI脚本类型库中例示一个对象,同WScript用作WSH模型的入口点一样,wbemscripting用于提供对各种WMI脚本API接口的访问。

可以通过COM对象的脚本API ProgID来创建wbemscripting

wbemscripting.swbemlocator用于取得swbemservices对象,代表本地或远程计算机上名字空间的一个连接。

wbemscripting.swbemlasterror允许查询和处理最后方法调用的错误.

wbemscripting.swbemobjectpath需要创建和校验另一个对象路径.

wbemscripting.swbemnamedvalueset主要用于通信一组提供程序的值.

wbemscripting.swbemsink用于接收异步操作和事件通知的结果.

WMI对象是通过将createobject方法应用于前面所列的ProgID来创建,例如:

Dim MyLocator

set mylocator = createobject("wbemscripting.swbemlocator")

访问WMI对象

为了让你理解创建WMI名字空间初始连接的相对复杂过程,我将说明前面两种方法之间的不同。

假定需要使用WMI scripting API来获取远程服务器上有关spooler服务的信息。

1使用swbemlocator访问WMI对象

方法一:使用swbemlocator访问WMI对象

dim objlocator

set objlocator = createobject("wbemscripting.swbemlocator")

dim objmyservices

set objmyservices = objlocator.connectserver

set objspooler = objmyservices.get("win32_service=""spooler""")

dim intstatus

intstatus = objspooler.startservice()

wscript.echo intstatus

此时我们运行脚本会发现给我的返回值是:10

然后我们人为将windows服务print spooler的状态由“自动运行”变成“停止”可以得到我们的值为0

最后我们禁止调print spooler服务,可以得到的返回值:14

方法二:使用Monikers访问WMI对象(Monikers是一个标准的方法,用于将COM对象绑定在一起,它必须由3个部分组成1、winmgmts。2、假冒,验证,权限,特权和语言指示器。3、指向一个特定类或对象的WMI对象路径。)

dim objspooler

set objspooler = getobject("winmgmts:{impersonationlevel=impersonate}!win32_service=""spooler""")

此时我们运行程序,发现得到相同的结果,因此我们可以知道使用Monikers访问WMI对象也是一样的。

总结分析两种方法,我们可以发现,第一种方法较传统,当重复访问WMI对象时,它的性能较好

第二种方法使用monikers,它的形式相当的简单,代码实现只用了两行就可读取属性了,呵呵,但是monikers只能用于创建SWbemObject和SWbemServices类型的对象和集合。

swbemservices和swbemobject类

swbemservices方法和属性

swbemservices方法用于管理WMI名字空间中的类和对象。

swbemservices方法

每种方法有它的异步等价方法,区别是否可以在使用后立即返回或它是否必须等待到它的结果可用。

异步方法的名称与同步方法的名称是相同的,唯一的区别在于Async后缀。

associatorsof(associatorsof)—将与对象有关的一组类或实例返回到你指定的路径

delete(deleteasync)—删除一个实例或类

execmethod(execmethodasync)—执行一个对象方法

execnotificationquery(execnotificationquerysync)—执行一个WQL查询以接收事件

execquery(execquerysync)—执行一个WQL查询以接收一组类或实例

get(getsync)—获取你指定路径的类或实例。省略可以创建一个空对象,可以使用它来创建新类

instancesof(instancesofsync)—返回指定类的一组实例

referencesto(referencestosync)—返回引用指定对象的一组类或实例

subclassof(subclassofsync)—返回指定类的一组子类。

swbemservices属性

swbemservices只有一个单独的属性。security_用于读取或改变安全设置

swbemobject方法和属性

本质上,swbemobject可以代表任何WMI对象。可以把swbemobject想成一个类或实例的临时容器。特别注意

swbemobject随着代表类或实例不同属性和方法也会不同,呵呵

swbemobject方法(同样存在异步版本)

associators_(associatorsasyn_)—获取于指定对象有关的一组对象

clone_—创建当前对象的一份拷贝

compareto_—检查两个对象是否相同

delete_(deleteasyn_)—从WMI存储库中删除对象

execmethod_(execmethodasyn_)—执行对象实现的方法当方法不能使用直接访问执行时,就可以使用它

getobjecttext_—在MOF语法中获取一个对象的全部说明

instance_(instanceasyn_)—获取对象的一组实例

put_(putasyn_)—创建或更新WMI存储库中的对象

referencesto_(referencestoasyn_)—获取引用指定对象的一组联合类和它们的实例

spawderivedclass_从当前对象派生出一个新类,当前对象必须是一个WMI类定义

spawninstance_—从当前对象创建一个新的实例,当前对象必须是一个WMI类定义

subclass_(subclassasyn_)—返回对象的一组子类,当前对象必须是一个WMI类定义

swbemobject属性

derivation_—描述类的派生层次结构的一组字串,第一个元素显示直接父结构,最后一个元素是层次结构顶部的类,只读

methods_—包含这个对象的一组方法的swbemmethodset对象,只读

path_—代表当前类或实例的对象路径的SWbemobjectpath路径。

properties_—这个对象的属性组的swbempropertyset对象,只读

qualifiers_—这个对象的限定词组的swbemqualifierset对象,只读

sercurity_—用于获取和改变安全设置(验证级别、假冒级别和特权)的swbesecurity对象

简单修改前面的程序如下:

wscript.echo objspooler.properties_("startmode")

可以得到的结果为14,disable这样两个属性,呵呵,我们知道了如何直接使用对象的属性了吧。

此时我们必须知道,通过swbemobject对象的引用在脚本中开始,它们仅影响底层WMI对象的一个拷贝,而不会影响WMI对象本身。

实例:通过脚本改变“系统启动延时”属性

dim objsystem

set objsystem = getobject("winmgmts:{impersonationlevel=impersonate}!win32_computersystem=""bubble""")

wscript.echo objsystem.systemstartupdelay

objsystem.systemstartupdelay = 5

objsystem.put_

以上就是我们修改systemstartupdelay的脚本,呵呵。

WQL查询的脚本编制

数据查询

实例:列出自动启动但未启动的windows服务

option explicit

dim colwin32svcs

dim objsvc

set colwin32svcs = getobject("winmgmts:{impersonationlevel=impersonate}").execquery("select * from win32_services where started='false' and startmode='auto'")

for each objsvc in colwin32svcs

    wscript.echo objsvc.descripton

next

下面一个例子和上面的例子一样,实现同样的功能

dim colwin32assocs

set colwin32assocs = getobject("winmgmts:{impersonationlevel=impersonate}").execquery("associators of {win32_service.name=""lanmanworkstation""}")

for each objsvc in colwin32assocs

    wscript.echo objsvc.Description

结果如下显示:

AT/AT COMPATIBLE

NetworkProvider

Alerter

Background Intelligent Transfer Service

Computer Browser

Messenger

Net Logon

Remote Procedure Call (RPC) Locator

本文转自hcy's workbench博客园博客,原文链接:http://www.cnblogs.com/alterhu/archive/2012/04/11/2442942.html,如需转载请自行联系原作者。