xiezuoru / 脚本技术 / WMI脚本初级读本

分享

   

WMI脚本初级读本

2006-06-12  xiezuoru
译者按]本人今日着迷于脚本,成天呆在Microsoft的网站上。遂决定将部分文件翻译过来,以兹共享。也希望大家能加入这个行列。另外,在翻译的过程中,只会注重重要的部分,某些无所谓的或者客套的东西就不花时间了,请原谅。还有,翻译水平和技术水平有限,不要见笑。


WMI脚本初级读本:第一部分
Greg Stemp, Dean Tsaltas, and Bob Wells
Microsoft Corporation

Ethan Wilansky
Network Design Group

June 13, 2002

摘要:Scripting Guys的第一个Scripting Clinic专栏。本文介绍了如何使用WMI脚本库创建有用的Windows系统管理脚本

WMI(Windows® Management Instrumentation)是Microsoft保持得最好的秘密,或者曾经被这样告知过。就是这样,没错的。WMI是Windows的主要管理允许技术。这对你意味着什么?好,如果你管理者Windows服务器和工作站,或者你创建Windows管理程序,你需要知道WMI.本文是教授WMI系列的第一部分,说准确点,是怎样使用WMI脚本库赖创建Windows大量的系统管理脚本。

(以下省略。主要是一些客套,感谢Andrew Clinick,不知是什么人。然后是介绍作者自己, Scripting Guys以及他们的业务)

What Is WMI?
WMI最初是作为Windows NT4.0 SP4的附加组件发布的,现在已成为Windows 2000,Windows XP,Windows.NET操作系统服务器家族的核心管理允许(management-enabling)技术。基于产业标准(由分布式管理任务组DMTF(Distributed Management Task Force )监督),WMI可以访问,配置,管理和检测所有-好,几乎所有-的Windows资源。

为掌握WMI的强大功能,想想你在去年甚至是今天是如何管理和检测Windows工作站和服务器的。可能你曾经用过或正在使用大量的图形界面的管理工具管理Windows资源,例如磁盘,事件日志,文件文件夹,文件系统网络组件,操作系统设置,性能数据,打印机,等等

尽管图形化工具提供了功能管理解决方案,但他们的共同点就是依赖Win32应用程序可编程接口(API)来访问和管理Windows资源。为什么?因为编程访问Windows资源的唯一方法就是通过Win32 API.这样Windows系统管理员没有简易的方法通过脚本语言来实现自动化的通用管理任务,因为大多数的脚本语言不能直接调用Win32 API.WMI改变了这一点,它提供了一个统一的模型和框架,通过这所有的Windows资源被暴露和描述。最好的事,系统管理员可以使用WMI脚本库来创建系统管理脚本,从而管理任何Windows资源。

使用Windows Script Host 和Microsoft Visual Basic® Scripting Edition (VBScript),或者任何支持COM自动化的脚本语言(例如,ActiveState Corporation‘s ActivePerl),可以为管理和自动化你的企业系统,应用程序网络书写下列所述的脚本:

· Windows .NET Server, Windows XP Professional, and Windows 2000系统管理. 可以书写脚本来获取性能数据,管理事件日志,文件系统,打印机,矗立起,注册表,等等(下面的自己翻译吧 scheduler, security, services, shares, and numerous other operating system components and configuration settings.)

· 网络管理. 可以书写脚本来管理网络服务,例如DNS, DHCP, and SNMP-enabled devices.

· 实时监控. 通过使用事件订阅(event subscriptions),可以书写脚本来对以下资源监控并做出回应,如事件日志,文件系统和注册表更改,以及其他实时的操作系统更改。从概念上讲,WMI事件订阅和通告之于WMI与SNMP中段之于SNMP相同。

· Windows .NET Enterprise Server 管理. 可以书写脚本来管理Microsoft® Application Center, Operations Manager, Systems Management Server, Internet Information Server, Exchange Server, and SQL Server.

Quick Start to WMI Scripting
为对WMI脚本有初步了解,首先举个例子,获取远程基于Windows平台的电脑上安装的物理内存。在WMI之前,这个任务是不可能通过脚本简单地完成的,除非借助第三方的工具。事实上,在WMI之前,为以获取电脑安装物理内存的唯一方法就是通过System Properties对话框。现在,假定WMI安装在目标电脑并且你有权限操作目标电脑,就可以利用Listing 1那样简单的脚本完成该任务。

Listing 1. Retrieving total physical memory using WMI and VBScript

strComputer = "atl-dc-01"

Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration")

For Each wbemObject In wbemObjectSet
  WScript.Echo "Total Physical Memory (kb): " & wbemObject.TotalPhysicalMemory
Next


将上述脚本复制到文本编辑器,并且改变strComputer变量的值,然后保存以.vbs的扩展保存文件。按图一所示运行脚本



Figure 1. GetMemory.vbs output

神奇的现象出现了,你应该看到了目标电脑的物理内存。

假定你想获取远程电脑的所有服务的名字,状态和启动类型。见Listing 2的样例。注意Listing 2与Listing 1的步骤一致。

Listing 2. Retrieving services information using WMI and VBScript

strComputer = "atl-dc-01"

Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_Service")

For Each wbemObject In wbemObjectSet
  WScript.Echo "Display Name: " & wbemObject.DisplayName & vbCrLf & _
         "  State:   " & wbemObject.State    & vbCrLf & _
         "  Start Mode: " & wbemObject.StartMode
Next


运行Listing 2的输出参见Figure 2.



Figure 2. GetServices.vbs output

假设你的兴趣不在于服务,而在于Windows事件日志。使用Listing 1的脚本模板,Listing 3可以轻易的实现。必须指出的事,如果日志包含上千条记录,可能会花费大量的时间运行。

Listing 3. Reading Windows event log records

strComputer = "atl-dc-01"

Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_NTLogEvent")

For Each wbemObject In wbemObjectSet
  WScript.Echo "Log file:    " & wbemObject.LogFile    & vbCrLf & _
         "Record Number:  " & wbemObject.RecordNumber  & vbCrLf & _
         "Type:      " & wbemObject.Type      & vbCrLf & _
         "Time Generated: " & wbemObject.TimeGenerated & vbCrLf & _
         "Source:     " & wbemObject.SourceName   & vbCrLf & _
         "Category:    " & wbemObject.Category    & vbCrLf & _
         "Category String: " & wbemObject.CategoryString & vbCrLf & _
         "Event:      " & wbemObject.EventCode   & vbCrLf & _
         "User:      " & wbemObject.User      & vbCrLf & _
         "Computer:    " & wbemObject.ComputerName  & vbCrLf & _
         "Message:     " & wbemObject.Message    & vbCrLf
Next


仔细考察Listings 1, 2和3,可以得出两个非常重要的结论。第一个结论是三个脚本执行了相同的三个步骤:脚本连接WMI,获取WMI管理资源,然后返回资源属性。第二个重要的结论是唯一改变的是类名(即,Win32_LogicalMemoryConfiguration, Win32_Service和 Win32_NTLogEvent)和资源的相应属性。

三步骤对WMI脚本是通用的。下面仔细考察每一个步骤。

Step One: 连接WMI Service
任何脚本的第一个步骤就是与目标电脑上的Windows管理服务建立连接。连接本地或远程电脑的WMI很简单,调用VBScript的Getobject函数,其参数为WMI脚本库的标记名(即"winmgmts:")和目标电脑名

用这种方式连接WMI,会返回对SWbemServices对象的引用,在Listings 1, 2, 和 3中用变量名wbemServices引用。SWbemServices是在WMI脚本库中定义的。WMI脚本库提供通用功能对象集,脚本使用他们来访问WMI infrastructure。一旦引用了SWbemServices 对象,就可以调用SWbemServices提供的任何方法。InstancesOf就是这样一种方法

Step Two: 获取WMI管理资源
不可否认,第二步绝大程度上取决于要执行的任务。在获取有关WMI管理资源的信息时,第二步很简单,调用SWbemServices对象的InstancesOf方法。如同名字暗示的那样,InstancesOf 返回所有的由资源类名标识的管理资源。InstancesOf按SWbemObjectSet集合的方式返回请求的资源。再Listing 1,2和3中,使用变量名wbemObjectSet来引用。SWbemObjectSet是WMI脚本库定义的另外一个脚本对象

Step Three: 显示WMI管理资源的属性
最后一步是列举SWbemObjectSet 集合的内容。SWbemObjectSet 内的每一项是一个 SWbemObject (WMI脚本库的对象),他表示请求资源的单个实例。可以使用SWbemObject 来访问管理资源类定义中定义的方法和属性。

但如果获取WMI信息的脚本步骤是相同的,Win32_LogicalMemoryConfiguration, Win32_Service, 和 Win32_NTLogEvent的类是什么呢?更进一步,他们来自哪里,还有其他什么类,怎样使用他们呢?问题的答案在与下述的WMI体系的组件。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章