微软Windows Server的图形界面接口在为网络管理提供便利的同时,因其消耗资源偏大、操作缓慢而颇受Windows管理员的微词,为提供一个图形管理界面之外的另一种选择,微软推出了集WMI的强大与命令行的简洁于一身的全新的命令行管理工具WMIC。加入了WMIC的Windows server 2003的命令行,据称可以完成几乎所有的管理任务。
以DOS起家的微软,最终靠图形界面一统了天下。传统的微软Windows Server的图形界面接口,在使系统管理简单易行的同时,其偏大的资源消耗与缓慢的操作速度,不但使众多IT Pro级系统管理员颇有微词,也使许多从Unix、NetWare转过来的系统管理员短时间内难以适从。虽然微软开发了WMI(Windows Management Instrumentation,Windows管理架构),并在Support Tools和Resource Kits提供了大量基于WMI的脚本让管理员使用,在命令行下管理服务器,但复杂的脚本编程同样令许多管理员却步,因为并非每个管理员都是脚本编程高手。从另一个角度讲,图形界面接口像一个黑盒子,使许多管理员丧失了量身定制管理任务的机会与乐趣,只能亦步亦趋地跟在越来越多的向导屁股后面,不停地点按着 "下一步"。
鉴于上述原因,微软在Windows Server 2003中,综合了WMI的强大与命令行的简洁,推出了全新的命令行管理工具WMIC,英文全称Windows Management Instrumentation Command-line,即Windows管理规范命令行。并声称使用WMIC,再配合其他现存的命令行工具,管理员几乎可以完成所有的管理任务,而不必再过多地依赖那些图形界面。
本文将对WMIC进行一个简单的介绍,由于笔者在撰稿时Windows Server 2003还没有正式发布,所以一切技术均以Windows Server 2003 RC2(Build 3718)为准,最终版本正式发布后可能会有变化。
背景:WMI、WBEM与CIM
关于WMI,我们在以前的文章中多次提及,并有过具体的应用,如《使用VS.NET实现WMI调用》(2003年1月刊),《限制域用户同时的多点登录》与《来一段脚本,Kill掉Mike的歌》(2003年2月刊)等。这里不准备再对其做详细的说明,只做一下简单的介绍。
WMI是微软基于Web的企业管理(WBEM)这一理念与标准的具体实现,并对CIM(Common Information Model,公用信息模型)提供完整的支持。WMI由符合CIM标准的对象储备库(Object Repository)和CIM对象管理器(WMI Object Manager)组成,其中对象储备库是对象定义的数据库,对象管理器负责处理储备库中对象的收集和操作,并从WMI提供程序(WMI Provider)收集信息。WMI提供程序在WMI与操作系统组件、应用程序和其他系统之间充当中间人角色,两者通过WMI提供程序交换信息。WMI提供程序的主要作用就是为WMI提供下层对象的相关信息,以及允许WMI通过它对下层对象进行管理。例如,注册表提供程序从
注册表中提供信息,而SNMP提供程序则从SNMP设备中提供数据和事件等。
WMI被许多计算机管理工具所用,如Microsoft Systems Management Server、Microsoft Health Monitor和Microsoft Operations Manager等。
WMIC概述
WMIC,是一款新出现在Windows Server 2003中的命令行管理工具。使用WMIC,你不但可以管理本地计算机,而且可以管理同一Windows域内的所有远程计算机(需要必要的权限),而被管理的远程计算机不必事先安装WMIC,只需要支持WMI即可。
WMIC有一个能够分析、解释和执行从命令行接收的别名(Alias)的引擎,它是一个可执行文件,名为WMIC.exe,这个文件通常位于"c://windows//
system32//wbem"文件夹中,该程序运行于用户当前登录的计算机上。任何对WMIC命令行的扩展性能都经过别名文件定义或者注册。别名又称友好名称(Friendly Names),通过MOF(Management Object Format,管理对象格式)格式定义。WMIC引擎接收到输入的命令后,先进行分析。如果命令是一个别名,WMIC会从当前操作命名空间(比如root //cli)调用该别名的定义,应用当前的环境设置(如目标命名空间),并将别名命令与它的原始命令进行对应,然后执行。
具体来说,你可以使用WMIC实现如下的管理任务:
1、本地计算机管理
2、远程单个计算机管理
3、远程多个计算机管理
4、使用远程会话的计算机管理(如Telnet)
5、使用管理脚本的自动管理
只有本地管理员组成员才能够启动WMIC,由于WMIC本质上是WMI的一个客户端,因此WMIC的安全受限于WMI的安全。当WMIC在一个远程会话中被使用时,如Telnet、终端服务等,缺省情况下,它使用发起此会话的用户的安全上下文。在使用WMIC管理一个远程计算机之前,WMIC会Ping 一下远程计算机以确定其状态。
在使用WMIC命令行时,可以随时使用"/?"来获得当前命令上下文的帮助信息。
执行模式
WMIC可以以两种模式执行:交互模式(Interactive mode)和非交互模式(Non-Interactive mode),经常使用Netsh命令行的管理员应该非常熟悉这两种模式。
交互模式。如果你在命令提示符下或通过"运行"菜单只输入WMIC,都将进入WMIC的交互模式,每当一个命令执行完毕后,系统还会返回到WMIC提示符下,如"Root//cli",交互模式通常在需要执行多个WMIC指令时使用。当你需要先执行"CONTEXT"命令查看环境变量,再使用"OS"命令查看当前操作系统消息时,就可以使用交互模式,如图1所示。交互模式有时还会对一些敏感的操作要求确认,比如删除操作,最大限度地防止管理员出现失误。
非交互模式。非交互模式是指将WMIC指令直接作为WMIC的参数放在WMIC后面,当指令执行完毕后再返回到普通的命令提示符下,而不是进入到 WMIC上下文环境中。WMIC的非交互模式主要用于
批处理或者其他一些脚本文件中,比如上面的"OS"命令在非交互模式下就可以使用下面的方式执行:
wmic os /?
使用WMIC管理系统
WMIC包含了众多的开关、命令,以及内置的别名,详细内容见表1、表2和表3。下面让我们通过具体的实例体验一下WMIC的强大功能。
简单管理任务
使用WMIC,可以完成一些简单的管理任务,比如查看硬件与操作系统信息。如果不使用WMIC,查询硬件如BIOS、
CPU、操作系统等信息,通常是使用系统提供的API接口进行编程,或者编写一小段脚本程序,是一件比较麻烦的事情,如表4所示就是一个查询BIOS信息的传统VBscript脚本。如果使用WMIC,那情况就大不相同,只需要一个简单命令就能搞定:
wmic bios list full
结果如图2所示。
大家可能注意到了上面命令行中还有两个参数list和full。list决定显示的信息格式与范围,它有Brief、Full、Instance、 Status、System、Writeable等多个参数,full只是它的一个参数,也是list的缺省参数,表示显示所有的信息。其他几个参数顾名思义,如Brief表示只显示摘要信息,Instance表示只显示对象实例,Status表示显示对象状态,Writeable表示只显示该对象的可写入的属性信息等。
在管理过程中,尤其是进行远程系统管理的时候,管理员多数喜欢列一下进程列表,以了解当前系统中正在运行的程序。下面的命令就可以达到这一目的:
wmic process list brief
它会显示当前所有进程的一些摘要信息,比如进程名称、进程ID和优先级等。在我以前的文章《来一段脚本,Kill掉Mike的歌》中,就可以使用这一命令代替那个list.vbs脚本。
复杂管理任务
WMIC在完成复杂管理任务方面也是非常出色的,先看一下查询事件日志并生成结果文件的例子:
以下是引用片段: WMIC /node:"dc2" /user:"mytest" NTEVENTswheres"eventtype<3 and eventtype>0 AND logfile=/’Application/’" GET Logfile, SourceName, Eventtype, Message, TimeGenerated /FORMAT:htable:"sortby=EventType">c://Application.htm |
这行长长的命令表示从计算机DC2中查询应用程序日志信息,事件类型为小于3且大于0的事件,通常是警告与错误事件。因为是远程计算机,所以命令中使用了"/node" 和"/user"开关。输出结果保存为网页格式,保存在"c://Application.htm"文件中,并以事件类型进行排序。当你使用上面的命令时,因为使用了"/user"开关,所以系统会首先提示你输入与该用户匹配的密码,如图3所示,查询结果如图4所示。
同样,你还可以使用WMIC同时重新启动多台被管理的服务器或工作站,命令如下:
WMIC /NODE:@"c://MyServerList.txt" OSswheres(Primary="TRUE") CALL Win32ShutDown 6
WMIC会首先从"c://MyServerList.txt"中取得服务器名称列表,这些服务器名称在文件中以逗号分割,如"dc1,dc2"。要注意的是,在/node开关后面使用服务器列表文件时,一定要在文件名的前面加上"@"引导符。该命令执行结果如图5所示,在执行重新启动过程中,WMIC 会返回详细的执行结果。
WMIC还可以从Active Directory中取得数据,下面是一个从Active Directory中取得用户信息的例子,取得的用户信息包括显示名称、UPN名称、名称和创建时间等,返回结果如图6所示:
以下是引用片段: WMIC/NAMESPACE://root//directory//ldap PATH ds_user GET ds_displayname, ds_userprincipalname, ds_cn, ds_name, ds_whencreated /VALUE |
总结
WMIC是我所见到的基于windows平台的功能最强大的命令行工具,但同样也是最复杂的工具。尤其是在完成复杂的管理任务时,你需要对WMI的Win32类的属性及方法非常熟悉才可能做到游刃有余。因此,在希望熟悉运用WMIC之前,建议先学习 WMI,熟悉其Win32类的各种属性及方法。国内现在出过几本不错的WMI书籍,你也可以到微软的MSDN网站 (MSDN.microsoft.com)上查询这方面的信息。
有了WMIC的加入,命令行们应该可以大声说:"虽然我很丑,但是我很强大"了