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

上传人:人*** 文档编号:568595649 上传时间:2024-07-25 格式:PPT 页数:54 大小:446.51KB
返回 下载 相关 举报
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、WindowsWindows系统编程实用教程系统编程实用教程系统编程实用教程系统编程实用教程授课教师:授课教师:职务:职务:第第12章章WMI编程编程课程描述课程描述课程描述课程描述WMIWMIWMIWMI是是是是WindowsWindowsWindowsWindows的核心组的核心组的核心组的核心组件,通过编写件,通过编写件,通过编写件,通过编写WMIWMIWMIWMI脚本和脚本和脚本和脚本和应用程序可以获取计算应用程序可以获取计算应用程序可以获取计算应用程序可以获取计算机系统、软件和硬件信机系统、软件和硬件信机系统、软件和硬件信机系统、软件和硬件信息,还可以对计算机进息,还可以对计算机进息

2、,还可以对计算机进息,还可以对计算机进行管理,比如关机、重行管理,比如关机、重行管理,比如关机、重行管理,比如关机、重新启动计算机等。本章新启动计算机等。本章新启动计算机等。本章新启动计算机等。本章将介绍将介绍将介绍将介绍WMIWMIWMIWMI编程当前相关编程当前相关编程当前相关编程当前相关技术。技术。技术。技术。For: 分类信息 From: 新闻本章知识点本章知识点12.1 WMI12.1 WMI技术基础技术基础12.2 WMI12.2 WMI编程方法编程方法For: 分类信息 From: 新闻12.1WMI12.1WMI技术基础技术基础12.1.1 12.1.1 什么是什么是W

3、MIWMI12.1.2 WMI12.1.2 WMI体系结构体系结构12.1.3 WMI12.1.3 WMI测试器测试器12.1.4 WMI12.1.4 WMI查询语言(查询语言(WQLWQL)For: 分类信息 From: 新闻12.1.1 什么是什么是WMIWMI(Windows Management Instrumentation,Windows管理规范)是管理规范)是Windows的一项核心技术,它以的一项核心技术,它以CIMOM(Common Information Model Object Manager,公共信息模型对象管理器)为基础,是一个描,公共信息模型对象管理器)为基础,

4、是一个描述述Windows操作系统构成单元的对象数据库。操作系统构成单元的对象数据库。使用使用WMI技术的方式通常包括以下技术的方式通常包括以下3种:种:p通过通过WMI测试器工具对系统进行查询和管理。关于测试器工具对系统进行查询和管理。关于WMI测试器工具的具体使用方法将在测试器工具的具体使用方法将在12.1.4小节介绍。小节介绍。p编写编写WMI脚本实现自动任务管理。脚本实现自动任务管理。p通过通过C+程序接口、程序接口、.NET类等方法编写应用程序获取和类等方法编写应用程序获取和管理管理Windows操作系统中的对象信息。操作系统中的对象信息。For: 分类信息 From: 新闻12

5、.1.2WMI12.1.2WMI体系结构体系结构For: 分类信息 From: 新闻1 1WMIWMI脚本脚本pWMIWMI脚本是用户使用脚本是用户使用VBScriptVBScript、JscriptJscript语言编语言编写的、用于访问写的、用于访问WMIWMI的程序。的程序。For: 分类信息 From: 新闻2 2WMIWMI基础结构基础结构p中间层是中间层是WMIWMI基础结构,它由基础结构,它由4 4个主要组件构成,即个主要组件构成,即WMIWMI脚本库、公共信息脚本库、公共信息模型对象管理器(模型对象管理器(Common Information Model Object

6、ManagerCommon Information Model Object Manager,CIMOMCIMOM)、)、公共信息模型(公共信息模型(Common Information ModelCommon Information Model,CIMCIM)储存库和)储存库和WMIWMI提供程序。提供程序。这些组件的具体情况将在稍后介绍。这些组件的具体情况将在稍后介绍。For: 分类信息 From: 新闻3 3WMIWMI脚本库脚本库WMIWMI脚本库为开发脚本库为开发WMIWMI脚本提供了一系列的对象,可以脚本提供了一系列的对象,可以使用它们来访问和管理使用它们来访问和管理WMIWM

7、I托管资源。无论托管资源托管资源。无论托管资源是计算机、事件日志、操作系统、进程、服务或者是计算机、事件日志、操作系统、进程、服务或者用户选择的其他资源,用户选择的其他资源,WMIWMI脚本库中的对象都以相同脚本库中的对象都以相同的方式工作。的方式工作。WMIWMI脚本库可以完成下面脚本库可以完成下面7 7种基本任务。种基本任务。p获取获取WMIWMI托管资源的实例。托管资源的实例。p读取读取WMIWMI托管资源的属性。托管资源的属性。p修改修改WMIWMI托管资源的属性。托管资源的属性。p调用调用WMIWMI托管资源的方法。托管资源的方法。p在在WMIWMI托管资源中创建一个新的实例。托管资

8、源中创建一个新的实例。p在在WMIWMI托管资源中删除一个实例。托管资源中删除一个实例。p订阅对订阅对WMIWMI托管资源进行创建、修改和删除的事件。托管资源进行创建、修改和删除的事件。For: 分类信息 From: 新闻4 4公共信息模型公共信息模型pCIMCIM(Common Information ModelCommon Information Model,公共信息模型)是一个与具体实现无,公共信息模型)是一个与具体实现无关的、用于描述管理信息的概念性模型,它由核心模型、公共模型和扩关的、用于描述管理信息的概念性模型,它由核心模型、公共模型和扩展模型三层构成。核心模型是一系列类、连接

9、和属性的集合,该对象组展模型三层构成。核心模型是一系列类、连接和属性的集合,该对象组提供了所有管理域通用的基本信息模型;公共模型提供特定管理域的通提供了所有管理域通用的基本信息模型;公共模型提供特定管理域的通用信息模型,这些特定的管理域包括系统、应用程序、网络和设备等;用信息模型,这些特定的管理域包括系统、应用程序、网络和设备等;扩展模型代表通用模型的特定技术扩展。扩展模型代表通用模型的特定技术扩展。pCIMCIM类通常表示动态资源。也就是说,资源的实例并不存储在类通常表示动态资源。也就是说,资源的实例并不存储在CIMCIM中,而中,而是通过基于使用者请求的提供程序动态检索。类被分组到命名空间

10、中,是通过基于使用者请求的提供程序动态检索。类被分组到命名空间中,命名空间是表示一个特定的管理区域的类逻辑组。命名空间命名空间是表示一个特定的管理区域的类逻辑组。命名空间rootcimv2rootcimv2包括大部分通常与计算机和操作系统相关联的资源类。例如,包括大部分通常与计算机和操作系统相关联的资源类。例如,Win32_LogicalMemoryConfigurationWin32_LogicalMemoryConfiguration、Win32_ServiceWin32_Service和和Win32_NTLogEventWin32_NTLogEvent等类都驻留在命名空间等类都驻留在命名

11、空间rootcimv2rootcimv2中,它们只是在中,它们只是在CIMCIM中定义的数百个类中的中定义的数百个类中的3 3个。个。For: 分类信息 From: 新闻5 5公共信息模型对象管理器公共信息模型对象管理器CIMOMCIMOM(Common Information Model Object ManagerCommon Information Model Object Manager,公共信息模型对象管理器),公共信息模型对象管理器)是一个描述操作系统构成单元的对象数据库,为是一个描述操作系统构成单元的对象数据库,为MMCMMC(Microsoft Management Mic

12、rosoft Management ConsoleConsole,微软管理控制台)和脚本程序提供了一个访问操作系统构成单元的公,微软管理控制台)和脚本程序提供了一个访问操作系统构成单元的公共接口。除此之外,共接口。除此之外,CIMOMCIMOM还向还向WMIWMI提供下面的核心服务。提供下面的核心服务。p提供注册:提供注册:WMIWMI利用利用CIMOMCIMOM提供注册位置和功能信息。此信息存储在提供注册位置和功能信息。此信息存储在CIMCIM储存库中。储存库中。 p请求传送:请求传送:CIMOMCIMOM使用提供程序注册信息,将使用者请求传送到合适的提供程序。使用提供程序注册信息,将使用者

13、请求传送到合适的提供程序。 p远程访问:使用者通过连接到远程系统上的远程访问:使用者通过连接到远程系统上的CIMOMCIMOM访问启用访问启用WMIWMI的远程系统。一旦的远程系统。一旦连接建立,使用者可以执行与在本地可以执行的操作相同的操作。连接建立,使用者可以执行与在本地可以执行的操作相同的操作。 p安全性:在本地计算机或是远程计算机上,允许用户在连接到安全性:在本地计算机或是远程计算机上,允许用户在连接到WMIWMI之前验证每个之前验证每个用户的访问标记,用户的访问标记,CIMOMCIMOM控制对控制对WMIWMI托管资源的访问。托管资源的访问。WMIWMI并不覆盖或阻止由操作并不覆盖或

14、阻止由操作系统提供的安全性。系统提供的安全性。p查询处理:允许使用者使用查询处理:允许使用者使用WMIWMI查询语言(查询语言(WMI Query LanguageWMI Query Language,WQLWQL)发出关于)发出关于任何任何WMIWMI托管资源的查询。托管资源的查询。CIMOMCIMOM只在提供程序本身不支持查询操作的情况下执行只在提供程序本身不支持查询操作的情况下执行查询计算。查询计算。p事件处理:允许使用者订阅表示对事件处理:允许使用者订阅表示对WMIWMI托管资源更改的事件。例如,可以订阅一托管资源更改的事件。例如,可以订阅一个事件,表明逻辑磁盘驱动器上的空间何时下降到

15、可接受的阈值。个事件,表明逻辑磁盘驱动器上的空间何时下降到可接受的阈值。CIMOMCIMOM按一个按一个指定的间隔轮询托管资源,并在满足订阅条件时生成一个事件通知。指定的间隔轮询托管资源,并在满足订阅条件时生成一个事件通知。 For: 分类信息 From: 新闻6 6WMIWMI提供程序提供程序pWMIWMI提供程序在提供程序在WMIWMI和托管资源之间扮演着中间方的和托管资源之间扮演着中间方的角色。提供程序代表用户应用程序和脚本从角色。提供程序代表用户应用程序和脚本从WMIWMI托托管资源请求信息,并发送指令到管资源请求信息,并发送指令到WMIWMI托管资源。托管资源。WMIWMI提供程

16、序通常以提供程序通常以DLLDLL文件的方式保存在文件的方式保存在%SystemRoot%system32wbem %SystemRoot%system32wbem 目录下。目录下。Windows Windows 20002000、Windows XPWindows XP和和Windows Server 2003Windows Server 2003等操作等操作系统都提供内置的系统都提供内置的WMIWMI提供程序提供程序。For: 分类信息 From: 新闻7 7托管资源托管资源p托管资源是任意逻辑或物理组件,通过使用托管资源是任意逻辑或物理组件,通过使用WMIWMI进行公开和管理。可以使

17、用进行公开和管理。可以使用WMIWMI管理的管理的WindowsWindows资源包括计算机系统、磁盘、外围设备、事件资源包括计算机系统、磁盘、外围设备、事件日志、文件、文件夹、文件系统、网络组件、日志、文件、文件夹、文件系统、网络组件、操作系统子系统、性能计数器、打印机、进程、操作系统子系统、性能计数器、打印机、进程、注册表设置、安全性、服务、共享、注册表设置、安全性、服务、共享、SAMSAM用户和用户和组、组、Active DirectoryActive Directory、WindowsWindows安装程序、安装程序、WindowsWindows驱动程序模式(驱动程序模式(WDMWDM

18、)设备驱动程序以)设备驱动程序以及及SNMPSNMP管理信息基数据(管理信息基数据(MIBMIB)等。)等。WMIWMI托管资托管资源通过源通过WMIWMI提供程序与提供程序与WMIWMI服务通讯。服务通讯。For: 分类信息 From: 新闻12.1.3WMI12.1.3WMI测试器测试器pWMIWMI测试器是能够与测试器是能够与WMIWMI基础结构进行交互的图形化工具,可以使基础结构进行交互的图形化工具,可以使用它来浏览用它来浏览CIMCIM架构并检查托管资源类的定义。架构并检查托管资源类的定义。p在命令窗口中执行在命令窗口中执行wbemtest.exewbemtest.exe,可以打

19、开,可以打开WMIWMI测试器工具,如测试器工具,如图图12.412.4所示。此时,窗口中大部分按钮都是被禁用的,这说明所示。此时,窗口中大部分按钮都是被禁用的,这说明此时还没有连接到此时还没有连接到WMIWMI。For: 分类信息 From: 新闻“连接连接”对话框对话框p单击单击“连接连接”按钮,打开按钮,打开“连接连接”对话框,如图对话框,如图12.312.3所示。所示。For: 分类信息 From: 新闻连接后的连接后的WMI测试器测试器For: 分类信息 From: 新闻查看查看rootcimv2rootcimv2命名空间下的所有命名空间下的所有CIMCIM类类p单击单击

20、“枚举类别枚举类别”按钮,打开按钮,打开“超类别信息超类别信息”对话框,如图对话框,如图12.712.7所所示。在该对话框中可以查看到指定名称空间中的类信息。如果要查示。在该对话框中可以查看到指定名称空间中的类信息。如果要查看名称空间看名称空间rootcimv2rootcimv2中包含的所有中包含的所有CIMCIM类,则不输入超类别名称,类,则不输入超类别名称,然后选择然后选择“递归递归”单选按钮,单击单选按钮,单击“确定确定”按钮,如图按钮,如图12.812.8所示。所示。For: 分类信息 From: 新闻CIMCIM类的对象编辑器类的对象编辑器p双击一个类,可以打开对象编辑器,查看该

21、类的限定符、属性和方法,双击一个类,可以打开对象编辑器,查看该类的限定符、属性和方法,如图如图12.912.9所示。所示。For: 分类信息 From: 新闻执行下面的执行下面的WQLWQL语句语句p在在WMIWMI测试器的主窗口中单击测试器的主窗口中单击“查询查询”按钮,可以打开按钮,可以打开“查询查询”对话框,如图对话框,如图12.1012.10所示。所示。p执行下面的执行下面的WQLWQL语句可以查询类语句可以查询类Win32_ProcessWin32_Process中的数据。中的数据。SELECT * FROM Win32_ProcessSELECT * FROM Win32_Pr

22、ocessFor: 分类信息 From: 新闻WQL语句的查询结果语句的查询结果For: 分类信息 From: 新闻12.1.4 WMI查询语言(查询语言(WQL)pWQLWQL(WMI Query LanguageWMI Query Language,WMIWMI查询语言)可以使用查询语言)可以使用SQLSQL语句的语句的方式来访问方式来访问WMIWMI实例,查询指定类的数据。实例,查询指定类的数据。WMIWMI查询语句的格式如查询语句的格式如下:下:SELECT SELECT FROM FROM WHERE WHERE 关于关于WMIWMI中常用类的具体情况将在附录中常用类的具体情

23、况将在附录2 2中结合实例介绍。中结合实例介绍。For: 分类信息 From: 新闻12.2WMI12.2WMI编程方法编程方法12.2.1 COM12.2.1 COM和接口和接口12.2.2 12.2.2 为为WMIWMI应用程序初始化应用程序初始化COMCOM环境环境12.2.3 12.2.3 获取到获取到WMIWMI的的IWbemLocatorIWbemLocator对象对象12.2.4 12.2.4 连接到指定的计算机连接到指定的计算机12.2.5 12.2.5 设置设置WMIWMI连接的安全属性连接的安全属性12.2.6 12.2.6 执行查询操作执行查询操作12.2.7 12.

24、2.7 执行执行CIMCIM类的方法类的方法For: 分类信息 From: 新闻12.2.1 COM和接口和接口1 1组件对象和接口组件对象和接口2 2标识符(标识符(GUIDGUID)3 3接口派生接口派生4 4创建创建COMCOM对象对象5 5销毁对象销毁对象For: 分类信息 From: 新闻1 1组件对象和接口组件对象和接口p组件对象和接口是组件对象和接口是COM的核心要素,它们都是基于的核心要素,它们都是基于面向对象程序设计思想的。面向对象程序设计思想的。p组件对象与组件对象与C+对象相似,都是由属性和方法组成,对象相似,都是由属性和方法组成,是一个实体对象。可以实现接口中定

25、义的操作。是一个实体对象。可以实现接口中定义的操作。p接口是一种特殊的接口是一种特殊的C+类,其中只定义了一些虚拟成类,其中只定义了一些虚拟成员函数,没有成员变量,也没有非虚拟的成员函数。员函数,没有成员变量,也没有非虚拟的成员函数。所谓虚拟函数是指只定义了函数的原型,但没有具体所谓虚拟函数是指只定义了函数的原型,但没有具体实现代码的函数。接口不用于实现具体的功能,它可实现代码的函数。接口不用于实现具体的功能,它可以为一组类定义它们的共性操作。以为一组类定义它们的共性操作。For: 分类信息 From: 新闻【例【例12.1】p以接口以接口IUnknownIUnknown为例,来说明接口的

26、基本概念。假定为例,来说明接口的基本概念。假定COMCOM对象对象IUnknownIUnknown的声明代码如下:的声明代码如下:class IUnknownclass IUnknown public:public: virtual long _ _stdcall QueryInterface(const GUID& riid, virtual long _ _stdcall QueryInterface(const GUID& riid, void* ppvObject);void* ppvObject); virtual unsigned long _ _stdcall AddRef();

27、 virtual unsigned long _ _stdcall AddRef(); virtual unsigned long _ _stdcall Release(); virtual unsigned long _ _stdcall Release();For: 分类信息 From: 新闻2 2标识符(标识符(GUIDGUID)p在在COMCOM中,使用标识符(中,使用标识符(GUIDGUID)来唯一标识一个)来唯一标识一个COMCOM对象、接口或者其他对象、接口或者其他COMCOM元素。在元素。在C+C+中,中,GUIDGUID表现为结构体的形式,代码如下:表现为结构体的形式,代

28、码如下:typedef struct _GUID typedef struct _GUID DWORD Data1; DWORD Data1; WORD Data2; WORD Data2; WORD Data3; WORD Data3; BYTE Data48; BYTE Data48; GUID; GUID;参数说明如下:参数说明如下:pData1Data1,指定,指定8 8位位1616进制数。进制数。pData2Data2,指定第,指定第1 1组组4 4位位1616进制数。进制数。pData3Data3,指定第,指定第2 2组组4 4位位1616进制数。进制数。pData4Data4,8

29、 8个元素的字节数组。前个元素的字节数组。前2 2个字节包含第个字节包含第3 3组组4 4位位1616进制数,其余进制数,其余6 6个字节包含最后个字节包含最后1212位位1616进制数。进制数。For: 分类信息 From: 新闻3 3接口派生接口派生p每个每个COMCOM对象都必须从接口对象都必须从接口IUnknownIUnknown派生,因此每个派生,因此每个COMCOM对象都会继承接口对象都会继承接口IUnknownIUnknown的的QueryInterfaceQueryInterface()()、AddRef()AddRef()和和Release()Release()函数。下面

30、是接口函数。下面是接口IWbemLocatorIWbemLocator的定义。的定义。interface IWbemLocator : IUnknowninterface IWbemLocator : IUnknown HRESULT ConnectServer(BSTR strNetworkResource, HRESULT ConnectServer(BSTR strNetworkResource,BSTR strUser,BSTR strUser,BSTR strPassword,BSTR strPassword,BSTR strLocale,BSTR strLocale,long lS

31、ecurityFlags,long lSecurityFlags,BSTR strAuthority,BSTR strAuthority,IWbemContext* pCtx,IWbemContext* pCtx,IWbemServices* ppNameSpace);IWbemServices* ppNameSpace);p使用使用IWbemLocatorIWbemLocator接口可以获取指定计算机上接口可以获取指定计算机上WMIWMI的的IWbemServicesIWbemServices接口的初始命名空间,接口的初始命名空间,因此因此IWbemLocatorIWbemLocator对象

32、又被称为定位器对象。可以通过对象又被称为定位器对象。可以通过IWbemServicesIWbemServices接口访问接口访问WMIWMI服务。服务。pIWbemLocatorIWbemLocator接口包含接口包含4 4个函数,即个函数,即QueryInterface()QueryInterface()、AddRef()AddRef()、Release()Release()和和ConnectServerConnectServer()()。For: 分类信息 From: 新闻4 4创建创建COMCOM对象对象HRESULT CoCreateInstance(HRESULT CoCreat

33、eInstance( _in REFCLSID rclsid, _in REFCLSID rclsid, _in LPUNKNOWN pUnkOuter, _in LPUNKNOWN pUnkOuter, _in DWORD dwClsContext, _in DWORD dwClsContext, _in REFIID riid, _in REFIID riid, _out LPVOID *ppv _out LPVOID *ppv););For: 分类信息 From: 新闻【例【例12.3】p下面是创建下面是创建IWbemLocatorIWbemLocator对象的示例代码。对象的示例代

34、码。IWbemLocator* locator;IWbemLocator* locator;HRESULT hr = CoCreateInstance(CLSID_WbemLocator,HRESULT hr = CoCreateInstance(CLSID_WbemLocator, NULL, NULL, CLSCTX_INPROC_SERVER, CLSCTX_INPROC_SERVER, IID_IWbemLocator, IID_IWbemLocator, (PVOID*) &locator); (PVOID*) &locator);For: 分类信息 From: 新闻5 5销毁对

35、象销毁对象p每个每个COMCOM对象都有一个参考计数,当不再使用对象都有一个参考计数,当不再使用COMCOM对象时,应该调用对象时,应该调用Release()Release()函数函数减少其参考计数值。当计数值为减少其参考计数值。当计数值为0 0时,系统将删除该对象。时,系统将删除该对象。p【例【例12.412.4】下面是创建和销毁】下面是创建和销毁IWbemLocatorIWbemLocator对象的示例代码。对象的示例代码。IWbemLocator* locator;IWbemLocator* locator;HRESULT hr = CoCreateInstance(CLSID_Wbem

36、Locator,HRESULT hr = CoCreateInstance(CLSID_WbemLocator, NULL, NULL, CLSCTX_INPROC_SERVER, CLSCTX_INPROC_SERVER, IID_IWbemLocator, IID_IWbemLocator, (PVOID*) &locator); (PVOID*) &locator);if(SUCCEEDED(hr)if(SUCCEEDED(hr) / / 使用使用IWbemLocatorIWbemLocator对象对象hrhr locator-Release(); locator-Release();

37、For: 分类信息 From: 新闻12.2.212.2.2为为WMIWMI应用程序初始化应用程序初始化COMCOM环境环境 1 1为为WMIWMI应用程序初始化应用程序初始化COMCOM参数参数2 2初始化初始化COMCOM的安全级别的安全级别For: 分类信息 From: 新闻 1 1为为WMIWMI应用程序初始化应用程序初始化COMCOM参数参数p除了分配内存空间的函数外,应用程序在调用其他除了分配内存空间的函数外,应用程序在调用其他COMCOM库函数之前,必须库函数之前,必须首先要调用首先要调用CoInitializeEx()CoInitializeEx()函数。函数。CoIn

38、itializeEx()CoInitializeEx()函数的原型如下:函数的原型如下:HRESULT CoInitializeEx(HRESULT CoInitializeEx( LPVOID pvReserved, LPVOID pvReserved, DWORD dwCoInit DWORD dwCoInit););For: 分类信息 From: 新闻【例【例12.512.5】p下面是使用下面是使用CoInitializeEx()CoInitializeEx()函数初始化函数初始化COMCOM库的示例库的示例代码。代码。HRESULT hr;HRESULT hr;hr = CoIni

39、tializeEx(0, COINIT_MULTITHREADED); hr = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hr) if (FAILED(hr) cout Failed to initialize COM library. Error cout Failed to initialize COM library. Error code = 0xcode = 0x hex hr endl; hex hr endl; return hr; return hr; For: 分类信息 From: 新闻2 2初始化初始化CO

40、MCOM的安全级别的安全级别p如果需要修改默认的安全设置,可以调用如果需要修改默认的安全设置,可以调用CoInitializeSecurity()CoInitializeSecurity()函数。函数。CoInitializeSecurityCoInitializeSecurity()()函数的原型如下:函数的原型如下:HRESULT CoInitializeSecurity(HRESULT CoInitializeSecurity( PSECURITY_DESCRIPTOR pVoid, PSECURITY_DESCRIPTOR pVoid, LONG cAuthSvc, LONG cAut

41、hSvc, SOLE_AUTHENTICATION_SERVICE* asAuthSvc, SOLE_AUTHENTICATION_SERVICE* asAuthSvc, void* pReserved1, void* pReserved1, DWORD dwAuthnLevel, DWORD dwAuthnLevel, DWORD dwImpLevel, DWORD dwImpLevel, SOLE_AUTHENTICATION_LIST* pAuthList, SOLE_AUTHENTICATION_LIST* pAuthList, DWORD dwCapabilities, DWORD

42、dwCapabilities, void* pReserved3 void* pReserved3 ););For: 分类信息 From: 新闻【例【例12.612.6】p下面是使用下面是使用CoInitializeSecurity()CoInitializeSecurity()函数设置函数设置COMCOM安全级别的示例代码。安全级别的示例代码。hr = CoInitializeSecurity(hr = CoInitializeSecurity( NULL, NULL, / / 安全描述符安全描述符 -1, -1, / / 则则COMCOM来处理认证服务来处理认证服务 NULL, NUL

43、L, / / 认证服务数组认证服务数组 NULL, NULL, / / 保留保留 RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_AUTHN_LEVEL_DEFAULT, / / 代理的默认认证级别代理的默认认证级别 RPC_C_IMP_LEVEL_IMPERSONATE, RPC_C_IMP_LEVEL_IMPERSONATE, / / 代理的默认模拟级别代理的默认模拟级别 NULL, NULL, / / 认证信息认证信息 EOAC_NONE, EOAC_NONE, / / 客户端或者服务器的附加能力客户端或者服务器的附加能力 NULL); NULL); /保留保留if (

44、FAILED(hr)if (FAILED(hr) cout Failed to initialize security. Error code = 0x cout Failed to initialize security. Error code = 0x hex hr endl; hex hr endl; CoUninitialize(); CoUninitialize(); return hr; / Program has failed. return hr; / Program has failed. For: 分类信息 From: 新闻12.2.312.2.3获取到获取到WMIWM

45、I的的IWbemLocatorIWbemLocator对象对象p请求请求WMIWMI服务的客户端首先需要调用服务的客户端首先需要调用CoCreateInstance()CoCreateInstance()或或CoCreateInstanceExCoCreateInstanceEx()()函数获取函数获取IWbemLocatorIWbemLocator对象。对象。CoCreateInstance()CoCreateInstance()函数的原型函数的原型如下:如下:STDAPI CoCreateInstance(STDAPI CoCreateInstance( REFCLSID rclsid,

46、REFCLSID rclsid, LPUNKNOWN pUnkOuter, LPUNKNOWN pUnkOuter, DWORD dwClsContext, DWORD dwClsContext, REFIID riid, REFIID riid, LPVOID* ppv LPVOID* ppv););For: 分类信息 From: 新闻【例【例12.712.7】p下面是调用下面是调用CoCreateInstance()CoCreateInstance()函数初始化函数初始化IWbemLocatorIWbemLocator对象的示例代码。对象的示例代码。IWbemLocator *pLoc

47、 = 0; / IWbemLocator *pLoc = 0; / 获取的获取的IWbemLocatorIWbemLocator对象对象HRESULT hr;HRESULT hr;/ CLSID_WbemLocator/ CLSID_WbemLocator是一个是一个GUIDGUID,称为类标识符,它标识一种或一类,称为类标识符,它标识一种或一类COMCOM对象对象/ CLSCTX_INPROC_SERVER/ CLSCTX_INPROC_SERVER指定管理对象的服务器类型指定管理对象的服务器类型hr = CoCreateInstance(CLSID_WbemLocator, 0, hr =

48、 CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hr)if (FAILED(hr) cout Failed to create IWbemLocator object. Err code = 0x cout Failed to create IWbemLocator object. Err code = 0x

49、 hex hr endl; hex hr ConnectServer( hres = pLoc-ConnectServer( _bstr_t(LCOMPUTERNAMErootcimv2), _bstr_t(LCOMPUTERNAMErootcimv2), _bstr_t(useToken?NULL:pszName), / _bstr_t(useToken?NULL:pszName), / 用户名用户名 _bstr_t(useToken?NULL:pszPwd), / _bstr_t(useToken?NULL:pszPwd), / 密码密码 NULL, / NULL, / 地域地域 NULL

50、, / NULL, / 安全标识安全标识 _bstr_t(useNTLM?NULL:pszAuthority), / Authority _bstr_t(useNTLM?NULL:pszAuthority), / Authority NULL, / NULL, / 上下文对象上下文对象 &pSvc / IWbemServices &pSvc / IWbemServices代理代理 ); ); if (FAILED(hres) if (FAILED(hres) cout Could not connect. Error code = 0x cout Could not connect. Erro

51、r code = 0x hex hres endl; hex hres Release(); pLoc-Release(); CoUninitialize(); CoUninitialize(); return 1; / Program has failed. return 1; / Program has failed. For: 分类信息 From: 新闻12.2.512.2.5设置设置WMIWMI连接的安全属性连接的安全属性HRESULT CoSetProxyBlanket(HRESULT CoSetProxyBlanket( _in IUnknown *pProxy, _in IU

52、nknown *pProxy, _in DWORD dwAuthnSvc, _in DWORD dwAuthnSvc, _in DWORD dwAuthzSvc, _in DWORD dwAuthzSvc, _in_opt OLECHAR *pServerPrincName, _in_opt OLECHAR *pServerPrincName, _in DWORD dwAuthnLevel, _in DWORD dwAuthnLevel, _in DWORD dwImpLevel, _in DWORD dwImpLevel, _in_opt RPC_AUTH_IDENTITY_HANDLE p

53、AuthInfo, _in_opt RPC_AUTH_IDENTITY_HANDLE pAuthInfo, _in DWORD dwCapabilities _in DWORD dwCapabilities);); For: 分类信息 From: 新闻12.2.612.2.6执行查询操作执行查询操作HRESULT ExecQuery(HRESULT ExecQuery( const BSTR strQueryLanguage, const BSTR strQueryLanguage, const BSTR strQuery, const BSTR strQuery, LONG lFlags

54、, LONG lFlags, IWbemContext* pCtx, IWbemContext* pCtx, IEnumWbemClassObject* ppEnum IEnumWbemClassObject* ppEnum););For: 分类信息 From: 新闻Next()Next()函数函数HRESULT Next(HRESULT Next( LONG lTimeOut, LONG lTimeOut, ULONG uCount, ULONG uCount, IWbemClassObject* ppObjects, IWbemClassObject* ppObjects, ULONG

55、* puReturned ULONG* puReturned););For: 分类信息 From: 新闻IWbemClassObject:Get()IWbemClassObject:Get()函数函数pIWbemClassObjectIWbemClassObject对象相当于查询结果中的一条记录,调用对象相当于查询结果中的一条记录,调用IWbemClassObject:GetIWbemClassObject:Get()()函数可以获取记录中每个字段的值,函数原型如下:函数可以获取记录中每个字段的值,函数原型如下:HRESULT Get(HRESULT Get( LPCWSTR wszNam

56、e, LPCWSTR wszName, LONG lFlags, LONG lFlags, VARIANT* pVal, VARIANT* pVal, CIMTYPE* pvtType, CIMTYPE* pvtType, LONG* plFlavor LONG* plFlavor););For: 分类信息 From: 新闻【例【例12.912.9】p下面是调用下面是调用WQLWQL语句获取本地计算机语句获取本地计算机BIOSBIOS信息的示例代码。信息的示例代码。pSvcpSvc是已经连接到是已经连接到WMIWMI实实例、并且已经设置了安全属性的例、并且已经设置了安全属性的IWbemSe

57、rvicesIWbemServices对象。对象。IWbemServices *pSvc;IWbemServices *pSvc;/ / 用于连接用于连接WMIWMIIWbemLocator *pLoc;IWbemLocator *pLoc;/ / 定位器定位器HRESULT hres;HRESULT hres;pSvc = NULL;pSvc = NULL; pLoc = NULL; pLoc = NULL;/ 1. / 1. 初始化初始化COMCOMhres = CoInitializeEx(0, COINIT_MULTITHREADED);hres = CoInitializeEx(0,

58、 COINIT_MULTITHREADED);if(FAILED(hres)if(FAILED(hres) printf(printf(初始化初始化COMCOM库失败!库失败!););return false;return false; For: 分类信息 From: 新闻接上接上/ 2. / 2. 设置安全级别设置安全级别 hres = CoInitializeSecurity( hres = CoInitializeSecurity( NULL, NULL, -1, -1,/ COM/ COM身份认证身份认证 NULL, NULL,/ / 认证服务器认证服务器 NULL, NULL,/

59、 / 保留保留 RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_AUTHN_LEVEL_DEFAULT,/ / 默认认证方式默认认证方式 RPC_C_IMP_LEVEL_IMPERSONATE, / RPC_C_IMP_LEVEL_IMPERSONATE, / 默认模拟级别默认模拟级别 NULL, NULL,/ / 认证信息认证信息 EOAC_NONE, EOAC_NONE,/ / 附加能力附加能力 NULL NULL/ / 保留保留 ); ); For: 分类信息 From: 新闻接上接上 if (FAILED(hres) & hres!= RPC_E_TOO_LATE

60、) if (FAILED(hres) & hres!= RPC_E_TOO_LATE) printf(printf(初始化安全级别失败!初始化安全级别失败!);); CoUninitialize(); CoUninitialize(); /return false; /return false; exit(0);exit(0); / 3. / 3. 获取获取WMIWMI的定位器的定位器 hres = CoCreateInstance( hres = CoCreateInstance( CLSID_WbemLocator, CLSID_WbemLocator, 0, 0, CLSCTX_INPR

61、OC_SERVER, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres) if (FAILED(hres) printf(printf(创建创建IWbemLocatorIWbemLocator对象失败!对象失败!);); CoUninitialize(); CoUninitialize(); /return false; /return false; exit(0);exit(0); For: 分类信息 From: 新

62、闻接上接上 / 4. / 4. 连接到连接到WMIWMI pSvc = NULL; pSvc = NULL;hres = pLoc-ConnectServer(hres = pLoc-ConnectServer(_bstr_t(rootcimv2),_bstr_t(rootcimv2), / WMI/ WMI命名空间的对象路径命名空间的对象路径NULL,NULL,/ / 用户名用户名NULL,NULL,/ / 密码密码 0, 0,/ / 地域地域 NULL, NULL,/ / 安全标识安全标识 0, 0,/ / 授权授权 0, 0,/ / 上下文对象上下文对象 &pSvc &pSvc/ / 指

63、向指向IWbemServicesIWbemServices代理的代理的指针指针 ); ); IEnumWbemClassObject* pEnumerator = NULL;IEnumWbemClassObject* pEnumerator = NULL;For: 分类信息 From: 新闻接上接上/ / 执行执行WQLWQL查询查询HRESULT hr = pSvc-ExecQuery(HRESULT hr = pSvc-ExecQuery( bstr_t(WQL), bstr_t(WQL), bstr_t(Select * FROM Win32_BIOS), bstr_t(Select

64、 * FROM Win32_BIOS), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, NULL, &pEnumerator &pEnumerator ); );/ / 如果执行失败,则释放资源,并返回如果执行失败,则释放资源,并返回if (FAILED(hr)if (FAILED(hr) pSvc-Release(); pSvc-Release(); pLoc-Release(); pLoc-Release(

65、); CoUninitialize(); CoUninitialize(); return FALSE; return FALSE; / / 遍历遍历IEnumWbemClassObjectIEnumWbemClassObject,输出信息,输出信息IWbemClassObject *pclsObj=NULL;IWbemClassObject *pclsObj=NULL;For: 分类信息 From: 新闻接上接上while (pEnumerator)while (pEnumerator) ULONG uReturn = 0; ULONG uReturn = 0; hr = pEnumer

66、ator-Next( hr = pEnumerator-Next( WBEM_INFINITE, WBEM_INFINITE, 1, 1, &pclsObj, &pclsObj, &uReturn &uReturn ); ); if(0 = uReturn) if(0 = uReturn) break; break;/ / 获取字段的值获取字段的值 VARIANT vtProp; VARIANT vtProp; hr = pclsObj-Get(LName, 0, &vtProp, 0, 0); hr = pclsObj-Get(LName, 0, &vtProp, 0, 0);std:cou

67、t Name: _com_util:ConvertBSTRToString(vtProp.bstrVal) std:cout Name: _com_util:ConvertBSTRToString(vtProp.bstrVal) Get(LManufacturer, 0, &vtProp, 0, 0);hr = pclsObj-Get(LManufacturer, 0, &vtProp, 0, 0); std:cout Manufacturer: _com_util:ConvertBSTRToString(vtProp.bstrVal) std:cout Manufacturer: _com_

68、util:ConvertBSTRToString(vtProp.bstrVal) Get(LVersion, 0, &vtProp, 0, 0); hr = pclsObj-Get(LVersion, 0, &vtProp, 0, 0); std:cout Version: _com_util:ConvertBSTRToString(vtProp.bstrVal) std:cout Version: _com_util:ConvertBSTRToString(vtProp.bstrVal) Get(LCurrentLanguage, 0, &vtProp, 0, 0); hr = pclsOb

69、j-Get(LCurrentLanguage, 0, &vtProp, 0, 0); std:cout CurrentLanguage: _com_util:ConvertBSTRToString( vtProp.bstrVal) std:cout CurrentLanguage: _com_util:ConvertBSTRToString( vtProp.bstrVal) std:endl;Release(); pclsObj-Release(); if (pEnumerator!=NULL)if (pEnumerator!=NULL) pEnumerator-Release(); pEnu

70、merator-Release(); / / 释放资源释放资源pSvc-Release();pSvc-Release();pLoc-Release();pLoc-Release();CoUninitialize();CoUninitialize();For: 分类信息 From: 新闻【例例12.912.9】的运行结果的运行结果For: 分类信息 From: 新闻12.2.712.2.7执行执行CIMCIM类的方法类的方法p调用调用IWbemServices:ExecMethod()IWbemServices:ExecMethod()函数可以执行函数可以执行CIMCIM类上的指定方法,

71、函类上的指定方法,函数原型如下:数原型如下:HRESULT ExecMethod(HRESULT ExecMethod( in const BSTR strObjectPath, in const BSTR strObjectPath, in const BSTR strMethodName, in const BSTR strMethodName, in long lFlags, in long lFlags, in IWbemContext *pCtx, in IWbemContext *pCtx, in IWbemClassObject *pInParams, in IWbemClass

72、Object *pInParams, out IWbemClassObject *ppOutParams, out IWbemClassObject *ppOutParams, out IWbemCallResult *ppCallResult out IWbemCallResult *ppCallResult););For: 分类信息 From: 新闻【例【例12.1012.10】p下面是调用下面是调用ExecMethod()ExecMethod()函数在指定计算机上创建进程的示例代码。函数在指定计算机上创建进程的示例代码。pSvcpSvc是已经连是已经连接到接到WMIWMI实例、并且已

73、经设置了安全属性的实例、并且已经设置了安全属性的IWbemServicesIWbemServices对象。对象。/ / 设置调用设置调用Win32_Process:CreateWin32_Process:Create方法方法BSTR MethodName = SysAllocString(LCreate);BSTR MethodName = SysAllocString(LCreate);BSTR ClassName = SysAllocString(LWin32_Process);BSTR ClassName = SysAllocString(LWin32_Process);/ pClass

74、/ pClass用于获取类定义和类实例的对象用于获取类定义和类实例的对象IWbemClassObject* pClass = NULL;IWbemClassObject* pClass = NULL;/ / 获取获取Win32_ProcessWin32_Process类对应的类对应的IWbemClassObjectIWbemClassObject对象对象hres = pSvc-GetObject(ClassName, 0, NULL, &pClass, NULL);hres = pSvc-GetObject(ClassName, 0, NULL, &pClass, NULL);/ / 获取获取

75、CreateCreate方法对应的定义和实例对象到方法对应的定义和实例对象到pInParamsDefinitionpInParamsDefinitionIWbemClassObject* pInParamsDefinition = NULL;IWbemClassObject* pInParamsDefinition = NULL;hres = pClass-GetMethod(MethodName, 0, &pInParamsDefinition, NULL);hres = pClass-GetMethod(MethodName, 0, &pInParamsDefinition, NULL);

76、/ / 生成当前类的派生类实例生成当前类的派生类实例IWbemClassObject* pClassInstance = NULL;IWbemClassObject* pClassInstance = NULL;hres = pInParamsDefinition-SpawnInstance(0, &pClassInstance);hres = pInParamsDefinition-SpawnInstance(0, &pClassInstance);/ / 创建输入参数值,这里指定要创建的进程为创建输入参数值,这里指定要创建的进程为notepad.exenotepad.exeVARIANT

77、varCommand;VARIANT varCommand;varCommand.vt = VT_BSTR;varCommand.vt = VT_BSTR;varCommand.bstrVal = Lnotepad.exe;varCommand.bstrVal = Lnotepad.exe;For: 分类信息 From: 新闻接上接上/ / 保存输入参数值保存输入参数值hres = pClassInstance-Put(LCommandLine, 0, &varCommand, hres = pClassInstance-Put(LCommandLine, 0, &varCommand,

78、0);0);wprintf(LThe command is: %sn, V_BSTR(&varCommand);wprintf(LThe command is: %sn, V_BSTR(&varCommand);/ / 执行方法执行方法IWbemClassObject* pOutParams = NULL;IWbemClassObject* pOutParams = NULL;hres = pSvc-ExecMethod(ClassName, MethodName, 0,hres = pSvc-ExecMethod(ClassName, MethodName, 0, NULL, pClassI

79、nstance, &pOutParams, NULL); NULL, pClassInstance, &pOutParams, NULL);/ / 获取执行获取执行CreateCreate方法的返回值方法的返回值VARIANT varReturnValue;VARIANT varReturnValue;hres = pOutParams-Get(_bstr_t(LReturnValue), 0, hres = pOutParams-Get(_bstr_t(LReturnValue), 0, &varReturnValue, NULL, 0); &varReturnValue, NULL, 0);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号