window高级编程之WMI编程应用.ppt

上传人:小飞机 文档编号:6523763 上传时间:2023-11-08 格式:PPT 页数:54 大小:286KB
返回 下载 相关 举报
window高级编程之WMI编程应用.ppt_第1页
第1页 / 共54页
window高级编程之WMI编程应用.ppt_第2页
第2页 / 共54页
window高级编程之WMI编程应用.ppt_第3页
第3页 / 共54页
window高级编程之WMI编程应用.ppt_第4页
第4页 / 共54页
window高级编程之WMI编程应用.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《window高级编程之WMI编程应用.ppt》由会员分享,可在线阅读,更多相关《window高级编程之WMI编程应用.ppt(54页珍藏版)》请在三一办公上搜索。

1、,Windows系统编程实用教程,授课教师:职务:,第12章 WMI编程,课程描述WMI是Windows的核心组件,通过编写WMI脚本和应用程序可以获取计算机系统、软件和硬件信息,还可以对计算机进行管理,比如关机、重新启动计算机等。本章将介绍WMI编程当前相关技术。,本章知识点,12.1 WMI技术基础12.2 WMI编程方法,12.1 WMI技术基础,12.1.1 什么是WMI12.1.2 WMI体系结构12.1.3 WMI测试器12.1.4 WMI查询语言(WQL),12.1.1 什么是WMI,WMI(Windows Management Instrumentation,Windows管理

2、规范)是Windows的一项核心技术,它以CIMOM(Common Information Model Object Manager,公共信息模型对象管理器)为基础,是一个描述Windows操作系统构成单元的对象数据库。使用WMI技术的方式通常包括以下3种:通过WMI测试器工具对系统进行查询和管理。关于WMI测试器工具的具体使用方法将在12.1.4小节介绍。编写WMI脚本实现自动任务管理。通过C+程序接口、.NET类等方法编写应用程序获取和管理Windows操作系统中的对象信息。,12.1.2 WMI体系结构,1WMI脚本,WMI脚本是用户使用VBScript、Jscript语言编写的、用于访

3、问WMI的程序。,2WMI基础结构,中间层是WMI基础结构,它由4个主要组件构成,即WMI脚本库、公共信息模型对象管理器(Common Information Model Object Manager,CIMOM)、公共信息模型(Common Information Model,CIM)储存库和WMI提供程序。这些组件的具体情况将在稍后介绍。,3WMI脚本库,WMI脚本库为开发WMI脚本提供了一系列的对象,可以使用它们来访问和管理WMI托管资源。无论托管资源是计算机、事件日志、操作系统、进程、服务或者用户选择的其他资源,WMI脚本库中的对象都以相同的方式工作。WMI脚本库可以完成下面7种基本任

4、务。获取WMI托管资源的实例。读取WMI托管资源的属性。修改WMI托管资源的属性。调用WMI托管资源的方法。在WMI托管资源中创建一个新的实例。在WMI托管资源中删除一个实例。订阅对WMI托管资源进行创建、修改和删除的事件。,4公共信息模型,CIM(Common Information Model,公共信息模型)是一个与具体实现无关的、用于描述管理信息的概念性模型,它由核心模型、公共模型和扩展模型三层构成。核心模型是一系列类、连接和属性的集合,该对象组提供了所有管理域通用的基本信息模型;公共模型提供特定管理域的通用信息模型,这些特定的管理域包括系统、应用程序、网络和设备等;扩展模型代表通用模型

5、的特定技术扩展。CIM类通常表示动态资源。也就是说,资源的实例并不存储在CIM中,而是通过基于使用者请求的提供程序动态检索。类被分组到命名空间中,命名空间是表示一个特定的管理区域的类逻辑组。命名空间rootcimv2包括大部分通常与计算机和操作系统相关联的资源类。例如,Win32_LogicalMemoryConfiguration、Win32_Service和Win32_NTLogEvent等类都驻留在命名空间rootcimv2中,它们只是在CIM中定义的数百个类中的3个。,5公共信息模型对象管理器,CIMOM(Common Information Model Object Manager,

6、公共信息模型对象管理器)是一个描述操作系统构成单元的对象数据库,为MMC(Microsoft Management Console,微软管理控制台)和脚本程序提供了一个访问操作系统构成单元的公共接口。除此之外,CIMOM还向WMI提供下面的核心服务。提供注册:WMI利用CIMOM提供注册位置和功能信息。此信息存储在CIM储存库中。请求传送:CIMOM使用提供程序注册信息,将使用者请求传送到合适的提供程序。远程访问:使用者通过连接到远程系统上的CIMOM访问启用WMI的远程系统。一旦连接建立,使用者可以执行与在本地可以执行的操作相同的操作。安全性:在本地计算机或是远程计算机上,允许用户在连接到W

7、MI之前验证每个用户的访问标记,CIMOM控制对WMI托管资源的访问。WMI并不覆盖或阻止由操作系统提供的安全性。查询处理:允许使用者使用WMI查询语言(WMI Query Language,WQL)发出关于任何WMI托管资源的查询。CIMOM只在提供程序本身不支持查询操作的情况下执行查询计算。事件处理:允许使用者订阅表示对WMI托管资源更改的事件。例如,可以订阅一个事件,表明逻辑磁盘驱动器上的空间何时下降到可接受的阈值。CIMOM按一个指定的间隔轮询托管资源,并在满足订阅条件时生成一个事件通知。,6WMI提供程序,WMI提供程序在WMI和托管资源之间扮演着中间方的角色。提供程序代表用户应用程

8、序和脚本从WMI托管资源请求信息,并发送指令到WMI托管资源。WMI提供程序通常以DLL文件的方式保存在%SystemRoot%system32wbem 目录下。Windows 2000、Windows XP和Windows Server 2003等操作系统都提供内置的WMI提供程序。,7托管资源,托管资源是任意逻辑或物理组件,通过使用WMI进行公开和管理。可以使用WMI管理的Windows资源包括计算机系统、磁盘、外围设备、事件日志、文件、文件夹、文件系统、网络组件、操作系统子系统、性能计数器、打印机、进程、注册表设置、安全性、服务、共享、SAM用户和组、Active Directory、W

9、indows安装程序、Windows驱动程序模式(WDM)设备驱动程序以及SNMP管理信息基数据(MIB)等。WMI托管资源通过WMI提供程序与WMI服务通讯。,12.1.3 WMI测试器,WMI测试器是能够与WMI基础结构进行交互的图形化工具,可以使用它来浏览CIM架构并检查托管资源类的定义。在命令窗口中执行wbemtest.exe,可以打开WMI测试器工具,如图12.4所示。此时,窗口中大部分按钮都是被禁用的,这说明此时还没有连接到WMI。,“连接”对话框,单击“连接”按钮,打开“连接”对话框,如图12.3所示。,连接后的WMI测试器,查看rootcimv2命名空间下的所有CIM类,单击“

10、枚举类别”按钮,打开“超类别信息”对话框,如图12.7所示。在该对话框中可以查看到指定名称空间中的类信息。如果要查看名称空间rootcimv2中包含的所有CIM类,则不输入超类别名称,然后选择“递归”单选按钮,单击“确定”按钮,如图12.8所示。,CIM类的对象编辑器,双击一个类,可以打开对象编辑器,查看该类的限定符、属性和方法,如图12.9所示。,执行下面的WQL语句,在WMI测试器的主窗口中单击“查询”按钮,可以打开“查询”对话框,如图12.10所示。执行下面的WQL语句可以查询类Win32_Process中的数据。SELECT*FROM Win32_Process,WQL语句的查询结果,

11、12.1.4 WMI查询语言(WQL),WQL(WMI Query Language,WMI查询语言)可以使用SQL语句的方式来访问WMI实例,查询指定类的数据。WMI查询语句的格式如下:SELECT FROM WHERE 关于WMI中常用类的具体情况将在附录2中结合实例介绍。,12.2 WMI编程方法,12.2.1 COM和接口12.2.2 为WMI应用程序初始化COM环境12.2.3 获取到WMI的IWbemLocator对象12.2.4 连接到指定的计算机12.2.5 设置WMI连接的安全属性12.2.6 执行查询操作12.2.7 执行CIM类的方法,12.2.1 COM和接口,1组件对

12、象和接口2标识符(GUID)3接口派生4创建COM对象5销毁对象,1组件对象和接口,组件对象和接口是COM的核心要素,它们都是基于面向对象程序设计思想的。组件对象与C+对象相似,都是由属性和方法组成,是一个实体对象。可以实现接口中定义的操作。接口是一种特殊的C+类,其中只定义了一些虚拟成员函数,没有成员变量,也没有非虚拟的成员函数。所谓虚拟函数是指只定义了函数的原型,但没有具体实现代码的函数。接口不用于实现具体的功能,它可以为一组类定义它们的共性操作。,【例12.1】,以接口IUnknown为例,来说明接口的基本概念。假定COM对象IUnknown的声明代码如下:class IUnknownp

13、ublic:virtual long _ _stdcall QueryInterface(const GUID,2标识符(GUID),在COM中,使用标识符(GUID)来唯一标识一个COM对象、接口或者其他COM元素。在C+中,GUID表现为结构体的形式,代码如下:typedef struct _GUID DWORD Data1;WORD Data2;WORD Data3;BYTE Data48;GUID;参数说明如下:Data1,指定8位16进制数。Data2,指定第1组4位16进制数。Data3,指定第2组4位16进制数。Data4,8个元素的字节数组。前2个字节包含第3组4位16进制数,

14、其余6个字节包含最后12位16进制数。,3接口派生,每个COM对象都必须从接口IUnknown派生,因此每个COM对象都会继承接口IUnknown的QueryInterface()、AddRef()和Release()函数。下面是接口IWbemLocator的定义。interface IWbemLocator:IUnknown HRESULT ConnectServer(BSTR strNetworkResource,BSTR strUser,BSTR strPassword,BSTR strLocale,long lSecurityFlags,BSTR strAuthority,IWbemC

15、ontext*pCtx,IWbemServices*ppNameSpace);使用IWbemLocator接口可以获取指定计算机上WMI的IWbemServices接口的初始命名空间,因此IWbemLocator对象又被称为定位器对象。可以通过IWbemServices接口访问WMI服务。IWbemLocator接口包含4个函数,即QueryInterface()、AddRef()、Release()和ConnectServer()。,4创建COM对象,HRESULT CoCreateInstance(_in REFCLSID rclsid,_in LPUNKNOWN pUnkOuter,_i

16、n DWORD dwClsContext,_in REFIID riid,_out LPVOID*ppv);,【例12.3】,下面是创建IWbemLocator对象的示例代码。IWbemLocator*locator;HRESULT hr=CoCreateInstance(CLSID_WbemLocator,NULL,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(PVOID*),5销毁对象,每个COM对象都有一个参考计数,当不再使用COM对象时,应该调用Release()函数减少其参考计数值。当计数值为0时,系统将删除该对象。【例12.4】下面是创建和销毁IWb

17、emLocator对象的示例代码。IWbemLocator*locator;HRESULT hr=CoCreateInstance(CLSID_WbemLocator,NULL,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(PVOID*),12.2.2 为WMI应用程序初始化COM环境,1为WMI应用程序初始化COM参数2初始化COM的安全级别,1为WMI应用程序初始化COM参数,除了分配内存空间的函数外,应用程序在调用其他COM库函数之前,必须首先要调用CoInitializeEx()函数。CoInitializeEx()函数的原型如下:HRESULT CoI

18、nitializeEx(LPVOID pvReserved,DWORD dwCoInit);,【例12.5】,下面是使用CoInitializeEx()函数初始化COM库的示例代码。HRESULT hr;hr=CoInitializeEx(0,COINIT_MULTITHREADED);if(FAILED(hr)cout Failed to initialize COM library.Error code=0 x hex hr endl;return hr;,2初始化COM的安全级别,如果需要修改默认的安全设置,可以调用CoInitializeSecurity()函数。CoInitializ

19、eSecurity()函数的原型如下:HRESULT CoInitializeSecurity(PSECURITY_DESCRIPTOR pVoid,LONG cAuthSvc,SOLE_AUTHENTICATION_SERVICE*asAuthSvc,void*pReserved1,DWORD dwAuthnLevel,DWORD dwImpLevel,SOLE_AUTHENTICATION_LIST*pAuthList,DWORD dwCapabilities,void*pReserved3);,【例12.6】,下面是使用CoInitializeSecurity()函数设置COM安全级别的

20、示例代码。hr=CoInitializeSecurity(NULL,/安全描述符-1,/则COM来处理认证服务 NULL,/认证服务数组 NULL,/保留 RPC_C_AUTHN_LEVEL_DEFAULT,/代理的默认认证级别 RPC_C_IMP_LEVEL_IMPERSONATE,/代理的默认模拟级别 NULL,/认证信息 EOAC_NONE,/客户端或者服务器的附加能力 NULL);/保留if(FAILED(hr)cout Failed to initialize security.Error code=0 x hex hr endl;CoUninitialize();return hr

21、;/Program has failed.,12.2.3 获取到WMI的IWbemLocator对象,请求WMI服务的客户端首先需要调用CoCreateInstance()或CoCreateInstanceEx()函数获取IWbemLocator对象。CoCreateInstance()函数的原型如下:STDAPI CoCreateInstance(REFCLSID rclsid,LPUNKNOWN pUnkOuter,DWORD dwClsContext,REFIID riid,LPVOID*ppv);,【例12.7】,下面是调用CoCreateInstance()函数初始化IWbemLoc

22、ator对象的示例代码。IWbemLocator*pLoc=0;/获取的IWbemLocator对象HRESULT hr;/CLSID_WbemLocator是一个GUID,称为类标识符,它标识一种或一类COM对象/CLSCTX_INPROC_SERVER指定管理对象的服务器类型hr=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID*)/程序失败.,12.2.4 连接到指定的计算机,调用IWbemLocator:ConnectServer()函数可以获取指定计算机上rootcim

23、v2命令空间上的IWbemService对象的指针。连接的计算机可以是本地计算机,也可以是远程计算机。IWbemLocator:ConnectServer()函数的语法如下:HRESULT ConnectServer(const BSTR strNetworkResource,const BSTR strUser,const BSTR strPassword,const BSTR strLocale,LONG lSecurityFlags,const BSTR strAuthority,IWbemContext*pCtx,IWbemServices*ppNamespace);,【例12.8】,

24、假定pLoc是已经创建的IWbemLocator对象,则下面的代码用于连接到计算机COMPUTERNAME的rootcimv2命名空间。hres=pLoc-ConnectServer(_bstr_t(LCOMPUTERNAMErootcimv2),_bstr_t(useToken?NULL:pszName),/用户名 _bstr_t(useToken?NULL:pszPwd),/密码 NULL,/地域 NULL,/安全标识 _bstr_t(useNTLM?NULL:pszAuthority),/Authority NULL,/上下文对象/Program has failed.,12.2.5 设

25、置WMI连接的安全属性,HRESULT CoSetProxyBlanket(_in IUnknown*pProxy,_in DWORD dwAuthnSvc,_in DWORD dwAuthzSvc,_in_opt OLECHAR*pServerPrincName,_in DWORD dwAuthnLevel,_in DWORD dwImpLevel,_in_opt RPC_AUTH_IDENTITY_HANDLE pAuthInfo,_in DWORD dwCapabilities);,12.2.6 执行查询操作,HRESULT ExecQuery(const BSTR strQueryLa

26、nguage,const BSTR strQuery,LONG lFlags,IWbemContext*pCtx,IEnumWbemClassObject*ppEnum);,Next()函数,HRESULT Next(LONG lTimeOut,ULONG uCount,IWbemClassObject*ppObjects,ULONG*puReturned);,IWbemClassObject:Get()函数,IWbemClassObject对象相当于查询结果中的一条记录,调用IWbemClassObject:Get()函数可以获取记录中每个字段的值,函数原型如下:HRESULT Get(LP

27、CWSTR wszName,LONG lFlags,VARIANT*pVal,CIMTYPE*pvtType,LONG*plFlavor);,【例12.9】,下面是调用WQL语句获取本地计算机BIOS信息的示例代码。pSvc是已经连接到WMI实例、并且已经设置了安全属性的IWbemServices对象。IWbemServices*pSvc;/用于连接WMIIWbemLocator*pLoc;/定位器HRESULT hres;pSvc=NULL;pLoc=NULL;/1.初始化COMhres=CoInitializeEx(0,COINIT_MULTITHREADED);if(FAILED(hre

28、s)printf(初始化COM库失败!);return false;,接上,/2.设置安全级别 hres=CoInitializeSecurity(NULL,-1,/COM身份认证 NULL,/认证服务器 NULL,/保留 RPC_C_AUTHN_LEVEL_DEFAULT,/默认认证方式 RPC_C_IMP_LEVEL_IMPERSONATE,/默认模拟级别 NULL,/认证信息 EOAC_NONE,/附加能力 NULL/保留);,接上,if(FAILED(hres),接上,/4.连接到WMI pSvc=NULL;hres=pLoc-ConnectServer(_bstr_t(rootcim

29、v2),/WMI命名空间的对象路径NULL,/用户名NULL,/密码 0,/地域 NULL,/安全标识 0,/授权 0,/上下文对象,接上,/执行WQL查询HRESULT hr=pSvc-ExecQuery(bstr_t(WQL),bstr_t(Select*FROM Win32_BIOS),WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,NULL,接上,while(pEnumerator)ULONG uReturn=0;hr=pEnumerator-Next(WBEM_INFINITE,1,接上,hr=pclsObj-Get(LCurr

30、entLanguage,0,【例12.9】的运行结果,12.2.7 执行CIM类的方法,调用IWbemServices:ExecMethod()函数可以执行CIM类上的指定方法,函数原型如下:HRESULT ExecMethod(in const BSTR strObjectPath,in const BSTR strMethodName,in long lFlags,in IWbemContext*pCtx,in IWbemClassObject*pInParams,out IWbemClassObject*ppOutParams,out IWbemCallResult*ppCallResu

31、lt);,【例12.10】,下面是调用ExecMethod()函数在指定计算机上创建进程的示例代码。pSvc是已经连接到WMI实例、并且已经设置了安全属性的IWbemServices对象。/设置调用Win32_Process:Create方法BSTR MethodName=SysAllocString(LCreate);BSTR ClassName=SysAllocString(LWin32_Process);/pClass用于获取类定义和类实例的对象IWbemClassObject*pClass=NULL;/获取Win32_Process类对应的IWbemClassObject对象hres=pSvc-GetObject(ClassName,0,NULL,接上,/保存输入参数值hres=pClassInstance-Put(LCommandLine,0,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号