原文地址:http://blog.csdn.net/bubble4629/article/details/3793174
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""")
dim intstatus
intstatus = objspooler.startservice()
wscript.echo intstatus
此时我们运行程序,发现得到相同的结果,因此我们可以知道使用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对象
简单修改前面的程序如下:
dim objspooler
set objspooler = getobject("winmgmts:{impersonationlevel=impersonate}!win32_service=""spooler""")
dim intstatus
intstatus = objspooler.startservice()
wscript.echo intstatus
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
wscript.echo objsystem.systemstartupdelay
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
下面一个例子和上面的例子一样,实现同样的功能
option explicit
dim colwin32assocs
dim objsvc
set colwin32assocs = getobject("winmgmts:{impersonationlevel=impersonate}").execquery("associators of {win32_service.name=""lanmanworkstation""}")
for each objsvc in colwin32assocs
wscript.echo objsvc.Description
next
结果如下显示:
AT/AT COMPATIBLE
NetworkProvider
Alerter
Background Intelligent Transfer Service
Computer Browser
Messenger
Net Logon
Remote Procedure Call (RPC) Locator