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


    原文地址: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

  • 相关阅读:
    .net正在终止线程异常
    js判断客户浏览器类型,版本
    C#中ToString格式大全
    WPF TextBox 搜索框 自定义
    C#:获取设备电量相关信息
    C#中的委托与事件并存的理由
    WPF中的Pack URI
    SQLServer中的数据库备份和还原
    使用Aspose.Cells读取Excel
    SQLServer存储过程事务用法
  • 原文地址:https://www.cnblogs.com/seniortestingdev/p/2442942.html
Copyright © 2020-2023  润新知