WMIC:从命令行对Windows的全面管理

转自:http://tech.ddvip.com

从Windows 2000开始,WMI(Windows 管理规范)就是Windows系统管理的重要组成部分。WMIC是Windows Management Instrumentation Command-line的简称,在WMIC出现之前,要从命令行访问WMI数据库或WMI名称空间不是一件容易的事情。现在,WMIC利用WMI强大的功能把系统管理扩展到了命令行。

  一、什么是WMIC?

  WMIC扩展WMI,提供了从命令行接口和批命令脚本执行系统管理的支持。在WMIC出现之前,如果要管理WMI系统,必须使用一些专门的WMI应用,例如SMS,或者使用WMI的脚本编程API,或者使用象CIM Studio之类的工具。如果不熟悉C++之类的编成语言或VBScript之类的脚本语言,或者不掌握WMI名称空间的基本知识,要用WMI管理系统是很困难的。WMIC改变了这种情况,为WMI名称空间提供了一个强大的、友好的命令行接口。

  WMIC比WMI简单、直观得多,这主要是由于使用了别名(Alias)。别名机制获取用户在命令行上输入的一些简单命令,按照预定义的方式操作WMI名称空间,例如根据一个简单的WMIC别名Get命令构造出一个复杂的WMI查询语言(WQL)命令。从这个意义上看,别名是用户和名称空间之间一个简化操作的中间层。例如,如果在WMIC命令行上执行下面这个简单的WMIC命令,就可以获得用户帐户的基本信息:

useraccount list brief

  在上面的命令中,Useraccount别名执行了一个Win32_Useraccount类的WQL查询,以文本的形式显示出从该类提取的信息。另外,WMIC还以文本的形式显示出Win32_Useraccount类的属性。除了文本形式的输出之外,WMIC还能够以其他形式返回命令执行结果,例如XML、HTML或者CSV(逗号分隔的文本文件)。

  WMIC以WMI模式中类的实例的形式保存别名。默认的别名类——MSFT_CliAlias,以及其他支持WMIC的类保存在模式的默认名称空间,或者说rootcli角色。角色可以简单地看成专门用来支持WMIC的另一个WMI名称空间。默认角色rootcli连接到rootcimv2名称空间,操作rootcimv2之内的类。虽然使用WMIC时一般不需要用到CIM Studio,但CIM Studio可以用来方便地查看rootcli名称空间。例如,图一显示了rootcli节点以及MSFT_CliAlias类的一些属性。

  你可以向rootcli名称空间和其他名称空间加入新的别名,还可以用Class和Path命令直接访问WMI名称空间,本文后面将详细说明Class和Path命令。

  二、运行WMIC

  执行“wmic”命令启动WMIC命令行环境。这个命令可以在XP或.NET Server的标准命令行解释器(cmd.exe)、Telnet会话或“运行”对话框中执行。这些启动方法可以在本地使用,也可以通过.NET Server终端服务会话使用。

  第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符。在WMIC命令行提示符上,命令以交互的方式执行。例如,执行下面的命令将关闭正在运行的Outlook:

process where name='outlook.exe' call terminate

  命令运行结束后,WMIC命令行提示符重新出现,如图二所示。每个命令必须在一行之内输入,中间不能插入换行符。

  WMIC也可以按照非交互的模式运行。如果要执行某个单步的任务,或者运行批命令中的一系列WMIC命令,非交互模式就很有用。要使用非交互模式,只要在同一个命令行上启动WMIC并输入要执行的命令就可以了。例如,执行cmd.exe打开一个命令行窗口,然后执行下面的命令,就可以输出连接到MACHINE1的打印机清单:

wmic /node:MACHINE1 printer list status

  在这个例子中,第一个操作是启动WMIC,然后是根据/node参数建立一个到MACHINE1的远程连接,最后执行一个WMIC命令显示出打印机状态信息。命令运行结束后,返回到Windows命令行提示符状态。

  安装了WMIC的机器可以连接到任何一台安装了WMI的机器,被连接的机器不需要安装WMIC。例如,从一台运行Win XP Pro的机器启动WMIC,可以连接和管理所有运行着XP、Win2K、Windows NT 4.0、Windows Me和Windows 9x的机器。

  三、WMIC命令行构成

  WMIC提供了大量的全局开关、别名、动词、命令和丰富的命令行帮助增强用户接口。全局开关是适用于整个WMIC会话的配置选项。例如,/trace:on开关启用错误跟踪机制,如果这个开关处于打开状态,WMIC返回每一个命令的错误信息。利用/note开关可以访问远程机器,/interactive:on开关要求WMIC在执行删除操作之前提示确认,其他的全局开关还包括/role、/user、/implevel以及/namespace。

  如前所述,别名是用户和WMI名称空间一个简化语法的中间层。当你指定一个别名时,动词(Verb)表示要执行的动作。例如,前面例子中的List和Call就是两个动词的例子。表一描述了其他一些WMIC动词,并为每一个动词给出了例子。

  

表一:WMIC动词
动词 例子 说明
Assoc group where name= ‘administrators’ assoc 显示出Administrators组与系统的所有关联,包括Administrators组成员等。又如,os assoc显示出有关操作系统的信息和已经安装的补丁。
Create environment create name="progloc", username="work01User1",variablevalue= "%programfiles%prog01" 创建一个名字为Progloc的变量,把它的值设置为Program Files文件夹的一个子文件夹,把这个变量加入到Work01工作组计算机User1帐户。
Delete environment where(name= "progloc") delete 删除Progloc环境变量。测试WMIC命令时,为了防止意外地删除,可以使用/interactive:on全局开关,这时删除之前会要求确认。
Get partition get bootpartition, content:encoded, deviceid, bootable 返回分区是否可启动、描述信息和设备ID属性等信息。
Set path WIN32_USERACCOUNT where(name="user01") set disabled="true" 在成员服务器或工作站上禁用User01用户帐户。

  命令用来控制对WMIC和WMI名称空间的访问。注意表一的最后一个例子,这个例子用的是Path和Win32_USERACCOUNT类,而不是Useraccount别名。Path是一个直接访问WMI名称空间中实例的命令,不必再通过别名访问。如果待执行的系统管理任务没有现成的别名可用,Path命令特别有用。虽然你可以用新的别名和角色扩展WMIC,但如果你对WMI名称空间比较熟悉,使用Path命令也很方便。

  除了Path命令之外,WMIC还支持Class、Context、Quit和Exit命令。Class命令用来直接访问WMI模式内的类或创建现有类的实例。Class命令和Path命令的不同之处在于,Path命令的作用对象是实例以及它的属性(例如,提取管理用的信息),而Class命令的作用对象是类的定义。例如,如果要提取出WIN32_SOFTWAREELEMENT类的所有属性,可以执行如下命令:

class WIN32_SOFTWAREELEMENT get

  这个命令的输出是HTML格式,稍后我们将了解如何用/output全局开关把输出重定向到可用浏览器打开的HTML文件。Class命令加上Assoc动词能够显示出类的名称空间路径以及其他与该类关联的类。利用Class命令可以删除类、创建类的实例,但不能创建类。

  Context命令显示出全局开关的当前设置。Quit和Exit命令用来退出WMIC命令提示符环境,返回以前的Shell环境(例如Telnet环境,或XP的命令行提示符环境)。

  命令行帮助是熟悉WMIC的有效途径。表二是在WMIC提示符下查找信息的常用命令:

  

表二:命令行帮助
命令 例子 说明
/? 或 -?   显示所有全局开关和别名的语法
/ /? /user /? 显示指定全局开关的信息
/? class /? 显示某个命令的信息
/? memcache /? 显示某个别名的信息
/? temperature get /? 显示别名与动词组合的信息
/?:Full irq get /?:Full 显示动词的帮助信息

  四、实践应用

  以上我们了解了WMIC命令行环境的基础知识,下面来看看如何用批命令运行WMIC,以及把输出结果定向到控制台或HTML、XML文件。从批命令文件运行WMIC的好处在于不需要重复输入一系列复杂的命令,例如,下面是一个批命令文件的内容,它的作用是显示出MACHINE1和MACHINE2这两台机器的CPU信息,输出结果显示在控制台上。/format开关是面向动词的开关,而不是全局开关,它只用于Get和List动词。

wmic /node:MACHINE1, MACHINE4 cpu get name, caption,
maxclockspeed, systemname /format:textvaluelist.xsl

  WMIC批命令可以使用变量。也就是说,对于上面的批命令,服务器的名字不仅可以直接指定,而且还可以通过%1、%2的形式指定,下面就是一个例子。把下面的代码放入一个批命令文件,然后在执行批命令文件时加上一到二个机器的名字即可;另外,也可以创建一个独立的文本文件,然后在文本文件中放入机器名字的清单,清单可以是CSV格式,或用换行符分隔的格式。如果使用独立的文本文件提供机器名字,只需在/node全局开关后面加上以@符号为前缀的文本文件名字,@符号告诉/node开关后面的参数是一个文件名字而不是机器名字。

@echo off if "%1"==""
goto msg if "%2"==""
goto single wmic /node:%1, %2 cpu get name, caption, maxclockspeed, systemname
/format:textvaluelist.xsl goto end :single wmic /node:%1 cpu get name, caption, maxclockspeed,
systemname /format:textvaluelist.xsl goto end :msg echo 必须指定至少一台计算机的名字。 :end

  如前所述,WMIC命令的输出结果不仅可以发送到控制台,还可以发送到XML或HTML、MOF(Managed Object Format)格式的文件。在安装了WMI的计算机上,MOF是WMI数据库中类和类实例的原始保存形式。下面的例子显示了如何把MACHINE4处理器信息的查询结果输出到HTML文件,/output全局开关要求WMIC把输出发送到file1.htm,/format开关要求WMIC把原始的XML输出转换成HTML格式。用来转换格式的XSL样式文件既可以是自定义的,也可以是任何安装了WMIC的机器上%systemroot%system32wbem文件夹下面的任意XSL文件。例如,利用csv.xsl样式文件可以把输出结果转换成CSV格式,利用htable.xsl样式可以构造出一个包含结果数据的表格。图三是在浏览器中打开的file1.htm文件。

wmic /node:MACHINE4 /output:e:file1.htm cpu get content:encoded,
maxclockspeed, extclock, manufacturer,
revision /format:hform.xsl

  前面已经提到,Class命令加上Get动词的默认输出是HTML格式。因此,如果要把这类命令的输出结果保存到HTML文件,只需指定/output开关,不必加上/format开关。/record和/append全局开关也能够从WMIC命令行截取信息,请利用WMIC的命令行帮助功能了解有关这些开关的更多信息。

  如果要以XML格式输出,用/translate开关和Basicxml关键词把大于符号“>”和小于符号“<”转换成XML中有意义的字符。下面是输出XML的一个例子,输出的XML数据可导入到数据库或其他能够理解XML标记的系统。下面代码的输出中包含了WMIC命令、命令行请求参数、目标节点、全局开关以及命令执行结果。

wmic cpu get maxclockspeed /translate:basicxml /format:rawxml.xsl

  总之,WMIC是XP和.NET Server中命令行管理功能的一次重要改进,对于从命令行访问和管理WMI名称空间提供了强健的支持。虽然掌握和熟悉WMIC命令行环境需要一段时间,但只要你熟悉了它,一个系统管理的全新境界将展现在你的面前。 

Win32_SoftwareElement Class (Windows)

Win32_SoftwareElement Class
The Win32_SoftwareElement WMI class represents a software element, part of a software feature (a distinct subset of a product which may contain one or more elements). Each software element is defined in a Win32_SoftwareElement instance, and the association between a feature and its Win32_SoftwareFeature instance is defined in the Win32_SoftwareFeatureSoftwareElements association class.
Note For more information about support or requirements for installation on a specific operating system, see Operating System Availability of WMI Components.
The following syntax is simplified from Managed Object Format (MOF) code and includes all inherited properties. Properties and methods are in alphabetic order, not MOF order.

class Win32_SoftwareElement : CIM_SoftwareElement
{
uint16 Attributes;
string BuildNumber;
string Caption;
string CodeSet;
string content:encoded;
string IdentificationCode;
datetime InstallDate;
sint16 InstallState;
string LanguageEdition;
string Manufacturer;
string Name;
string OtherTargetOS;
string Path;
string SerialNumber;
string SoftwareElementID;
uint16 SoftwareElementState;
string Status;
uint16 TargetOperatingSystem;
string Version;
};
Methods
The Win32_SoftwareElement class does not define any methods.
Properties
The Win32_SoftwareElement class has the following properties.
Attributes
Data type: uint16
Access type: Read-only
Bitmap that contains the remote execution options for the software element.
BuildNumber
Data type: string
Access type: Read-only
Number of the build.
Caption
Data type: string
Access type: Read-only
Short textual content:encoded (one-line string) of the object.
CodeSet
Data type: string
Access type: Read-only
Code set used by the software element.
content:encoded
Data type: string
Access type: Read-only
content:encoded of the object.
IdentificationCode
Data type: string
Access type: Read-only
Manufacturer??s identifier for this software element. Often this is a stock keeping unit (SKU) or part number.
InstallDate
Data type: datetime
Access type: Read-only
Object was installed. This property does not need a value to indicate that the object is installed.
InstallState
Data type: sint16
Access type: Read-only
Current installed state for the software element.
ValueMeaning
-7Not Used
-6Bad Configuration
-4Source Absent
-1Error
2Absent
3Local
4Source

LanguageEdition
Data type: string
Access type: Read-only
Language edition of this software element. The language codes defined in ISO 639 should be used. Where the software element represents multi-lingual or international version of a product, the string multilingual should be used.
Manufacturer
Data type: string
Access type: Read-only
Manufacturer of the software element.
Name
Data type: string
Access type: Read-only
Name used to identify the software element.
OtherTargetOS
Data type: string
Access type: Read-only
Records the manufacturer and operating system type for a software element when the TargetOperatingSystem property has a value of 1 (Other). When TargetOperatingSystem has a value of 1, OtherTargetOS must have a non-null value. For all other values of TargetOperatingSystem, OtherTargetOS is NULL.
Path
Data type: string
Access type: Read-only
Path to the installed software element. If the component is a registry key, the registry roots are represented numerically. For example, a registry path of
HKEY_CURRENT_USER
SOFTWARE
Microsoft
would be returned as 01:SOFTWAREMicrosoft. The registry roots returned are defined as follows: ValueMeaning
00HKEY_CLASSES_ROOT
01HKEY_CURRENT_USER
02HKEY_LOCAL_MACHINE
03HKEY_USERS

SerialNumber
Data type: string
Access type: Read-only
Assigned serial number of the software element.
SoftwareElementID
Data type: string
Access type: Read-only
Identifier for the software element and is designed to be used in conjunction with other keys to create a unique representation of this Win32_SoftwareElement instance.
SoftwareElementState
Data type: uint16
Access type: Read-only
Various states of a software element??s life cycle. A software element in the deployable state describes the details necessary to successful distribute it and the details (conditions and actions) required to create a software element in the installable state (that is, the next state). A software element in the installable state describes the details necessary to successfully install it and details conditions and actions required to create a software element in the executable state (that is, the next state). A software element in the executable state describes the details necessary to successfully start it and details conditions and actions required to create a software element in the running state (that is, the next state). A software element in the running state describes the details necessary to monitor and operate on a start element.
ValueMeaning
1Deployable
2Installable
3Executable
4Running

Status
Data type: string
Access type: Read-only
Current status of the object. Various operational and non-operational statuses can be defined. Operational statuses include: OK, Degraded, and Pred Fail (an element, such as a SMART-enabled hard drive, can function properly but predict a failure in the near future). Non-operational statuses include: Error, Starting, Stopping, and Service. Examples of Service could apply during mirror-resilvering of a disk, reload of a user permissions list, or other administrative work. Not all such work is on-line, yet the managed element is neither OK nor in one of the other states.
Values are:
"OK"

"Error"

"Degraded"

"Unknown"

"Pred Fail"

"Starting"

"Stopping"

"Service"

TargetOperatingSystem
Data type: uint16
Access type: Read-only
Provider??s choice of operating system environment. The value of this property does not ensure binary executable. Two other pieces of information are needed. First, the version of the OS must be specified using the OS version check. The second piece of information is the architecture the OS runs on. The combination of these constructs allows the provider to clearly identify the level of OS required for a particular software element. The possible values for this property are as follows.
ValueMeaning
0Unknown
1Other
2MACOS
3ATTUNIX
4DGUX
5DECNT
6Digital Unix
7OpenVMS
8HPUX
9AIX
10MVS
11OS400
12OS/2
13JavaVM
14MSDOS
15WIN3x
16WIN95
17WIN98
18WINNT
19XP
20NCR3000
21NetWare
22OSF
23DC/OS
24Reliant UNIX
25SCO UnixWare
26SCO OpenServer
27Sequent
28IRIX
29Solaris
30SunOS
31U6000
32ASERIES
33TandemNSK
34TandemNT
35BS2000
36LINUX
37Lynx
38XENIX
39VM/ESA
40Interactive UNIX
41BSDUNIX
42FreeBSD
43NetBSD
44GNU Hurd
45OS9
46MACH Kernel
47Inferno
48QNX
49EPOC
50IxWorks
51VxWorks
52MiNT
53BeOS
54HP MPE
55NextStep
56PalmPilot
57Rhapsody

Version
Data type: string
Access type: Read-only
Version of the software element. Values should be in the form [Major].[Minor].[Revision] or [Major].[Minor][l
etter][revision].
Remarks
Any component can be shared between two or more Win32_SoftwareFeature instances. If two or more features reference the same component, that component is selected for installation if any of these features are selected.
The Win32_SoftwareElement class is derived from CIM_SoftwareElement.
Example Code
For script code examples, see WMI Tasks for Scripts and Applications and the TechNet ScriptCenter Script Repository.
For C++ code examples, see WMI C++ Application Examples.
Requirements
ClientRequires Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0 SP4 and later.
ServerRequires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0 SP4 and later.
MOFDeclared in Msi.mof.
DLLRequires Msiprov.dll.
NamespaceDefined in rootcimv2.

See Also
Installed Applications Classes

本文转自
http://msdn2.microsoft.com/en-us/library/aa394453(VS.85).aspx

所有的WMI可以使用的class

知道这些类名之后,写一个最简单的应用,是可以知道系统的全部硬件、软件信息。比如说CPUID,主板序列号,硬盘出厂的ID号,CPU速度,网卡号等。
Computer system hardware
Cooling device classes
Win32_Fan
Win32_HeatPipe
Win32_Refrigeration
Win32_TemperatureProbe)}
Input device classes
Win32_Keyboard
Win32_PointingDevice)}
Mass storage classes
Win32_AutochkSetting
Win32_CDROMDrive
Win32_DiskDrive
Win32_FloppyDrive
Win32_LogicalDisk
Win32_MappedLogicalDisk
Win32_TapeDrive)}
Motherboard, controller, and port classes
Win32_1394Controller
Win32_1394ControllerDevice
Win32_AllocatedResource
Win32_AssociatedProcessorMemory
Win32_BaseBoard
Win32_BIOS
Win32_Bus
Win32_CacheMemory
Win32_ControllerHasHub
Win32_DeviceBus
Win32_DeviceMemoryAddress
Win32_DeviceSettings
Win32_DMAChannel
Win32_FloppyController
Win32_IDEController
Win32_IDEControllerDevice
Win32_InfraredDevice
Win32_IRQResource
Win32_MemoryArray
Win32_MemoryArrayLocation
Win32_MemoryDevice
Win32_MemoryDeviceArray
Win32_MemoryDeviceLocation
Win32_MotherboardDevice
Win32_OnBoardDevice
Win32_ParallelPort
Win32_PCMCIAController
Win32_PhysicalMemory
Win32_PhysicalMemoryArray
Win32_PhysicalMemoryLocation
Win32_PNPAllocatedResource
Win32_PNPDevice
Win32_PNPEntity
Win32_PortConnector
Win32_PortResource
Win32_Processor
Win32_SCSIController
Win32_SCSIControllerDevice
Win32_SerialPort
Win32_SerialPortConfiguration
Win32_SerialPortSetting
Win32_SMBIOSMemory
Win32_SoundDevice
Win32_SystemBIOS
Win32_SystemDriverPNPEntity
Win32_SystemEnclosure
Win32_SystemMemoryResource
Win32_SystemSlot
Win32_USBController
Win32_USBControllerDevice
Win32_USBHub)}
Networking device classes
Win32_NetworkAdapter
Win32_NetworkAdapterConfiguration
Win32_NetworkAdapterSetting)}
Power classes
Win32_AssociatedBattery
Win32_Battery
Win32_CurrentProbe
Win32_PortableBattery
Win32_PowerManagementEvent
Win32_UninterruptiblePowerSupply
Win32_VoltageProbe)}
Printing classes
Win32_DriverForDevice
Win32_Printer
Win32_PrinterConfiguration
Win32_PrinterController
Win32_PrinterDriver
Win32_PrinterDriverDll
Win32_PrinterSetting
Win32_PrintJob
Win32_TCPIPPrinterPort)}
Telephony classes
Win32_POTSModem
Win32_POTSModemToSerialPort)}
Video and monitor classes
Win32_DesktopMonitor
Win32_DisplayConfiguration
Win32_DisplayControllerConfiguration
Win32_VideoConfiguration
Win32_VideoController
Win32_VideoSettings)})}
Users
COM
Win32_ClassicCOMApplicationClasses
Win32_ClassicCOMClass
Win32_ClassicCOMClassSettings
Win32_ClientApplicationSetting
Win32_COMApplication
Win32_COMApplicationClasses
Win32_COMApplicationSettings
Win32_COMClass
Win32_ComClassAutoEmulator
Win32_ComClassEmulator
Win32_ComponentCategory
Win32_COMSetting
Win32_DCOMApplication
Win32_DCOMApplicationAccessAllowedSetting
Win32_DCOMApplicationLaunchAllowedSetting
Win32_DCOMApplicationSetting
Win32_ImplementedCategory)}
Desktop
Win32_Desktop
Win32_Environment
Win32_TimeZone
Win32_UserDesktop)}
Drivers
Win32_DriverVXD
Win32_SystemDriver)}
File system
Win32_CIMLogicalDeviceCIMDataFile
Win32_Directory
Win32_DirectorySpecification
Win32_DiskDriveToDiskPartition
Win32_DiskPartition
Win32_DiskQuota
Win32_LogicalDiskRootDirectory
Win32_LogicalDiskToPartition
Win32_OperatingSystemAutochkSetting
Win32_QuotaSetting
Win32_ShortcutFile
Win32_SubDirectory
Win32_SystemPartitions
Win32_VolumeQuotaSetting)}
Job objects
Win32_CollectionStatistics
Win32_LUID
Win32_LUIDandAttributes
Win32_NamedJobObject
Win32_NamedJobObjectActgInfo
Win32_NamedJobObjectLimit
Win32_NamedJobObjectLimitSetting
Win32_NamedJobObjectProcess
Win32_NamedJobObjectSecLimit
Win32_NamedJobObjectSecLimitSetting
Win32_NamedJobObjectStatistics
Win32_SIDandAttributes
Win32_TokenGroups
Win32_TokenPrivileges)}
Memory and page files
Win32_LogicalMemoryConfiguration
Win32_PageFile
Win32_PageFileElementSetting
Win32_PageFileSetting
Win32_PageFileUsage
Win32_SystemLogicalMemoryConfiguration)}
Multimedia audio/visual
Win32_CodecFile)}
Networking
Win32_ActiveRoute
Win32_IP4PersistedRouteTable
Win32_IP4RouteTable
Win32_IP4RouteTableEvent
Win32_NetworkClient
Win32_NetworkConnection
Win32_NetworkProtocol
Win32_NTDomain
Win32_PingStatus
Win32_ProtocolBinding)}
Operating system events
Win32_ComputerShutdownEvent
Win32_ComputerSystemEvent
NWin32_DeviceChangeEvent
Win32_ModuleLoadTrace
Win32_ModuleTrace
Win32_ProcessStartTrace
Win32_ProcessStopTrace
Win32_ProcessTrace
Win32_SystemConfigurationChangeEvent
Win32_SystemTrace
Win32_ThreadStartTrace
Win32_ThreadStopTrace
Win32_ThreadTrace
Win32_VolumeChangeEvent)}
Operating system settings
Win32_BootConfiguration
Win32_ComputerSystem
Win32_ComputerSystemProcessor
Win32_ComputerSystemProduct
Win32_DependentService
Win32_LoadOrderGroup
Win32_LoadOrderGroupServiceDependencies
Win32_LoadOrderGroupServiceMembers
Win32_OperatingSystem
Win32_OperatingSystemQFE
Win32_OSRecoveryConfiguration
Win32_QuickFixEngineering
Win32_StartupCommand
Win32_SystemBootConfiguration
Win32_SystemDesktop
Win32_SystemDevices
Win32_SystemLoadOrderGroups
Win32_SystemNetworkConnections
Win32_SystemOperatingSystem
Win32_SystemProcesses
Win32_SystemProgramGroups
Win32_SystemResources
Win32_SystemServices
Win32_SystemSetting
Win32_SystemSystemDriver
Win32_SystemTimeZone
Win32_SystemUsers)}
Processes
Win32_Process
Win32_ProcessStartup
Win32_Thread)}
Registry
Win32_Registry)}
Scheduler jobs
Win32_CurrentTime
Win32_ScheduledJob)}
Security
NWin32_AccountSID
Win32_ACE
Win32_LogicalFileAccess
Win32_LogicalFileAuditing
Win32_LogicalFileGroup
Win32_LogicalFileOwner
Win32_LogicalFileSecuritySetting
Win32_LogicalShareAccess
Win32_LogicalShareAuditing
Win32_LogicalShareSecuritySetting
NWin32_PrivilegesStatus
NWin32_SecurityDescriptor
Win32_SecuritySetting
Win32_SecuritySettingAccess
Win32_SecuritySettingAuditing
Win32_SecuritySettingGroup
Win32_SecuritySettingOfLogicalFile
NodWin32_SecuritySettingOfLogicalShare
Win32_SecuritySettingOfObject
Win32_SecuritySettingOwner
Win32_SID
Win32_Trustee)}
Services
Win32_BaseService
Win32_Service)}
Shares
Win32_ServerConnection
Win32_ServerSession
Win32_ConnectionShare
Win32_PrinterShare
Win32_SessionConnection
Win32_SessionProcess
Win32_ShareToDirectory
Win32_Share)}
Start menu
NoWin32_LogicalProgramGroup
Win32_LogicalProgramGroupDirectory
Win32_LogicalProgramGroupItem
Win32_LogicalProgramGroupItemDataFile
Win32_ProgramGroup
Win32_ProgramGroupContents
Win32_ProgramGroupOrItem)}
Users
Win32_Account
Win32_Group
Win32_GroupInDomain
Win32_GroupUser
Win32_LogonSession
Win32_LogonSessionMappedDisk
Win32_NetworkLoginPr
ofile
Win32_SystemAccount
Win32_UserAccount
Win32_UserInDomain)}
Windows NT event log
Win32_NTEventlogFile
Win32_NTLogEvent
Win32_NTLogEventComputer
Win32_NTLogEventLog
Win32_NTLogEventUser)}
Windows Product Activation
Win32_ComputerSystemWindowsProductActivationSetting
Win32_Proxy
Win32_WindowsProductActivation)})}
Installed applications
Win32_ActionCheck
Win32_ApplicationCommandLine
Win32_ApplicationService
Win32_Binary
Win32_BindImageAction
Win32_CheckCheck
Win32_ClassInfoAction
Win32_CommandLineAccess
Win32_Condition
Win32_CreateFolderAction
Win32_DuplicateFileAction
Win32_EnvironmentSpecification
Win32_ExtensionInfoAction
Win32_FileSpecification
Win32_FontInfoAction
Win32_IniFileSpecification
Win32_InstalledSoftwareElement
Win32_LaunchCondition
Win32_ManagedSystemElementResource
Win32_MIMEInfoAction
Win32_MoveFileAction
Win32_MSIResource
Win32_ODBCAttribute
Win32_ODBCDataSourceAttribute
Win32_ODBCDataSourceSpecification
Win32_ODBCDriverAttribute
Win32_ODBCDriverSoftwareElement
Win32_ODBCDriverSpecification
Win32_ODBCSourceAttribute
Win32_ODBCTranslatorSpecification
Win32_Patch
Win32_PatchFile
Win32_PatchPackage
Win32_Product
Win32_ProductCheck
Win32_ProductResource
Win32_ProductSoftwareFeatures
Win32_ProgIDSpecification
Win32_Property
Win32_PublishComponentAction
Win32_RegistryAction
Win32_RemoveFileAction
Win32_RemoveIniAction
Win32_ReserveCost
Win32_SelfRegModuleAction
Win32_ServiceControl
Win32_ServiceSpecification
Win32_ServiceSpecificationService
Win32_SettingCheck
Win32_ShortcutAction
Win32_ShortcutSAP
Win32_SoftwareElement
Win32_SoftwareElementAction
Win32_SoftwareElementCheck
Win32_SoftwareElementCondition
Win32_SoftwareElementResource
Win32_SoftwareFeature
Win32_SoftwareFeatureAction
Win32_SoftwareFeatureCheck
Win32_SoftwareFeatureParent
Win32_SoftwareFeatureSoftwareElements
Win32_TypeLibraryAction)}
WMI service management
WMI Configuration Classes
Win32_MethodParameterClass)}
WMI Management Classes
Win32_WMISetting
Win32_WMIElementSetting)})}
Performance counters
Formatted Performance Counter Classes
Win32_PerfFormattedData
Win32_PerfFormattedData_ASP_ActiveServerPages
Win32_PerfFormattedData_ContentFilter_IndexingServiceFilter
Win32_PerfFormattedData_ContentIndex_IndexingService
Win32_PerfFormattedData_InetInfo_InternetInformationServicesGlobal
Win32_PerfFormattedData_ISAPISearch_HttpIndexingService
Win32_PerfFormattedData_MSDTC_DistributedTransactionCoordinator
Win32_PerfFormattedData_NTFSDRV_SMTPNTFSStoreDriver
Win32_PerfFormattedData_PerfDisk_LogicalDisk
Win32_PerfFormattedData_PerfDisk_PhysicalDisk
Win32_PerfFormattedData_PerfNet_Browser
Win32_PerfFormattedData_PerfNet_Redirector
Win32_PerfFormattedData_PerfNet_Server
Win32_PerfFormattedData_PerfNet_ServerWorkQueues
Win32_PerfFormattedData_PerfOS_Cache
Win32_PerfFormattedData_PerfOS_Memory
Win32_PerfFormattedData_PerfOS_Objects
Win32_PerfFormattedData_PerfOS_PagingFile
Win32_PerfFormattedData_PerfOS_Processor
Win32_PerfFormattedData_PerfOS_System
Win32_PerfFormattedData_PerfProc_FullImage_Costly
Win32_PerfFormattedData_PerfProc_Image_Costly
Win32_PerfFormattedData_PerfProc_JobObject
Win32_PerfFormattedData_PerfProc_JobObjectDetails
Win32_PerfFormattedData_PerfProc_Process
Win32_PerfFormattedData_PerfProc_ProcessAddressSpace_Costly
Win32_PerfFormattedData_PerfProc_Thread
Win32_PerfFormattedData_PerfProc_ThreadDetails_Costly
Win32_PerfFormattedData_PSched_PSchedFlow
Win32_PerfFormattedData_PSched_PSchedPipe
Win32_PerfFormattedData_RemoteAccess_RASPort
Win32_PerfFormattedData_RemoteAccess_RASTotal
Win32_PerfFormattedData_RSVP_ACSRSVPInterfaces
Win32_PerfFormattedData_RSVP_ACSRSVPService
Win32_PerfFormattedData_SMTPSVC_SMTPServer
Win32_PerfFormattedData_Spooler_PrintQueue
Win32_PerfFormattedData_TapiSrv_Telephony
Win32_PerfFormattedData_Tcpip_ICMP
Win32_PerfFormattedData_Tcpip_IP
Win32_PerfFormattedData_Tcpip_NBTConnection
Win32_PerfFormattedData_Tcpip_NetworkInterface
Win32_PerfFormattedData_Tcpip_TCP
Win32_PerfFormattedData_Tcpip_UDP
Win32_PerfFormattedData_TermService_TerminalServices
Win32_PerfFormattedData_TermService_TerminalServicesSession
Win32_PerfFormattedData_W3SVC_WebService)}
Raw Performance Counter Classes
Win32_PerfRawData
Win32_PerfRawData_ASP_ActiveServerPages
Win32_PerfRawData_ContentFilter_IndexingServiceFilter
Win32_PerfRawData_ContentIndex_IndexingService
Win32_PerfRawData_InetInfo_InternetInformationServicesGlobal
Win32_PerfRawData_ISAPISearch_HttpIndexingService
Win32_PerfRawData_MSDTC_DistributedTransactionCoordinator
Win32_PerfRawData_NTFSDRV_SMTPNTFSStoreDriver
Win32_PerfRawData_PerfDisk_LogicalDisk
Win32_PerfRawData_PerfDisk_PhysicalDisk
Win32_PerfRawData_PerfNet_Browser
Win32_PerfRawData_PerfNet_Redirector
Win32_PerfRawData_PerfNet_Server
Win32_PerfRawData_PerfNet_ServerWorkQueues
Win32_PerfRawData_PerfOS_Cache
Win32_PerfRawData_PerfOS_Memory
Win32_PerfRawData_PerfOS_Objects
Win32_PerfRawData_PerfOS_PagingFile
Win32_PerfRawData_PerfOS_Processor
Win32_PerfRawData_PerfOS_System
Win32_PerfRawData_PerfProc_FullImage_Costly
Win32_PerfRawData_PerfProc_Image_Costly
Win32_PerfRawData_PerfProc_JobObject
Win32_PerfRawData_PerfProc_JobObjectDetails
Win32_PerfRawData_PerfProc_Process
Win32_PerfRawData_PerfProc_ProcessAddressSpace_Costly
Win32_PerfRawData_PerfProc_Thread
Win32_PerfRawData_PerfProc_ThreadDetails_Costly
Win32_PerfRawData_PSched_PSchedFlow
NWin32_PerfRawData_PSched_PSchedPipe
Win32_PerfRawData_RemoteAccess_RASPort
Win32_PerfRawData_RemoteAccess_RASTotal
Win32_PerfRawData_RSVP_ACSRSVPInterfaces
Win32_PerfRawData_RSVP_ACSRSVPService
Win32_PerfRawData_SMTPSVC_SMTPServer
Win32_PerfRawData_Spooler_PrintQueue
Win32_PerfRawData_TapiSrv_Telephony
Win32_PerfRawData_Tcpip_ICMP
Win32_PerfRawData_Tcpip_IP
Win32_PerfRawData_Tcpip_NBTConnection
Win32_PerfRawData_Tcpip_NetworkInterface
Win32_PerfRawData_Tcpip_TCP
Win32_PerfRawData_Tcpip_UDP
Win32_PerfRawData_TermService_TerminalServices
Win32_PerfRawData_TermService_TerminalServicesSession
Win32_PerfRawData_W3SVC_WebService

本文转自
http://blog.csdn.net/yezie/archive/2005/10/03/494602.aspx

WMI类–所有可用的WMI的类封装

原帖地址:http://www.cnblogs.com/volcano/archive/2005/11/04/268900.html 

public class WMIClasses
    {
        private Hashtable _ClassHash=new Hashtable();
        public WMIClasses()
        {
            LoadWMIClasses();
        }
 
        private void LoadWMIClasses()
        {
            _ClassHash.Clear();
            _ClassHash["计算机系统硬件"]=new Hashtable();
            Hashtable hash=(Hashtable)_ClassHash["计算机系统硬件"];
 
            hash["降温设备"]=new DataSet("降温设备");
            DataSet dataset=(DataSet)hash["降温设备"];
            dataset.Tables.Add(new DataTable("Win32_Fan"));
            dataset.Tables.Add(new DataTable("Win32_HeatPipe"));
            dataset.Tables.Add(new DataTable("Win32_Refrigeration"));
            dataset.Tables.Add(new DataTable("Win32_TemperatureProbe"));
 
            hash["输入设备"]=new DataSet("输入设备");
            dataset=(DataSet)hash["输入设备"];
            dataset.Tables.Add(new DataTable("Win32_Keyboard"));
            dataset.Tables.Add(new DataTable("Win32_PointingDevice"));
            
            hash["存储设备"]=new DataSet("存储设备");
            dataset=(DataSet)hash["存储设备"];
            dataset.Tables.Add(new DataTable("Win32_AutochkSetting"));
            dataset.Tables.Add(new DataTable("Win32_CDROMDrive"));
            dataset.Tables.Add(new DataTable("Win32_DiskDrive"));
            dataset.Tables.Add(new DataTable("Win32_FloppyDrive"));
            dataset.Tables.Add(new DataTable("Win32_LogicalDisk"));
            dataset.Tables.Add(new DataTable("Win32_MappedLogicalDisk"));
            dataset.Tables.Add(new DataTable("Win32_TapeDrive"));
 
            hash["主板控制器及端口"]=new DataSet("主板控制器及端口");
            dataset=(DataSet)hash["主板控制器及端口"];
            dataset.Tables.Add(new DataTable("Win32_1394Controller"));
            dataset.Tables.Add(new DataTable("Win32_1394ControllerDevice"));
            dataset.Tables.Add(new DataTable("Win32_AllocatedResource"));
            dataset.Tables.Add(new DataTable("Win32_AssociatedProcessorMemory"));
            dataset.Tables.Add(new DataTable("Win32_BaseBoard"));
            dataset.Tables.Add(new DataTable("Win32_BIOS"));
            dataset.Tables.Add(new DataTable("Win32_Bus"));
            dataset.Tables.Add(new DataTable("Win32_CacheMemory"));
            dataset.Tables.Add(new DataTable("Win32_ControllerHasHub"));
            dataset.Tables.Add(new DataTable("Win32_DeviceBus"));
            dataset.Tables.Add(new DataTable("Win32_DeviceMemoryAddress"));
            dataset.Tables.Add(new DataTable("Win32_DeviceSettings"));
            dataset.Tables.Add(new DataTable("Win32_DMAChannel"));
            dataset.Tables.Add(new DataTable("Win32_FloppyController"));
            dataset.Tables.Add(new DataTable("Win32_IDEController"));
            dataset.Tables.Add(new DataTable("Win32_IDEControllerDevice"));
            dataset.Tables.Add(new DataTable("Win32_InfraredDevice"));
            dataset.Tables.Add(new DataTable("Win32_IRQResource"));
            dataset.Tables.Add(new DataTable("Win32_MemoryArray"));
            dataset.Tables.Add(new DataTable("Win32_MemoryArrayLocation"));
            dataset.Tables.Add(new DataTable("Win32_MemoryDevice"));
            dataset.Tables.Add(new DataTable("Win32_MemoryDeviceArray"));
            dataset.Tables.Add(new DataTable("Win32_MemoryDeviceLocation"));
            dataset.Tables.Add(new DataTable("Win32_MotherboardDevice"));
            dataset.Tables.Add(new DataTable("Win32_OnBoardDevice"));
            dataset.Tables.Add(new DataTable("Win32_ParallelPort"));
            dataset.Tables.Add(new DataTable("Win32_PCMCIAController"));
            dataset.Tables.Add(new DataTable("Win32_PhysicalMemory"));
            dataset.Tables.Add(new DataTable("Win32_PhysicalMemoryArray"));
            dataset.Tables.Add(new DataTable(&quot
;Win32_PhysicalMemoryLocation"));
            dataset.Tables.Add(new DataTable("Win32_PNPAllocatedResource"));
            dataset.Tables.Add(new DataTable("Win32_PNPDevice"));
            dataset.Tables.Add(new DataTable("Win32_PNPEntity"));
            dataset.Tables.Add(new DataTable("Win32_PortConnector"));
            dataset.Tables.Add(new DataTable("Win32_PortResource"));
            dataset.Tables.Add(new DataTable("Win32_Processor"));
            dataset.Tables.Add(new DataTable("Win32_SCSIController"));
            dataset.Tables.Add(new DataTable("Win32_SCSIControllerDevice"));
            dataset.Tables.Add(new DataTable("Win32_SerialPort"));
            dataset.Tables.Add(new DataTable("Win32_SerialPortConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_SerialPortSetting"));
            dataset.Tables.Add(new DataTable("Win32_SMBIOSMemory"));
            dataset.Tables.Add(new DataTable("Win32_SoundDevice"));
            dataset.Tables.Add(new DataTable("Win32_SystemBIOS"));
            dataset.Tables.Add(new DataTable("Win32_SystemDriverPNPEntity"));
            dataset.Tables.Add(new DataTable("Win32_SystemEnclosure"));
            dataset.Tables.Add(new DataTable("Win32_SystemMemoryResource"));
            dataset.Tables.Add(new DataTable("Win32_SystemSlot"));
            dataset.Tables.Add(new DataTable("Win32_USBController"));
            dataset.Tables.Add(new DataTable("Win32_USBControllerDevice"));
            dataset.Tables.Add(new DataTable("Win32_USBHub"));
 
            hash["网络设备"]=new DataSet("网络设备");
            dataset=(DataSet)hash["网络设备"];
            dataset.Tables.Add(new DataTable("Win32_NetworkAdapter"));
            dataset.Tables.Add(new DataTable("Win32_NetworkAdapterConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_NetworkAdapterSetting"));
 
            hash["电源"]=new DataSet("电源");
            dataset=(DataSet)hash["电源"];
            dataset.Tables.Add(new DataTable("Win32_Battery"));
            dataset.Tables.Add(new DataTable("Win32_CurrentProbe"));
            dataset.Tables.Add(new DataTable("Win32_PortableBattery"));
            dataset.Tables.Add(new DataTable("Win32_PowerManagementEvent"));
            dataset.Tables.Add(new DataTable("Win32_UninterruptiblePowerSupply"));
            dataset.Tables.Add(new DataTable("Win32_VoltageProbe"));
 
            hash["打印设备"]=new DataSet("打印设备");
            dataset=(DataSet)hash["打印设备"];
            dataset.Tables.Add(new DataTable("Win32_DriverForDevice"));
            dataset.Tables.Add(new DataTable("Win32_Printer"));
            dataset.Tables.Add(new DataTable("Win32_PrinterConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_PrinterController"));
            dataset.Tables.Add(new DataTable("Win32_PrinterDriver"));
            dataset.Tables.Add(new DataTable("Win32_PrinterDriverDll"));
            dataset.Tables.Add(new DataTable("Win32_PrinterSetting"));
            dataset.Tables.Add(new DataTable("Win32_PrintJob"));
            dataset.Tables.Add(new DataTable("Win32_TCPIPPrinterPort"));
 
            hash["电话设备"]=new DataSet("电话设备");
            dataset=(DataSet)hash["电话设备"];
            dataset.Tables.Add(new DataTable("Win32_POTSModem"));
            dataset.Tables.Add(new DataTable("Win32_POTSModemToSerialPort"));
 
            hash["视频和监视器"]=new DataSet("视频和监视器");
            dataset=(DataSet)hash["视频和监视器"];
            dataset.Tables.Add(new DataTable("Win32_DesktopMonitor"));
            dataset.Tables.Add(new DataTable("Win32_DisplayConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_DisplayControllerConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_VideoConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_VideoController"));
            dataset.Tables.Add(new DataTable("Win32_VideoSettings"));
 
 
 &n
bsp;          _ClassHash["软件操作系统"]=new Hashtable();
            hash=(Hashtable)_ClassHash["软件操作系统"];
 
            hash["组件"]=new DataSet("组件");
            dataset=(DataSet)hash["组件"];
            dataset.Tables.Add(new DataTable("Win32_ClassicCOMApplicationClasses"));
            dataset.Tables.Add(new DataTable("Win32_ClassicCOMClass"));
            dataset.Tables.Add(new DataTable("Win32_ClassicCOMClassSettings"));
            dataset.Tables.Add(new DataTable("Win32_ClientApplicationSetting"));
            dataset.Tables.Add(new DataTable("Win32_COMApplication"));
            dataset.Tables.Add(new DataTable("Win32_COMApplicationClasses"));
            dataset.Tables.Add(new DataTable("Win32_COMApplicationSettings"));
            dataset.Tables.Add(new DataTable("Win32_COMClass"));
            dataset.Tables.Add(new DataTable("Win32_ComClassAutoEmulator"));
            dataset.Tables.Add(new DataTable("Win32_ComClassEmulator"));
            dataset.Tables.Add(new DataTable("Win32_ComponentCategory"));
            dataset.Tables.Add(new DataTable("Win32_COMSetting"));
            dataset.Tables.Add(new DataTable("Win32_DCOMApplication"));
            dataset.Tables.Add(new DataTable("Win32_DCOMApplicationAccessAllowedSetting"));
            dataset.Tables.Add(new DataTable("Win32_DCOMApplicationLaunchAllowedSetting"));
            dataset.Tables.Add(new DataTable("Win32_DCOMApplicationSetting"));
            dataset.Tables.Add(new DataTable("Win32_ImplementedCategory"));
 
            hash["桌面"]=new DataSet("桌面");
            dataset=(DataSet)hash["桌面"];
            dataset.Tables.Add(new DataTable("Win32_Desktop"));
            dataset.Tables.Add(new DataTable("Win32_Environment"));
            dataset.Tables.Add(new DataTable("Win32_TimeZone"));
            dataset.Tables.Add(new DataTable("Win32_UserDesktop"));
 
            hash["驱动"]=new DataSet("驱动");
            dataset=(DataSet)hash["驱动"];
            dataset.Tables.Add(new DataTable("Win32_DriverVXD"));
            dataset.Tables.Add(new DataTable("Win32_SystemDriver"));
 
            hash["文件系统"]=new DataSet("文件系统");
            dataset=(DataSet)hash["文件系统"];
            dataset.Tables.Add(new DataTable("Win32_CIMLogicalDeviceCIMDataFile"));
            dataset.Tables.Add(new DataTable("Win32_Directory"));
            dataset.Tables.Add(new DataTable("Win32_DirectorySpecification"));
            dataset.Tables.Add(new DataTable("Win32_DiskDriveToDiskPartition"));
            dataset.Tables.Add(new DataTable("Win32_DiskPartition"));
            dataset.Tables.Add(new DataTable("Win32_DiskQuota"));
            dataset.Tables.Add(new DataTable("Win32_LogicalDiskRootDirectory"));
            dataset.Tables.Add(new DataTable("Win32_LogicalDiskToPartition"));
            dataset.Tables.Add(new DataTable("Win32_OperatingSystemAutochkSetting"));
            dataset.Tables.Add(new DataTable("Win32_QuotaSetting"));
            dataset.Tables.Add(new DataTable("Win32_ShortcutFile"));
            dataset.Tables.Add(new DataTable("Win32_SubDirectory"));
            dataset.Tables.Add(new DataTable("Win32_SystemPartitions"));
            dataset.Tables.Add(new DataTable("Win32_VolumeQuotaSetting"));
 
            hash["工作对象"]=new DataSet("工作对象");
            dataset=(DataSet)hash["工作对象"];
            dataset.Tables.Add(new DataTable("Win32_CollectionStatistics"));
            dataset.Tables.Add(new DataTable("Win32_LUID"));
            dataset.Tables.Add(new DataTable("Win32_LUIDandAttributes"));
            dataset.Tables.Add(new DataTable("Win32_NamedJobObject"));
            dataset.Tables.Add(new DataTable("Win32_NamedJobObjectActgInfo"));
            dataset.Tables.Add(new DataTable("Win32_NamedJobObjectLimit"));
            dataset.Tables.Add(new DataTable("Win32_NamedJobObjectLimitSetting"));
            dataset.Tables.Add(new DataTable("Win32_NamedJobObjectProcess"));
        
    dataset.Tables.Add(new DataTable("Win32_NamedJobObjectSecLimit"));
            dataset.Tables.Add(new DataTable("Win32_NamedJobObjectSecLimitSetting"));
            dataset.Tables.Add(new DataTable("Win32_NamedJobObjectStatistics"));
            dataset.Tables.Add(new DataTable("Win32_SIDandAttributes"));
            dataset.Tables.Add(new DataTable("Win32_TokenGroups"));
            dataset.Tables.Add(new DataTable("Win32_TokenPrivileges"));
 
            hash["内存和页面"]=new DataSet("内存和页面");
            dataset=(DataSet)hash["内存和页面"];
            dataset.Tables.Add(new DataTable("Win32_LogicalMemoryConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_PageFile"));
            dataset.Tables.Add(new DataTable("Win32_PageFileElementSetting"));
            dataset.Tables.Add(new DataTable("Win32_PageFileSetting"));
            dataset.Tables.Add(new DataTable("Win32_PageFileUsage"));
            dataset.Tables.Add(new DataTable("Win32_SystemLogicalMemoryConfiguration"));
 
            hash["媒体和音频"]=new DataSet("媒体和音频");
            dataset=(DataSet)hash["媒体和音频"];
            dataset.Tables.Add(new DataTable("Win32_CodecFile"));
 
            hash["网络"]=new DataSet("网络");
            dataset=(DataSet)hash["网络"];
            dataset.Tables.Add(new DataTable(" Win32_ActiveRoute"));
            dataset.Tables.Add(new DataTable(" Win32_IP4PersistedRouteTable"));
            dataset.Tables.Add(new DataTable(" Win32_IP4RouteTable"));
            dataset.Tables.Add(new DataTable(" Win32_IP4RouteTableEvent"));
            dataset.Tables.Add(new DataTable(" Win32_NetworkClient"));
            dataset.Tables.Add(new DataTable(" Win32_NetworkConnection"));
            dataset.Tables.Add(new DataTable(" Win32_NetworkProtocol"));
            dataset.Tables.Add(new DataTable(" Win32_NTDomain"));
            dataset.Tables.Add(new DataTable(" Win32_PingStatus"));
            dataset.Tables.Add(new DataTable(" Win32_ProtocolBinding"));
 
            hash["操作系统事件"]=new DataSet("操作系统事件");
            dataset=(DataSet)hash["操作系统事件"];
            dataset.Tables.Add(new DataTable("Win32_ComputerShutdownEvent"));
            dataset.Tables.Add(new DataTable("Win32_ComputerSystemEvent"));
            dataset.Tables.Add(new DataTable("NWin32_DeviceChangeEvent"));
            dataset.Tables.Add(new DataTable("Win32_ModuleLoadTrace"));
            dataset.Tables.Add(new DataTable("Win32_ModuleTrace"));
            dataset.Tables.Add(new DataTable("Win32_ProcessStartTrace"));
            dataset.Tables.Add(new DataTable("Win32_ProcessStopTrace"));
            dataset.Tables.Add(new DataTable("Win32_ProcessTrace"));
            dataset.Tables.Add(new DataTable("Win32_SystemConfigurationChangeEvent"));
            dataset.Tables.Add(new DataTable("Win32_SystemTrace"));
            dataset.Tables.Add(new DataTable("Win32_ThreadStartTrace"));
            dataset.Tables.Add(new DataTable("Win32_ThreadStopTrace"));
            dataset.Tables.Add(new DataTable("Win32_ThreadTrace"));
            dataset.Tables.Add(new DataTable("Win32_VolumeChangeEvent"));
 
            hash["操作系统设置"]=new DataSet("操作系统设置");
            dataset=(DataSet)hash["操作系统设置"];
            dataset.Tables.Add(new DataTable("Win32_BootConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_ComputerSystem"));
            dataset.Tables.Add(new DataTable("Win32_ComputerSystemProcessor"));
            dataset.Tables.Add(new DataTable("Win32_ComputerSystemProduct"));
            dataset.Tables.Add(new DataTable("Win32_DependentService"));
            dataset.Tables.Add(new DataTable("Win32_LoadOrderGroup"));
            dataset.Tables.Add(new DataTable("Win32_LoadOrderGroupServiceDependencies"));
            dataset.Tables.Add(new DataTable("Win32_LoadOrderGroupServiceMembers"));
            dataset.Tables.Add(new DataTable("Win32_OperatingSystem"));
            dataset.Tables.Add(new DataTable("Win32_OperatingSyste
mQFE"));
            dataset.Tables.Add(new DataTable("Win32_OSRecoveryConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_QuickFixEngineering"));
            dataset.Tables.Add(new DataTable("Win32_StartupCommand"));
            dataset.Tables.Add(new DataTable("Win32_SystemBootConfiguration"));
            dataset.Tables.Add(new DataTable("Win32_SystemDesktop"));
            dataset.Tables.Add(new DataTable("Win32_SystemDevices"));
            dataset.Tables.Add(new DataTable("Win32_SystemLoadOrderGroups"));
            dataset.Tables.Add(new DataTable("Win32_SystemNetworkConnections"));
            dataset.Tables.Add(new DataTable("Win32_SystemOperatingSystem"));
            dataset.Tables.Add(new DataTable("Win32_SystemProcesses"));
            dataset.Tables.Add(new DataTable("Win32_SystemProgramGroups"));
            dataset.Tables.Add(new DataTable("Win32_SystemResources"));
            dataset.Tables.Add(new DataTable("Win32_SystemServices"));
            dataset.Tables.Add(new DataTable("Win32_SystemSetting"));
            dataset.Tables.Add(new DataTable("Win32_SystemSystemDriver"));
            dataset.Tables.Add(new DataTable("Win32_SystemTimeZone"));
            dataset.Tables.Add(new DataTable("Win32_SystemUsers"));
 
            hash["进程"]=new DataSet("进程");
            dataset=(DataSet)hash["进程"];
            dataset.Tables.Add(new DataTable("Win32_Process"));
            dataset.Tables.Add(new DataTable("Win32_ProcessStartup"));
            dataset.Tables.Add(new DataTable("Win32_Thread"));
 
            hash["注册表"]=new DataSet("注册表");
            dataset=(DataSet)hash["注册表"];
            dataset.Tables.Add(new DataTable("Win32_Registry"));
 
            hash["计划任务"]=new DataSet("计划任务");
            dataset=(DataSet)hash["计划任务"];
            dataset.Tables.Add(new DataTable("Win32_CurrentTime"));
            dataset.Tables.Add(new DataTable("Win32_ScheduledJob"));
 
            hash["安全"]=new DataSet("安全");
            dataset=(DataSet)hash["安全"];
            dataset.Tables.Add(new DataTable("NWin32_AccountSID"));
            dataset.Tables.Add(new DataTable("Win32_ACE"));
            dataset.Tables.Add(new DataTable("Win32_LogicalFileAccess"));
            dataset.Tables.Add(new DataTable("Win32_LogicalFileAuditing"));
            dataset.Tables.Add(new DataTable("Win32_LogicalFileGroup"));
            dataset.Tables.Add(new DataTable("Win32_LogicalFileOwner"));
            dataset.Tables.Add(new DataTable("Win32_LogicalFileSecuritySetting"));
            dataset.Tables.Add(new DataTable("Win32_LogicalShareAccess"));
            dataset.Tables.Add(new DataTable("Win32_LogicalShareAuditing"));
            dataset.Tables.Add(new DataTable("Win32_LogicalShareSecuritySetting"));
            dataset.Tables.Add(new DataTable("NWin32_PrivilegesStatus"));
            dataset.Tables.Add(new DataTable("NWin32_SecurityDescriptor"));
            dataset.Tables.Add(new DataTable("Win32_SecuritySetting"));
            dataset.Tables.Add(new DataTable("Win32_SecuritySettingAccess"));
            dataset.Tables.Add(new DataTable("Win32_SecuritySettingAuditing"));
            dataset.Tables.Add(new DataTable("Win32_SecuritySettingGroup"));
            dataset.Tables.Add(new DataTable("Win32_SecuritySettingOfLogicalFile"));
            dataset.Tables.Add(new DataTable("NodWin32_SecuritySettingOfLogicalShare"));
            dataset.Tables.Add(new DataTable("Win32_SecuritySettingOfObject"));
            dataset.Tables.Add(new DataTable("Win32_SecuritySettingOwner"));
            dataset.Tables.Add(new DataTable("Win32_SID"));
            dataset.Tables.Add(new DataTable("Win32_Trustee"));
 
            hash["服务"]=new DataSet("服务");
            dataset=(DataSet)hash["服务"];
            dataset.Tables.Add(new DataTable("Win32_BaseService"));
            dataset.Tables.Add(new DataTable("Win32_Service"));
 
         
   hash["共享"]=new DataSet("共享");
            dataset=(DataSet)hash["共享"];
            dataset.Tables.Add(new DataTable("Win32_ServerConnection"));
            dataset.Tables.Add(new DataTable("Win32_ServerSession"));
            dataset.Tables.Add(new DataTable("Win32_ConnectionShare"));
            dataset.Tables.Add(new DataTable("Win32_PrinterShare"));
            dataset.Tables.Add(new DataTable("Win32_SessionConnection"));
            dataset.Tables.Add(new DataTable("Win32_SessionProcess"));
            dataset.Tables.Add(new DataTable("Win32_ShareToDirectory"));
            dataset.Tables.Add(new DataTable("Win32_Share"));
 
            hash["开始菜单"]=new DataSet("开始菜单");
            dataset=(DataSet)hash["开始菜单"];
            dataset.Tables.Add(new DataTable("NoWin32_LogicalProgramGroup"));
            dataset.Tables.Add(new DataTable("Win32_LogicalProgramGroupDirectory"));
            dataset.Tables.Add(new DataTable("Win32_LogicalProgramGroupItem"));
            dataset.Tables.Add(new DataTable("Win32_LogicalProgramGroupItemDataFile"));
            dataset.Tables.Add(new DataTable("Win32_ProgramGroup"));
            dataset.Tables.Add(new DataTable("Win32_ProgramGroupContents"));
            dataset.Tables.Add(new DataTable("Win32_ProgramGroupOrItem"));
 
            hash["用户"]=new DataSet("用户");
            dataset=(DataSet)hash["用户"];
            dataset.Tables.Add(new DataTable("Win32_Account"));
            dataset.Tables.Add(new DataTable("Win32_Group"));
            dataset.Tables.Add(new DataTable("Win32_GroupInDomain"));
            dataset.Tables.Add(new DataTable("Win32_GroupUser"));
            dataset.Tables.Add(new DataTable("Win32_LogonSession"));
            dataset.Tables.Add(new DataTable("Win32_LogonSessionMappedDisk"));
            dataset.Tables.Add(new DataTable("Win32_NetworkLoginProfile"));
            dataset.Tables.Add(new DataTable("Win32_SystemAccount"));
            dataset.Tables.Add(new DataTable("Win32_UserAccount"));
            dataset.Tables.Add(new DataTable("Win32_UserInDomain"));
 
            hash["Windows事件日志"]=new DataSet("Windows事件日志");
            dataset=(DataSet)hash["Windows事件日志"];
            dataset.Tables.Add(new DataTable("Win32_NTEventlogFile"));
            dataset.Tables.Add(new DataTable("Win32_NTLogEvent"));
            dataset.Tables.Add(new DataTable("Win32_NTLogEventComputer"));
            dataset.Tables.Add(new DataTable("Win32_NTLogEventLog"));
            dataset.Tables.Add(new DataTable("Win32_NTLogEventUser"));
 
            hash["Windows产品激活"]=new DataSet("Windows产品激活");
            dataset=(DataSet)hash["Windows产品激活"];
            dataset.Tables.Add(new DataTable("Win32_ComputerSystemWindowsProductActivationSetting"));
            dataset.Tables.Add(new DataTable("Win32_Proxy"));
            dataset.Tables.Add(new DataTable("Win32_WindowsProductActivation"));
 
            hash["应用程序安装"]=new DataSet("应用程序安装");
            dataset=(DataSet)hash["应用程序安装"];
            dataset.Tables.Add(new DataTable("Win32_ActionCheck"));
            dataset.Tables.Add(new DataTable("Win32_ApplicationCommandLine"));
            dataset.Tables.Add(new DataTable("Win32_ApplicationService"));
            dataset.Tables.Add(new DataTable("Win32_Binary"));
            dataset.Tables.Add(new DataTable("Win32_BindImageAction"));
            dataset.Tables.Add(new DataTable("Win32_CheckCheck"));
            dataset.Tables.Add(new DataTable("Win32_ClassInfoAction"));
            dataset.Tables.Add(new DataTable("Win32_CommandLineAccess"));
            dataset.Tables.Add(new DataTable("Win32_Condition"));
            dataset.Tables.Add(new DataTable("Win32_CreateFolderAction"));
            dataset.Tables.Add(new DataTable("Win32_DuplicateFileAction"));
            dataset.Tables.Add(new DataTable("Win32_EnvironmentSpecification"));
            dataset.Tables.Add(new DataTable(
"Win32_ExtensionInfoAction"));
            dataset.Tables.Add(new DataTable("Win32_FileSpecification"));
            dataset.Tables.Add(new DataTable("Win32_FontInfoAction"));
            dataset.Tables.Add(new DataTable("Win32_IniFileSpecification"));
            dataset.Tables.Add(new DataTable("Win32_InstalledSoftwareElement"));
            dataset.Tables.Add(new DataTable("Win32_LaunchCondition"));
            dataset.Tables.Add(new DataTable("Win32_ManagedSystemElementResource"));
            dataset.Tables.Add(new DataTable("Win32_MIMEInfoAction"));
            dataset.Tables.Add(new DataTable("Win32_MoveFileAction"));
            dataset.Tables.Add(new DataTable("Win32_MSIResource"));
            dataset.Tables.Add(new DataTable("Win32_ODBCAttribute"));
            dataset.Tables.Add(new DataTable("Win32_ODBCDataSourceAttribute"));
            dataset.Tables.Add(new DataTable("Win32_ODBCDataSourceSpecification"));
            dataset.Tables.Add(new DataTable("Win32_ODBCDriverAttribute"));
            dataset.Tables.Add(new DataTable("Win32_ODBCDriverSoftwareElement"));
            dataset.Tables.Add(new DataTable("Win32_ODBCDriverSpecification"));
            dataset.Tables.Add(new DataTable("Win32_ODBCSourceAttribute"));
            dataset.Tables.Add(new DataTable("Win32_ODBCTranslatorSpecification"));
            dataset.Tables.Add(new DataTable("Win32_Patch"));
            dataset.Tables.Add(new DataTable("Win32_PatchFile"));
            dataset.Tables.Add(new DataTable("Win32_PatchPackage"));
            dataset.Tables.Add(new DataTable("Win32_Product"));
            dataset.Tables.Add(new DataTable("Win32_ProductCheck"));
            dataset.Tables.Add(new DataTable("Win32_ProductResource"));
            dataset.Tables.Add(new DataTable("Win32_ProductSoftwareFeatures"));
            dataset.Tables.Add(new DataTable("Win32_ProgIDSpecification"));
            dataset.Tables.Add(new DataTable("Win32_Property"));
            dataset.Tables.Add(new DataTable("Win32_PublishComponentAction"));
            dataset.Tables.Add(new DataTable("Win32_RegistryAction"));
            dataset.Tables.Add(new DataTable("Win32_RemoveFileAction"));
            dataset.Tables.Add(new DataTable("Win32_RemoveIniAction"));
            dataset.Tables.Add(new DataTable("Win32_ReserveCost"));
            dataset.Tables.Add(new DataTable("Win32_SelfRegModuleAction"));
            dataset.Tables.Add(new DataTable("Win32_ServiceControl"));
            dataset.Tables.Add(new DataTable("Win32_ServiceSpecification"));
            dataset.Tables.Add(new DataTable("Win32_ServiceSpecificationService"));
            dataset.Tables.Add(new DataTable("Win32_SettingCheck"));
            dataset.Tables.Add(new DataTable("Win32_ShortcutAction"));
            dataset.Tables.Add(new DataTable("Win32_ShortcutSAP"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareElement"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareElementAction"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareElementCheck"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareElementCondition"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareElementResource"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareFeature"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareFeatureAction"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareFeatureCheck"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareFeatureParent"));
            dataset.Tables.Add(new DataTable("Win32_SoftwareFeatureSoftwareElements"));
            dataset.Tables.Add(new DataTable("Win32_TypeLibraryAction"));
 
 
            _ClassHash["WMI服务管理"]=new Hashtable();
            hash=(Hashtable)_ClassHash["WMI服务管理"];
 
            hash["WMI设置"]=new DataSet("WMI设置");
            dataset=(DataSet)hash["WMI设置"];
            dataset.Tables.Add(new DataTable("Win32_MethodParameterClass"));
 
            hash["WMI管理"]=new DataSet("WMI管理");
            dataset=(DataSet)hash["WMI管理"];
      &n
bsp;     dataset.Tables.Add(new DataTable("Win32_WMISetting"));
            dataset.Tables.Add(new DataTable("Win32_WMIElementSetting"));
 
 
            _ClassHash["性能计数器"]=new Hashtable();
            hash=(Hashtable)_ClassHash["性能计数器"];
 
            hash["格式化性能计数"]=new DataSet("格式化性能计数");
            dataset=(DataSet)hash["格式化性能计数"];
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_ASP_ActiveServerPages"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_ContentFilter_IndexingServiceFilter"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_ContentIndex_IndexingService"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_InetInfo_InternetInformationServicesGlobal"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_ISAPISearch_HttpIndexingService"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_MSDTC_DistributedTransactionCoordinator"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_NTFSDRV_SMTPNTFSStoreDriver"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfDisk_LogicalDisk"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfDisk_PhysicalDisk"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfNet_Browser"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfNet_Redirector"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfNet_Server"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfNet_ServerWorkQueues"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfOS_Cache"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfOS_Memory"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfOS_Objects"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfOS_PagingFile"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfOS_Processor"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfOS_System"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfProc_FullImage_Costly"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfProc_Image_Costly"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfProc_JobObject"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfProc_JobObjectDetails"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfProc_Process"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfProc_ProcessAddressSpace_Costly"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfProc_Thread"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PerfProc_ThreadDetails_Costly"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PSched_PSchedFlow"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_PSched_PSchedPipe"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_RemoteAccess_RASPort"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_RemoteAccess_RASTotal"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_RSVP_ACSRSVPInterfaces"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_RSVP_ACSRSVPService"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_SMTPSVC_SMTPServer"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_Spooler_PrintQueue"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_TapiSrv_Telephony"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_Tcpip_ICMP"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_Tcpip_IP"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_Tcpip_NBTConnection"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_Tcpip_NetworkInterface"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_Tcpip_TCP"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_Tcpip_UDP"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_TermService_TerminalServices"));
         &nb
sp;  dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_TermService_TerminalServicesSession"));
            dataset.Tables.Add(new DataTable("Win32_PerfFormattedData_W3SVC_WebService"));
 
            hash["原始性能计数"]=new DataSet("原始性能计数");
            dataset=(DataSet)hash["原始性能计数"];
            dataset.Tables.Add(new DataTable("Win32_PerfRawData"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_ASP_ActiveServerPages"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_ContentFilter_IndexingServiceFilter"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_ContentIndex_IndexingService"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_InetInfo_InternetInformationServicesGlobal"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_ISAPISearch_HttpIndexingService"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_MSDTC_DistributedTransactionCoordinator"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_NTFSDRV_SMTPNTFSStoreDriver"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfDisk_LogicalDisk"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfDisk_PhysicalDisk"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfNet_Browser"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfNet_Redirector"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfNet_Server"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfNet_ServerWorkQueues"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfOS_Cache"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfOS_Memory"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfOS_Objects"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfOS_PagingFile"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfOS_Processor"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfOS_System"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfProc_FullImage_Costly"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfProc_Image_Costly"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfProc_JobObject"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfProc_JobObjectDetails"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfProc_Process"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfProc_ProcessAddressSpace_Costly"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfProc_Thread"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PerfProc_ThreadDetails_Costly"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_PSched_PSchedFlow"));
            dataset.Tables.Add(new DataTable("NWin32_PerfRawData_PSched_PSchedPipe"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_RemoteAccess_RASPort"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_RemoteAccess_RASTotal"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_RSVP_ACSRSVPInterfaces"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_RSVP_ACSRSVPService"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_SMTPSVC_SMTPServer"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_Spooler_PrintQueue"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_TapiSrv_Telephony"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_Tcpip_ICMP"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_Tcpip_IP"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_Tcpip_NBTConnection"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_Tcpip_NetworkInterface"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_Tcpip_TCP"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_Tcpip_UDP"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_TermService_TerminalServices"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_TermService_TerminalServicesSession"));
            dataset.Tables.Add(new DataTable("Win32_PerfRawData_W3SVC_WebService"));
 
        }
        public Hashtable ClassHash
        {
        &nb
sp;   get{return _ClassHash;}
        }
    }

 

从MFC与ATL的男女关系说起

从MFC与ATL的男女关系说起

2006-07-04 11:05:37 来源: 学院摘选  网友评论 4 条 进入论坛
我从大三开始学习MFC,对于一个学软件的学生来说算是有点晚,到现在差不多有3个年头了。我在大四进入公司实习开始学习COM,接触到ATL并用它来做开发。我在大二冬天开始恋爱,到现在为止第一段爱情走过3个半年头终于到了末路。这些对于我来说都算初尝,尝之有味所以写一点胡言乱语。
男女关系
如果从哲学的观点来看,这大概要说是一种辩证关系了!
首先谈谈男人。男人与男孩的区别在于责任,对于一个男人来说,他的肩膀永远有负担,他要解决生活中遇到的所有问题,可以为妻儿带来幸福生活,可以赡养父母,可以做一些成就来创一番事业。所以男人不要轻生,因为你垮下就意味着你的负担没有了支撑,也就是你不负责任。男人的这种责任体现了一种刚性,打不倒压不垮,坎坎坷坷一路走来即使没有扬名立万但是肩膀上的负担始终没有落下。铮铮铁骨、铁血男儿、阳刚之美都是对男人的赞美,一个家庭男人是顶梁柱,这就是责任。
再谈谈女人。女人与女孩的区别在于柔情,少了撒娇和任性,多了体贴和温柔。女人是生活的调剂品,少了她尽管可以填抱肚皮、补充营养但食之无味。女人天生就是善于交际的,这本身体现的就是一种柔性,就像太极一样,以柔克刚,借助刚性体现柔美。
用建筑来形容男女关系,男人就像钢筋水泥搭建起来的框架承受着外力,女人则是对框架填补装修使其美观,不同的男人有着不同的建筑风格,不同的女人可以使建筑呈现不同的美。成功的男人背后都有一个女人,钢筋水泥加上精心装饰让人体会到设计之美,至于谁重要次要,谁表谁里都不是关键,关键的是刚柔的结合。
MFC
MFC是一个男人,从Microsoft C/C++ version 7.0到Visual Stduio.net 2005一直承担着软件框架设计的角色,风风雨雨路不回头,屹立在软件设计大道,为开发者提供便利,著名的BCG库和XTREME库都是在MFC源码基础上的改进。它大而繁杂,曲折通幽,粗旷豪放。它必须承担责任,提供软件设计的一套解决方案,而且背负着历史包袱,所以难免带有一些成熟男人的深邃而不被人理解。如果你还一味的去批判它,那只能说你不懂男人的心,不理解一个男人难言之苦。 ATL
ATL是一个女人,小巧灵活讨人喜爱,它作为COM思想的实现而拿出来解决软件协作的问题。它可以不具体实现功能而只留出一些接口,接口两端相通并且随时拔插,多么完美一个女人!为一个C++对象配备一个ATL对象你可以想象有什么结果嘛?
软件设计中的MFC与ATL
以前我一直以为ATL就是做控件、构造插件接口体系的,而MFC就是用来做界面功能。它们属于不同体系,在功能级别上存在差异,所以只是在纵向上结合而没有尝试横向的结合。人类社会是自然的,软件社会也应该是自然的。自然代表一种随和,亲近,协调。
提到MFC,八九不离十就涉及到软件界面开发。目前来说软件复用需求越来越高,而软件功能的不确定因素越来越大,一个特定的界面行为可能不确定。MFC是一个男人,用它可以做任何想做的界面,这就是它的刚性。但是我们到底是要去做什么还是告诉别人我们可以做什么呢?如果我们一味的做,那我们充其量只是一个莽夫,是吕布有勇无谋。我告诉你我有一个MFC对象,还告诉你它可以做什么,这样不就够了。
MFC是男人天生缺乏沟通能力,所以无法告知外界它自身的行为,只有它自己知道。这时候就需要一个管子插到对象内部去了解它,而ATL刚好提供了一个接口,将其一段插入MFC对象内部而露出另一端以便告知外界MFC对象内部的行为。这样的界面是可解释的界面,它具有做事情的能力,但是它不去做,而成为可复用界面。

本文转自
http://tech.163.com/06/0704/11/2L6CBCLN00091LRC.html

什么是对象的句柄?它是指针吗?它是引用吗?它是指向指针的指针?它是什么?

句柄术语一般用来指获取另一个对象的方法——一个广义的假指针。这个术语是(故意的)含糊不清的。

含糊不清在实际中的某些情况下是有用的。例如,在早期设计时,你可能不准备用句柄来表示。你可能不确定是否将一个简单的指针或者引用或者指向指针的指针或者指向引用的指针或者整型标识符放在一个数组或者字符串(或其它键)以便能够以哈希表(hash-table)(或其他数据结构)或数据库键或者一些其它的技巧来查询。如果你只知道你会需要一些唯一标识的东西来获取对象,那么这些东西就被称为句柄。

因此,如果你的最终目标是要让代码唯一的标识/查询一个Fred类的指定的对象的话,你需要传递一个Fred句柄这些代码。句柄可以是一个能被作为众所周知的查询表中的键(key)来使用的字符串(比如,在std::mapstd::map中的键),或者它可以是一个作为数组中的索引的整数(比如,Fred* array = new Fred[maxNumFreds]),或者它可以是一个简单的 Fred*,或者它可以是其它的一些东西。

初学者常常考虑指针,但实际上使用未初始化的指针有底层的风险。例如,如果Fred对象需要移动怎么办?当Fred对象可以被安全删除时我们如何获知?如果Fred对象需要(临时的)连续的从磁盘获得怎么办?等等。这些时候的大多数,我们增加一个间接层来管理位置。例如,句柄可以是Fred**,指向Fred*的指针可以保证不会被移动。当Fred对象需要移动时,你只要更新指向Fred*的指针就可以了。或者让用一个整数作为句柄,然后在表或数组或其他地方查询Fred的对象(或者指向Fred对象的指针)。

重点是当我们不知道要做的事情的细节时,使用句柄。

使用句柄的另一个时机是想要将已经完成的东西含糊化的时候(有时用术语magic cookie也一样,就像这样,“软件传递一个magic cookie来唯一标识并定位适当的Fred对象”)。将已经完成的东西含糊化的原因是使得句柄的特殊细节或表示物改变时所产生的连锁反应最小化。举例来说,当将一个句柄从用来在表中查询的字符串变为在数组中查询的整数时,我们可不想更新大量的代码。

当句柄的细节或表示物改变时,维护工作更为简单(或者说阅读和书写代码更容易),因此常常将句柄封装到类中。这样的类常重载operator->operator*算符(既然句柄的效果象指针,那么它可能看起来也象指针)。

基于struts+spring+ibatis的轻量级J2EE开发

基于struts+spring+ibatis的轻量级J2EE开发

 

级别: 初级

吴高峰 (shuwgf@21cn.com)常德卷烟厂信息技术部

2005 年 2 月 01 日

大多数IT 组织都必须解决三个主要问题:1.帮助组织减少成本 2.增加并且保持客户 3.加快业务效率。完成这些问题一般都需要实现对多个业务系统的数据和业务逻辑的无缝访问,也就是说,要实施系统集成工程,以便联结业务流程、实现数据的访问与共享。

JpetStore 4.0是ibatis的最新示例程序,基于Struts MVC框架(注:非传统Struts开发模式),以ibatis作为持久化层。该示例程序设计优雅,层次清晰,可以学习以及作为一个高效率的编程模型参考。本文是在其基础上,采用Spring对其中间层(业务层)进行改造。使开发量进一步减少,同时又拥有了Spring的一些好处…

1. 前言

JpetStore 4.0是ibatis的最新示例程序。ibatis是开源的持久层产品,包含SQL Maps 2.0 和 Data Access Objects 2.0 框架。JpetStore示例程序很好的展示了如何利用ibatis来开发一个典型的J2EE web应用程序。JpetStore有如下特点:

  • ibatis数据层
  • POJO业务层
  • POJO领域类
  • Struts MVC
  • JSP 表示层

以下是本文用到的关键技术介绍,本文假设您已经对Struts,SpringFramewok,ibatis有一定的了解,如果不是,请首先查阅附录中的参考资料。

  • Struts 是目前Java Web MVC框架中不争的王者。经过长达五年的发展,Struts已经逐渐成长为一个稳定、成熟的框架,并且占有了MVC框架中最大的市场份额。但是Struts某些技术特性上已经落后于新兴的MVC框架。面对Spring MVC、Webwork2 这些设计更精密,扩展性更强的框架,Struts受到了前所未有的挑战。但站在产品开发的角度而言,Struts仍然是最稳妥的选择。本文的原型例子JpetStore 4.0就是基于Struts开发的,但是不拘泥于Struts的传统固定用法,例如只用了一个自定义Action类,并且在form bean类的定义上也是开创性的,令人耳目一新,稍后将具体剖析一下。
  • Spring Framework 实际上是Expert One-on-One J2EE Design and Development 一书中所阐述的设计思想的具体实现。Spring Framework的功能非常多。包含AOP、ORM、DAO、Context、Web、MVC等几个部分组成。Web、MVC暂不用考虑,JpetStore 4.0用的是更成熟的Struts和JSP;DAO由于目前Hibernate、JDO、ibatis的流行,也不考虑,JpetStore 4.0用的就是ibatis。因此最需要用的是AOP、ORM、Context。Context中,最重要的是Beanfactory,它能将接口与实现分开,非常强大。目前AOP应用最成熟的还是在事务管理上。
  • ibatis 是一个功能强大实用的SQL Map工具,不同于其他ORM工具(如hibernate),它是将SQL语句映射成Java对象,而对于ORM工具,它的SQL语句是根据映射定义生成的。ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。有ibatis代码生成的工具,可以根据DDL自动生成ibatis代码,能减少很多工作量。


2. JpetStore简述

2.1. 背景

最初是Sun公司的J2EE petstore,其最主要目的是用于学习J2EE,但是其缺点也很明显,就是过度设计了。接着Oracle用J2EE petstore来比较各应用服务器的性能。微软推出了基于.Net平台的 Pet shop,用于竞争J2EE petstore。而JpetStore则是经过改良的基于struts的轻便框架J2EE web应用程序,相比来说,JpetStore设计和架构更优良,各层定义清晰,使用了很多最佳实践和模式,避免了很多"反模式",如使用存储过程,在java代码中嵌入SQL语句,把HTML存储在数据库中等等。最新版本是JpetStore 4.0。

2.2. JpetStore开发运行环境的建立

1、开发环境

  • Java SDK 1.4.2
  • Apache Tomcat 4.1.31
  • Eclipse-SDK-3.0.1-win32
  • HSQLDB 1.7.2

2、Eclipse插件

  • EMF SDK 2.0.1:Eclipse建模框架,lomboz插件需要,可以使用runtime版本。
  • lomboz 3.0:J2EE插件,用来在Eclipse中开发J2EE应用程序
  • Spring IDE 1.0.3:Spring Bean配置管理插件
  • xmlbuddy_2.0.10:编辑XML,用免费版功能即可
  • tomcatPluginV3:tomcat管理插件
  • Properties Editor:编辑java的属性文件,并可以预览以及自动存盘为Unicode格式。免去了手工或者ANT调用native2ascii的麻烦。

3、示例源程序

2.3. 架构

图1 JpetStore架构图
图1 JpetStore架构图

图1 是JPetStore架构图,更详细的内容请参见JPetStore的白皮书。参照这个架构图,让我们稍微剖析一下源代码,得出JpetStore 4.0的具体实现图(见图2),思路一下子就豁然开朗了。前言中提到的非传统的struts开发模式,关键就在struts Action类和form bean类上。

struts Action类只有一个:BeanAction。没错,确实是一个!与传统的struts编程方式很不同。再仔细研究BeanAction类,发现它其实是一个通用类,利用反射原理,根据URL来决定调用formbean的哪个方法。BeanAction大大简化了struts的编程模式,降低了对struts的依赖(与struts以及WEB容器有关的几个类都放在com.ibatis.struts包下,其它的类都可以直接复用)。利用这种模式,我们会很容易的把它移植到新的框架如JSF,spring。

这样重心就转移到form bean上了,它已经不是普通意义上的form bean了。查看源代码,可以看到它不仅仅有数据和校验/重置方法,而且已经具有了行为,从这个意义上来说,它更像一个BO(Business Object)。这就是前文讲到的,BeanAction类利用反射原理,根据URL来决定调用form bean的哪个方法(行为)。form bean的这些方法的签名很简单,例如:

 public String myActionMethod() {    //..work    return "success";  }  

方法的返回值直接就是字符串,对应的是forward的名称,而不再是ActionForward对象,创建ActionForward对象的任务已经由BeanAction类代劳了。

另外,程序还提供了ActionContext工具类,该工具类封装了request 、response、form parameters、request attributes、session attributes和 application attributes中的数据存取操作,简单而线程安全,form bean类使用该工具类可以进一步从表现层框架解耦。

在这里需要特别指出的是,BeanAction类是对struts扩展的一个有益尝试,虽然提供了非常好的应用开发模式,但是它还非常新,一直在发展中。

图2 JpetStore 4.0具体实现
图2 JpetStore 4.0具体实现

2.4. 代码剖析

下面就让我们开始进一步分析JpetStore4.0的源代码,为下面的改造铺路。

  • BeanAction.java是唯一一个Struts action类,位于com.ibatis.struts包下。正如上文所言,它是一个通用的控制类,利用反射机制,把控制转移到form bean的某个方法来处理。详细处理过程参考其源代码,简单明晰。
  • Form bean类位于com.ibatis.jpetstore.presentation包下,命名规则为***Bean。Form bean类全部继承于BaseBean类,而BaseBean类实际继承于ActionForm,因此,Form bean类就是Struts的 ActionForm,Form bean类的属性数据就由struts框架自动填充。而实际上,JpetStore4.0扩展了struts中ActionForm的应用: Form bean类还具有行为,更像一个BO,其行为(方法)由BeanAction根据配置(struts-config.xml)的URL来调用。虽然如此,我们还是把Form bean类定位于表现层。

    Struts-config.xml的配置里有3种映射方式,来告诉BeanAction把控制转到哪个form bean对象的哪个方法来处理。

    以这个请求连接为例http://localhost/jpetstore4/shop/viewOrder.do

    1. URL Pattern

                   

    此种方式表示,控制将被转发到"orderBean"这个form bean对象 的"viewOrder"方法(行为)来处理。方法名取"path"参数的以"/"分隔的最后一部分。

    2. Method Parameter

                   

    此种方式表示,控制将被转发到"orderBean"这个form bean对象的"viewOrder"方法(行为)来处理。配置中的"parameter"参数表示form bean类上的方法。"parameter"参数优先于"path"参数。

    3. No Method call

                   

    此种方式表示,form bean上没有任何方法被调用。如果存在"name"属性,则struts把表单参数等数据填充到form bean对象后,把控制转发到"success"。否则,如果name为空,则直接转发控制到"success"。

    这就相当于struts内置的org.apache.struts.actions.ForwardAction的功能

         

  • Service类位于com.ibatis.jpetstore.service包下,属于业务层。这些类封装了业务以及相应的事务控制。Service类由form bean类来调用。
  • com.ibatis.jpetstore.persistence.iface包下的类是DAO接口,属于业务层,其屏蔽了底层的数据库操作,供具体的Service类来调用。DaoConfig类是工具类(DAO工厂类),Service类通过DaoConfig类来获得相应的DAO接口,而不用关心底层的具体数据库操作,实现了如图2中{耦合2}的解耦。
  • com.ibatis.jpetstore.persistence.sqlmapdao包下的类是对应DAO接口的具体实现,在JpetStore4.0中采用了ibatis来实现ORM。这些实现类继承BaseSqlMapDao类,而BaseSqlMapDao类则继承ibatis DAO 框架中的SqlMapDaoTemplate类。ibatis的配置文件存放在com.ibatis.jpetstore.persistence.sqlmapdao.sql目录下。这些类和配置文件位于数据层
  • Domain类位于com.ibatis.jpetstore.domain包下,是普通的javabean。在这里用作数据传输对象(DTO),贯穿视图层、业务层和数据层,用于在不同层之间传输数据。

剩下的部分就比较简单了,请看具体的源代码,非常清晰。

2.5. 需要改造的地方

JpetStore4.0的关键就在struts Action类和form bean类上,这也是其精华之一(虽然该实现方式是试验性,待扩充和验证),在此次改造中我们要保留下来,即控制层一点不变,表现层获取相应业务类的方式变了(要加载spring环境),其它保持不变。要特别关注的改动是业务层和持久层,幸运的是JpetStore4.0设计非常好,需要改动的地方非常少,而且由模式可循,如下:

1. 业务层和数据层用Spring BeanFactory机制管理。

2. 业务层的事务由spring 的aop通过声明来完成。

3. 表现层(form bean)获取业务类的方法改由自定义工厂类来实现(加载spring环境)。


3. JPetStore的改造

3.1. 改造后的架构

其中红色部分是要增加的部分,蓝色部分是要修改的部分。下面就让我们逐一剖析。

3.2. Spring Context的加载

为了在Struts中加载Spring Context,一般会在struts-config.xml的最后添加如下部分:

   

Spring在设计时就充分考虑到了与Struts的协同工作,通过内置的Struts Plug-in在两者之间提供了良好的结合点。但是,因为在这里我们一点也不改动JPetStore的控制层(这是JpetStore4.0的精华之一),所以本文不准备采用此方式来加载ApplicationContext。我们利用的是spring framework 的BeanFactory机制,采用自定义的工具类(bean工厂类)来加载spring的配置文件,从中可以看出Spring有多灵活,它提供了各种不同的方式来使用其不同的部分/层次,您只需要用你想用的,不需要的部分可以不用。

具体的来说,就是在com.ibatis.spring包下创建CustomBeanFactory类,spring的配置文件applicationContext.xml也放在这个目录下。以下就是该类的全部代码,很简单:

public final class CustomBeanFactory { static XmlBeanFactory factory = null; static { Resource is = new InputStreamResource( CustomBeanFactory.class.getResourceAsStream("applicationContext.xml")); factory = new XmlBeanFactory(is); } public static Object getBean(String beanName){ return factory.getBean(beanName); } } 

实际上就是封装了Spring 的XMLBeanFactory而已,并且Spring的配置文件只需要加载一次,以后就可以直接用CustomBeanFactory.getBean("someBean")来获得需要的对象了(例如someBean),而不需要知道具体的类。CustomBeanFactory类用于{耦合1}的解耦。

CustomBeanFactory类在本文中只用于表现层的form bean对象获得service类的对象,因为我们没有把form bean对象配置在applicationContext.xml中。但是,为什么不把表现层的form bean类也配置起来呢,这样就用不着这CustomBeanFactory个类了,Spring会帮助我们创建需要的一切?问题的答案就在于form bean类是struts的ActionForm类!如果大家熟悉struts,就会知道ActionForm类是struts自动创建的:在一次请求中,struts判断,如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。因此formbean类的对象就不能由spring来创建,但是service类以及数据层的DAO类可以,所以只有他们在spring中配置。

所以,很自然的,我们就创建了CustomBeanFactory类,在表现层来衔接struts和spring。就这么简单,实现了另一种方式的{耦合一}的解耦。

3.3. 表现层

面分析到,struts和spring是在表现层衔接起来的,那么表现层就要做稍微的更改,即所需要的service类的对象创建上。以表现层的AccountBean类为例:

原来的源代码如下

    private static final AccountService accountService = AccountService.getInstance();   private static final CatalogService catalogService = CatalogService.getInstance();   

改造后的源代码如下

  private static final AccountService accountService = (AccountService)CustomBeanFactory.getBean("AccountService");   private static final CatalogService catalogService = (CatalogService)CustomBeanFactory.getBean("CatalogService"); 

其他的几个presentation类以同样方式改造。这样,表现层就完成了。关于表现层的其它部分如JSP等一概不动。也许您会说,没有看出什么特别之处的好处啊?你还是额外实现了一个工厂类。别着急,帷幕刚刚开启,spring是在表现层引入,但您发没发现:

  • presentation类仅仅面向service类的接口编程,具体"AccountService"是哪个实现类,presentation类不知道,是在spring的配置文件里配置。(本例中,为了最大限度的保持原来的代码不作变化,没有抽象出接口)。Spring鼓励面向接口编程,因为是如此的方便和自然,当然您也可以不这么做。
  • CustomBeanFactory这个工厂类为什么会如此简单,因为其直接使用了Spring的BeanFactory。Spring从其核心而言,是一个DI容器,其设计哲学是提供一种无侵入式的高扩展性的框架。为了实现这个目标,Spring 大量引入了Java 的Reflection机制,通过动态调用的方式避免硬编码方式的约束,并在此基础上建立了其核心组件BeanFactory,以此作为其依赖注入机制的实现基础。org.springframework.beans包中包括了这些核心组件的实现类,核心中的核心为BeanWrapper和BeanFactory类。

3.4. 持久层

在讨论业务层之前,我们先看一下持久层,如下图所示:

在上文中,我们把iface包下的DAO接口归为业务层,在这里不需要做修改。ibatis的sql配置文件也不需要改。要改的是DAO实现类,并在spring的配置文件中配置起来。

1、修改基类

所有的DAO实现类都继承于BaseSqlMapDao类。修改BaseSqlMapDao类如下:

public class BaseSqlMapDao extends SqlMapClientDaoSupport {   protected static final int PAGE_SIZE = 4;   protected SqlMapClientTemplate smcTemplate = this.getSqlMapClientTemplate();   public BaseSqlMapDao() {  } } 

使BaseSqlMapDao类改为继承于Spring提供的SqlMapClientDaoSupport类,并定义了一个保护属性smcTemplate,其类型为SqlMapClientTemplate。关于SqlMapClientTemplate类的详细说明请参照附录中的"Spring中文参考手册"

2、修改DAO实现类

所有的DAO实现类还是继承于BaseSqlMapDao类,实现相应的DAO接口,但其相应的DAO操作委托SqlMapClientTemplate来执行,以AccountSqlMapDao类为例,部分代码如下:

    public List getUsernameList() {     return smcTemplate.queryForList("getUsernameList", null);   }   public Account getAccount(String username, String password) {     Account account = new Account();     account.setUsername(username);     account.setPassword(password);     return (Account) smcTemplate.queryForObject("getAccountByUsernameAndPassword", account);   }   public void insertAccount(Account account) {   smcTemplate.update("insertAccount", account);   smcTemplate.update("insertProfile", account);   smcTemplate.update("insertSignon", account);   }   

就这么简单,所有函数的签名都是一样的,只需要查找替换就可以了!

3、除去工厂类以及相应的配置文件

除去DaoConfig.java这个DAO工厂类和相应的配置文件dao.xml,因为DAO的获取现在要用spring来管理。

4、DAO在Spring中的配置(applicationContext.xml)

                          org.hsqldb.jdbcDriver                               jdbc:hsqldb:hsql://localhost/xdb                               sa                                                                                                   classpath:comibatisjpetstorepersistencesqlmapdaosqlsql-map-config.xml                                                                                                                                                               

具体的语法请参照附录中的"Spring中文参考手册"。在这里只简单解释一下:

1. 我们首先创建一个数据源dataSource,在这里配置的是hsqldb数据库。如果是ORACLE数据库,driverClassName的值是"oracle.jdbc.driver.OracleDriver",URL的值类似于"jdbc:oracle:thin:@wugfMobile:1521:cdcf"。数据源现在由spring来管理,那么现在我们就可以去掉properties目录下database.properties这个配置文件了;还有不要忘记修改sql-map-config.xml,去掉

对它的引用。

2. sqlMapClient节点。这个是针对ibatis SqlMap的SqlMapClientFactoryBean配置。实际上配置了一个sqlMapClient的创建工厂类。configLocation属性配置了ibatis映射文件的名称。dataSource属性指向了使用的数据源,这样所有使用sqlMapClient的DAO都默认使用了该数据源,除非在DAO的配置中另外显式指定。

3. TransactionManager节点。定义了事务,使用的是DataSourceTransactionManager。

4. 下面就可以定义DAO节点了,如AccountDao,它的实现类是com.ibatis.jpetstore.persistence.sqlmapdao.AccountSqlMapDao,使用的SQL配置从sqlMapClient中读取,数据库连接没有特别列出,那么就是默认使用sqlMapClient配置的数据源datasource。

这样,我们就把持久层改造完了,其他的DAO配置类似于AccountDao。怎么样?简单吧。这次有接口了:) AccountDao接口->AccountSqlMapDao实现。

3.5. 业务层

业务层的位置以及相关类,如下图所示:

在这个例子中只有3个业务类,我们以OrderService类为例来改造,这个类是最复杂的,其中涉及了事务。

1、在ApplicationContext配置文件中增加bean的配置:

                                                                                                                                                                                                                                                                                           PROPAGATION_REQUIRED                                

定义了一个OrderService,还是很容易懂的。为了简单起见,使用了嵌套bean,其实现类是com.ibatis.jpetstore.service.OrderService,分别引用了ItemDao,OrderDao,SequenceDao。该bean的insert*实现了事务管理(AOP方式)。TransactionProxyFactoryBean自动创建一个事务advisor, 该advisor包括一个基于事务属性的pointcut,因此只有事务性的方法被拦截。

2、业务类的修改

以OrderService为例:

public class OrderService {    /* Private Fields */   private ItemDao itemDao;   private OrderDao orderDao;   private SequenceDao sequenceDao;   /* Constructors */   public OrderService() {   } /**  * @param itemDao 要设置的 itemDao。  */ public final void setItemDao(ItemDao itemDao) { this.itemDao = itemDao; } /**  * @param orderDao 要设置的 orderDao。  */ public final void setOrderDao(OrderDao orderDao) { this.orderDao = orderDao; } /**  * @param sequenceDao 要设置的 sequenceDao。  */ public final void setSequenceDao(SequenceDao sequenceDao) { this.sequenceDao = sequenceDao; } //剩下的部分 ……. } 

红色部分为修改部分。Spring采用的是Type2的设置依赖注入,所以我们只需要定义属性和相应的设值函数就可以了,ItemDao,OrderDao,SequenceDao的值由spring在运行期间注入。构造函数就可以为空了,另外也不需要自己编写代码处理事务了(事务在配置中声明),daoManager.startTransaction();等与事务相关的语句也可以去掉了。和原来的代码比较一下,是不是处理精简了很多!可以更关注业务的实现。


4. 结束语

ibatis是一个功能强大实用的SQL Map工具,可以直接控制SQL,为系统设计提供了更大的自由空间。其提供的最新示例程序JpetStore 4.0,设计优雅,应用了迄今为止很多最佳实践和设计模式,非常适于学习以及在此基础上创建轻量级的J2EE WEB应用程序。JpetStore 4.0是基于struts的,本文在此基础上,最大程度保持了原有设计的精华以及最小的代码改动量,在业务层和持久化层引入了Spring。在您阅读了本文以及改造后的源代码后,会深切的感受到Spring带来的种种好处:自然的面向接口的编程,业务对象的依赖注入,一致的数据存取框架和声明式的事务处理,统一的配置文件…更重要的是Spring既是全面的又是模块化的,Spring有分层的体系结构,这意味着您能选择仅仅使用它任何一个独立的部分,就像本文,而它的架构又是内部一致。

参考资料

关于作者

吴高峰,原一直在中兴通讯从事运营支撑产品的研发工作,对J2EE以及各种开源项目感兴趣。现在常德卷烟厂信息技术部从事EAI的建设。联系方式:shuwgf@21cn.com