标题：wmic
什么是WMIC？
WMIC扩展WMI（Windows Management Instrumentation，Windows管理规范） ，提供了从命令行接口和批命令脚本执行系统管理的支持。在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的类保存在模式的默认名称空间，或者说root\cli角色。角色可以简单地看成专门用来支持WMIC的另一个WMI名称空间。默认角色root\cli连接到root\cimv2名称空间，操作root\cimv2之内的类。虽然使用WMIC时一般不需要用到CIM Studio，但CIM Studio可以用来方便地查看root\cli名称空间
你可以向root\cli名称空间和其他名称空间加入新的别名，还可以用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返回每一个命令的错误信息。利用/node开关可以访问远程机器，/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="work01\User1",variablevalue= "%programfiles%\prog01" 创建一个名字为Progloc的变量，把它的值设置为Program Files文件夹的一个子文件夹，把这个变量加入到Work01工作组计算机User1帐户。 
Delete environment where(name= "progloc") delete 删除Progloc环境变量。测试WMIC命令时，为了防止意外地删除，可以使用/interactive:on全局开关，这时删除之前会要求确认。 
Get partition get bootpartition, description, 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 offif "%1"=="" goto msgif "%2"=="" goto singlewmic /node:%1, %2 cpu get name, caption, maxclockspeed, systemname /format:textvaluelist.xslgoto end :single wmic /node:%1 cpu get name, caption, maxclockspeed,systemname /format:textvaluelist.xslgoto end:msgecho 必须指定至少一台计算机的名字。 :end 
如前所述，WMIC命令的输出结果不仅可以发送到控制台，还可以发送到XML或HTML、MOF（Managed Object Format）格式的文件。在安装了WMI的计算机上，MOF是WMI数据库中类和类实例的原始保存形式。下面的例子显示了如何把MACHINE4处理器信息的查询结果输出到HTML文件，/output全局开关要求WMIC把输出发送到file1.htm，/format开关要求WMIC把原始的XML输出转换成HTML格式。用来转换格式的XSL样式文件既可以是自定义的，也可以是任何安装了WMIC的机器上\%systemroot%\system32\wbem文件夹下面的任意XSL文件。例如，利用csv.xsl样式文件可以把输出结果转换成CSV格式，利用htable.xsl样式可以构造出一个包含结果数据的表格是在浏览器中打开的file1.htm文件。wmic /node:MACHINE4 /output:e:\file1.htm cpu get description,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命令行环境需要一段时间，但只要你熟悉了它，一个系统管理的全新境界将展现在你的面前。