已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,Windows系统编程实用教程,授课教师: 职务:,第12章 WMI编程,课程描述 WMI是Windows的核心组件,通过编写WMI脚本和应用程序可以获取计算机系统、软件和硬件信息,还可以对计算机进行管理,比如关机、重新启动计算机等。本章将介绍WMI编程当前相关技术。,本章知识点,12.1 WMI技术基础 12.2 WMI编程方法,12.1 WMI技术基础,12.1.1 什么是WMI 12.1.2 WMI体系结构 12.1.3 WMI测试器 12.1.4 WMI查询语言(WQL),12.1.1 什么是WMI,WMI(Windows Management Instrumentation,Windows管理规范)是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语言编写的、用于访问WMI的程序。,2WMI基础结构,中间层是WMI基础结构,它由4个主要组件构成,即WMI脚本库、公共信息模型对象管理器(Common Information Model Object Manager,CIMOM)、公共信息模型(Common Information Model,CIM)储存库和WMI提供程序。这些组件的具体情况将在稍后介绍。,3WMI脚本库,WMI脚本库为开发WMI脚本提供了一系列的对象,可以使用它们来访问和管理WMI托管资源。无论托管资源是计算机、事件日志、操作系统、进程、服务或者用户选择的其他资源,WMI脚本库中的对象都以相同的方式工作。 WMI脚本库可以完成下面7种基本任务。 获取WMI托管资源的实例。 读取WMI托管资源的属性。 修改WMI托管资源的属性。 调用WMI托管资源的方法。 在WMI托管资源中创建一个新的实例。 在WMI托管资源中删除一个实例。 订阅对WMI托管资源进行创建、修改和删除的事件。,4公共信息模型,CIM(Common Information Model,公共信息模型)是一个与具体实现无关的、用于描述管理信息的概念性模型,它由核心模型、公共模型和扩展模型三层构成。核心模型是一系列类、连接和属性的集合,该对象组提供了所有管理域通用的基本信息模型;公共模型提供特定管理域的通用信息模型,这些特定的管理域包括系统、应用程序、网络和设备等;扩展模型代表通用模型的特定技术扩展。 CIM类通常表示动态资源。也就是说,资源的实例并不存储在CIM中,而是通过基于使用者请求的提供程序动态检索。类被分组到命名空间中,命名空间是表示一个特定的管理区域的类逻辑组。命名空间rootcimv2包括大部分通常与计算机和操作系统相关联的资源类。例如,Win32_LogicalMemoryConfiguration、Win32_Service和Win32_NTLogEvent等类都驻留在命名空间rootcimv2中,它们只是在CIM中定义的数百个类中的3个。,5公共信息模型对象管理器,CIMOM(Common Information Model Object Manager,公共信息模型对象管理器)是一个描述操作系统构成单元的对象数据库,为MMC(Microsoft Management Console,微软管理控制台)和脚本程序提供了一个访问操作系统构成单元的公共接口。除此之外,CIMOM还向WMI提供下面的核心服务。 提供注册:WMI利用CIMOM提供注册位置和功能信息。此信息存储在CIM储存库中。 请求传送:CIMOM使用提供程序注册信息,将使用者请求传送到合适的提供程序。 远程访问:使用者通过连接到远程系统上的CIMOM访问启用WMI的远程系统。一旦连接建立,使用者可以执行与在本地可以执行的操作相同的操作。 安全性:在本地计算机或是远程计算机上,允许用户在连接到WMI之前验证每个用户的访问标记,CIMOM控制对WMI托管资源的访问。WMI并不覆盖或阻止由操作系统提供的安全性。 查询处理:允许使用者使用WMI查询语言(WMI Query Language,WQL)发出关于任何WMI托管资源的查询。CIMOM只在提供程序本身不支持查询操作的情况下执行查询计算。 事件处理:允许使用者订阅表示对WMI托管资源更改的事件。例如,可以订阅一个事件,表明逻辑磁盘驱动器上的空间何时下降到可接受的阈值。CIMOM按一个指定的间隔轮询托管资源,并在满足订阅条件时生成一个事件通知。,6WMI提供程序,WMI提供程序在WMI和托管资源之间扮演着中间方的角色。提供程序代表用户应用程序和脚本从WMI托管资源请求信息,并发送指令到WMI托管资源。WMI提供程序通常以DLL文件的方式保存在%SystemRoot%system32wbem 目录下。Windows 2000、Windows XP和Windows Server 2003等操作系统都提供内置的WMI提供程序。,7托管资源,托管资源是任意逻辑或物理组件,通过使用WMI进行公开和管理。可以使用WMI管理的Windows资源包括计算机系统、磁盘、外围设备、事件日志、文件、文件夹、文件系统、网络组件、操作系统子系统、性能计数器、打印机、进程、注册表设置、安全性、服务、共享、SAM用户和组、Active Directory、Windows安装程序、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类,单击“枚举类别”按钮,打开“超类别信息”对话框,如图12.7所示。在该对话框中可以查看到指定名称空间中的类信息。如果要查看名称空间rootcimv2中包含的所有CIM类,则不输入超类别名称,然后选择“递归”单选按钮,单击“确定”按钮,如图12.8所示。,CIM类的对象编辑器,双击一个类,可以打开对象编辑器,查看该类的限定符、属性和方法,如图12.9所示。,执行下面的WQL语句,在WMI测试器的主窗口中单击“查询”按钮,可以打开“查询”对话框,如图12.10所示。 执行下面的WQL语句可以查询类Win32_Process中的数据。 SELECT * FROM Win32_Process,WQL语句的查询结果,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组件对象和接口 2标识符(GUID) 3接口派生 4创建COM对象 5销毁对象,1组件对象和接口,组件对象和接口是COM的核心要素,它们都是基于面向对象程序设计思想的。 组件对象与C+对象相似,都是由属性和方法组成,是一个实体对象。可以实现接口中定义的操作。 接口是一种特殊的C+类,其中只定义了一些虚拟成员函数,没有成员变量,也没有非虚拟的成员函数。所谓虚拟函数是指只定义了函数的原型,但没有具体实现代码的函数。接口不用于实现具体的功能,它可以为一组类定义它们的共性操作。,【例12.1】,以接口IUnknown为例,来说明接口的基本概念。假定COM对象IUnknown的声明代码如下: class IUnknown public: 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进制数,其余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, IWbemContext* 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, _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*) ,5销毁对象,每个COM对象都有一个参考计数,当不再使用COM对象时,应该调用Release()函数减少其参考计数值。当计数值为0时,系统将删除该对象。 【例12.4】下面是创建和销毁IWbemLocator对象的示例代码。 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 CoInitializeEx( 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 = 0x“ hex hr endl; return hr; ,2初始化COM的安全级别,如果需要修改默认的安全设置,可以调用CoInitializeSecurity()函数。CoInitializeSecurity()函数的原型如下: 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安全级别的示例代码。 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 = 0x“ hex hr endl; CoUninitialize(); return hr; / 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()函数初始化IWbemLocator对象的示例代码。 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()函数可以获取指定计算机上rootcimv2命令空间上的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】,假定pLoc是已经创建的IWbemLocator对象,则下面的代码用于连接到计算机COMPUTERNAME的rootcimv2命名空间。 hres = pLoc-ConnectServer( _bstr_t(L“COMPUTERNAMErootcimv2“), _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 设置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 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()函数可以获取记录中每个字段的值,函数原型如下: HRESULT Get( LPCWSTR wszName, LONG lFlags, VARIANT* pVal, CIMTYPE* pvtType, LONG* plFlavor );,【例12.9】,下面是调用WQL语句获取本地计算机BIOS信息的示例代码。pSvc是已经连接到WMI实例、并且已经设置了安全属性的IWbemServices对象。 IWbemServices *pSvc; / 用于连接WMI IWbemLocator *pLoc; / 定位器 HRESULT hres; pSvc = NULL; pLoc = NULL; / 1. 初始化COM hres = 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 (FAILED(hres) ,接上,/ 4. 连接到WMI pSvc = NULL; hres = pLoc-ConnectServer( _bstr_t(“rootcimv2“), / WMI命名空间的对象路径 NULL, / 用户名 NULL, / 密码 0, / 地域 NULL, / 安全标识 0, / 授权 0, / 上下文对象 ,接上,/ 执行WQL查询 HRESUL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋装修除尘器安全使用预案
- 大班健康教案牙齿变干净
- 大班健康教案及教学反思《吃健康食物》
- 2024年专用:仓储物流一体化合同
- 二年级上册数学素材:6.4 用8的乘法口诀求商 导学案和校本作业苏教版无答案
- 一年级下册数学教案-5 认识人民币《人民币的解决问题》∣ 人教新课标
- 二年级下册数学教案 5.《混合运算》 (人教版)
- 艺术院校实践与创作方案
- 2024北京高一(上)期末地理汇编:地球上的大气章节综合
- 2024年个人房屋租赁合同违约责任
- 陈皮仓储合同模板例子
- 2024年安全生产月全国安全生产知识竞赛题库及答案(共六套)
- 2024-2025学年沪教版小学四年级上学期期中英语试卷及解答参考
- 消除“艾梅乙”医疗歧视-从我做起
- DB23T 3844-2024煤矿地区地震(矿震)监测台网技术要求
- 《阿凡达》电影赏析
- DB42-T 2286-2024 地铁冷却塔卫生管理规范
- 合作伙伴合同协议书范文5份
- 小学生主题班会《追梦奥运+做大家少年》(课件)
- 公安机关人民警察高级执法资格考题及解析
- 浙教版信息科技四年级上册全册教学设计
评论
0/150
提交评论