window高级编程之WMI编程应用_第1页
window高级编程之WMI编程应用_第2页
window高级编程之WMI编程应用_第3页
window高级编程之WMI编程应用_第4页
window高级编程之WMI编程应用_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 什么是WMIWMI(Windows Management Instrumentation,Windows管理规范)是Window

2、s的一项核心技术,它以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语言编写的、用于访问WMI的程序。2WMI基

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

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

5、源。也就是说,资源的实例并不存储在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的远程系统。一旦连接建立,使用者可以执行与在本地可以执行的操作相同的操作。 安全性:在本地计算机或是远程计算机上,允许用户在连接到WMI之前验证每个用户的访问标记,CI

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

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

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

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

11、 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组件对象和接口2标识符(GUID)3接口派生4创建COM对象5销毁对象1组件对象

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

13、face(const GUID& riid, void* ppvObject); virtual unsigned long _ _stdcall AddRef(); virtual unsigned long _ _stdcall Release();2标识符(GUID)在COM中,使用标识符(GUID)来唯一标识一个COM对象、接口或者其他COM元素。在C+中,GUID表现为结构体的形式,代码如下:typedef struct _GUID DWORD Data1; WORD Data2; WORD Data3; BYTE Data48; GUID;参数说明如下:Data1,指定8位16进制

14、数。Data2,指定第1组4位16进制数。Data3,指定第2组4位16进制数。Data4,8个元素的字节数组。前2个字节包含第3组4位16进制数,其余6个字节包含最后12位16进制数。3接口派生每个COM对象都必须从接口IUnknown派生,因此每个COM对象都会继承接口IUnknown的QueryInterface()、AddRef()和Release()函数。下面是接口IWbemLocator的定义。interface IWbemLocator : IUnknown HRESULT ConnectServer(BSTR strNetworkResource,BSTR strUser,BS

15、TR strPassword,BSTR strLocale,long lSecurityFlags,BSTR strAuthority,IWbemContext* pCtx,IWbemServices* ppNameSpace);使用IWbemLocator接口可以获取指定计算机上WMI的IWbemServices接口的初始命名空间,因此IWbemLocator对象又被称为定位器对象。可以通过IWbemServices接口访问WMI服务。IWbemLocator接口包含4个函数,即QueryInterface()、AddRef()、Release()和ConnectServer()。4创建CO

16、M对象HRESULT CoCreateInstance( _in REFCLSID rclsid, _in LPUNKNOWN pUnkOuter, _in 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*) &locator

17、);5销毁对象每个COM对象都有一个参考计数,当不再使用COM对象时,应该调用Release()函数减少其参考计数值。当计数值为0时,系统将删除该对象。【例12.4】下面是创建和销毁IWbemLocator对象的示例代码。IWbemLocator* locator;HRESULT hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (PVOID*) &locator);if(SUCCEEDED(hr) / 使用IWbemLocator对象hr locator-Release

18、();12.2.2 为WMI应用程序初始化COM环境 1为WMI应用程序初始化COM参数2初始化COM的安全级别 1为WMI应用程序初始化COM参数除了分配内存空间的函数外,应用程序在调用其他COM库函数之前,必须首先要调用CoInitializeEx()函数。CoInitializeEx()函数的原型如下:HRESULT CoInitializeEx( LPVOID pvReserved, DWORD dwCoInit);【例12.5】下面是使用CoInitializeEx()函数初始化COM库的示例代码。HRESULT hr;hr = CoInitializeEx(0, COINIT_MU

19、LTITHREADED); if (FAILED(hr) cout Failed to initialize COM library. Error code = 0 x hex hr endl; return hr;2初始化COM的安全级别如果需要修改默认的安全设置,可以调用CoInitializeSecurity()函数。CoInitializeSecurity()函数的原型如下:HRESULT CoInitializeSecurity( PSECURITY_DESCRIPTOR pVoid, LONG cAuthSvc, SOLE_AUTHENTICATION_SERVICE* asAut

20、hSvc, void* pReserved1, DWORD dwAuthnLevel, DWORD dwImpLevel, SOLE_AUTHENTICATION_LIST* pAuthList, DWORD dwCapabilities, void* pReserved3 );【例12.6】下面是使用CoInitializeSecurity()函数设置COM安全级别的示例代码。hr = CoInitializeSecurity( NULL, / 安全描述符 -1, / 则COM来处理认证服务 NULL, / 认证服务数组 NULL, / 保留 RPC_C_AUTHN_LEVEL_DEFAUL

21、T, / 代理的默认认证级别 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; / Program has failed.12.2.3 获取到WMI的IWbemLocator对象请求WMI服务的客户端首先需要调用CoCreateInstance()

22、或CoCreateInstanceEx()函数获取IWbemLocator对象。CoCreateInstance()函数的原型如下:STDAPI CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv);【例12.7】下面是调用CoCreateInstance()函数初始化IWbemLocator对象的示例代码。IWbemLocator *pLoc = 0; / 获取的IWbemLocator对象HRESULT hr;/ CLSID_WbemLoca

23、tor是一个GUID,称为类标识符,它标识一种或一类COM对象/ CLSCTX_INPROC_SERVER指定管理对象的服务器类型hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hr) cout Failed to create IWbemLocator object. Err code = 0 x hex hr ConnectServer( _bstr_t(LCOMPUTERNAMErootcimv2), _bst

24、r_t(useToken?NULL:pszName), / 用户名 _bstr_t(useToken?NULL:pszPwd), / 密码 NULL, / 地域 NULL, / 安全标识 _bstr_t(useNTLM?NULL:pszAuthority), / Authority NULL, / 上下文对象 &pSvc / IWbemServices代理 ); if (FAILED(hres) cout Could not connect. Error code = 0 x hex hres Release(); CoUninitialize(); return 1; / Program h

25、as failed. 12.2.5 设置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 Exec

26、Query( const BSTR strQueryLanguage, 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()函

27、数可以获取记录中每个字段的值,函数原型如下:HRESULT Get( LPCWSTR 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

28、 = CoInitializeEx(0, COINIT_MULTITHREADED);if(FAILED(hres)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 (FAIL

29、ED(hres) & hres!= RPC_E_TOO_LATE) printf(初始化安全级别失败!); CoUninitialize(); /return false; exit(0); / 3. 获取WMI的定位器 hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres) printf(创建IWbemLocator对象失败!); CoUninitialize(); /return false; exit

30、(0); 接上 / 4. 连接到WMI pSvc = NULL;hres = pLoc-ConnectServer(_bstr_t(rootcimv2),/ WMI命名空间的对象路径NULL,/ 用户名NULL,/ 密码 0,/ 地域 NULL,/ 安全标识 0,/ 授权 0,/ 上下文对象 &pSvc/ 指向IWbemServices代理的指针 ); IEnumWbemClassObject* pEnumerator = NULL;接上/ 执行WQL查询HRESULT hr = pSvc-ExecQuery( bstr_t(WQL), bstr_t(Select * FROM Win32_B

31、IOS), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator );/ 如果执行失败,则释放资源,并返回if (FAILED(hr) pSvc-Release(); pLoc-Release(); CoUninitialize(); return FALSE;/ 遍历IEnumWbemClassObject,输出信息IWbemClassObject *pclsObj=NULL;接上while (pEnumerator) ULONG uReturn = 0; hr = pEnumerator-Next

32、( WBEM_INFINITE, 1, &pclsObj, &uReturn ); if(0 = uReturn) break;/ 获取字段的值 VARIANT vtProp; hr = pclsObj-Get(LName, 0, &vtProp, 0, 0);std:cout Name: _com_util:ConvertBSTRToString(vtProp.bstrVal) Get(LManufacturer, 0, &vtProp, 0, 0); std:cout Manufacturer: _com_util:ConvertBSTRToString(vtProp.bstrVal) G

33、et(LVersion, 0, &vtProp, 0, 0); std:cout Version: _com_util:ConvertBSTRToString(vtProp.bstrVal) Get(LCurrentLanguage, 0, &vtProp, 0, 0); std:cout CurrentLanguage: _com_util:ConvertBSTRToString( vtProp.bstrVal) Release();if (pEnumerator!=NULL) pEnumerator-Release();/ 释放资源pSvc-Release();pLoc-Release();CoUninitialize();【例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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论