WMI技术学习(5)

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

呵呵今天就些说到这里了,呵呵,快快乐乐每一天。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值