这一章将学习如何显示Windows管理检测(WMI)类的所有属性,它是关于如何使用脚本管理Windows网络的技巧之一,原文发表在WindowsNetworking.com。 回顾一下这一系列专题的第三章了解WMI,我们开发了下面的命名为displayTimeZone.vbs 的简单脚本,它显示你的主机上当前设置的时区: Option Explicit On Error Resume Next Dim strComputer Dim strWMINamespace Dim strWMIQuery Dim objWM……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
这一章将学习如何显示Windows管理检测(WMI)类的所有属性,它是关于如何使用脚本管理Windows网络的技巧之一,原文发表在WindowsNetworking.com。
回顾一下这一系列专题的第三章了解WMI,我们开发了下面的命名为displayTimeZone.vbs 的简单脚本,它显示你的主机上当前设置的时区:
Option Explicit On Error Resume Next Dim strComputer Dim strWMINamespace Dim strWMIQuery Dim objWMIService Dim colItems Dim objItem strComputer = "." strWMINamespace = "rootCIMV2" strWMIQuery = "SELECT * FROM Win32_TimeZone" Set objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace) Set colItems = objWMIService.ExecQuery(strWMIQuery) For Each objItem In colItems WScript.Echo objItem.Caption Next |
当我运行这个脚本时,我得到下面这样的结果:
C:scripts>DisplayTimeZone.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. (GMT-06:00) Central Time (US & Canada) |
我是怎么知道Win32_TimeZone类的包含我想要显示信息的标题(Caption)属性的呢?我是通过阅读MSDN上关于Win32_TimeZone WMI类的描述而知道的。事实上,MSDN的页面告诉我们描述(Description)属性返回的信息基本上与标题(Caption)属性的是一样的,所以我可以把其中的一行:WScript.Echo objItem.Caption修改为WScript.Echo objItem.Description,这样也可以获得相同的结果。
MSDN这一页还告诉了我们关于Win32_TimeZone类的哪些信息呢?比如说,如果我想找出哪个月的夏令时在我们的机器上开始生效呢?快速地阅读完这一页后,我就可以找到关于DaylightMonth属性的信息:
DaylightMonth Data type: uint32 Access type: Read-only Month when the transition from standard time to daylight saving time occurs on an operating system. Value Meaning 1 0x1 January 2 0x2 February 3 0x3 March 4 0x4 April 5 0x5 May 6 0x6 June 7 0x7 July 8 0x8 August 9 0x9 September 10 0xA October 11 0xB November 12 0xC December |
为了使用这些信息,我只需要简单的把WScript.Echo objItem.Caption改成WScript.Echo objItem.DaylightMonth,然后运行我的脚本就可以得到下面的结果:
C:scripts>DisplayTimeZone.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. 3 |
可以很肯定的说,夏令在今年的三月份而不是四月份开始。
枚举一个类的属性
现在我们可以继续我们的学习过程,我们修改WScript.Echo objItem.<property>的<property>,并且逐渐地把Win32_TimeZone类的属性一个一个地显示出来,但是,还有比这更简单的方法吗?有没有可能在一个简单的脚本里显示这个类的所有属性,而不必在脚本中对它进行命名?当然可以!但是在我们这样做之前,让我们首先尝试去枚举这个类的属性个数。我们可以这样做:
Option Explicit On Error Resume Next Dim strComputer Dim strWMINamespace Dim strWMIQuery Dim objWMIService Dim colItems Dim objItem strComputer = "." strWMINamespace = "rootCIMV2" strWMIQuery = ":Win32_TimeZone" Set objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery) WScript.Echo "Number of properties of " & strWMIQuery & " class is " & objWMIService.Properties_.count |
这就是我们运行这个新的、我们称之为DisplayClassProperties.vbs的脚本:
C:scripts>DisplayClassProperties.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. Number of properties of :Win32_TimeZone class is 24 |
在Win32_TimeZone的MSDN页面快速浏览属性记录告诉我们这是正确的,即Win_32TimeZone类一共有24个属性。
这个新的脚本是如何工作的呢?首先你应该注意到的是,它没有连接到本地计算机(“.”)的默认命名空间“rootCIMV2”)上的,而是直接连接到计算机的Win32_TimeZone类上的。换句话说,下面这一行:
Set objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery) ...could be replaced by this: Set objWMIService = GetObject("winmgmts:\.rootCIMV2:Win32_TimeZone") |
它将执行相同的操作。另外一个你将注意到的是在脚本的最后有一行看起来很有趣的东西:
objWMIService.Properties_.count |
这个很怪异,不是吗?我们在个系列专题中的第一篇文章“使用脚本管理Windows网络的基本知识”中了解到了关于属性(比如<object>.<property>)和方法(比如<object>.<method>),它是有两个周期而不是一个。这里究竟发生了什么呢?让我们重新回到这一行:
Set objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery) |
我们所看到的跟下面这个是相同的:
Set objWMIService = GetObject("winmgmts:\.rootCIMV2:Win32_TimeZone") |
在这个WMI语句中的名字对象是winmgmts:\.rootCIMV2:Win32_TimeZone,并且它定义了WMI类的路径,这个类正是我们所希望获得访问权限的,同时当你在这个名字对象上使用GetObject方法时,它将返回一个SWbmObject对象,然后将此对象使用Set语句赋予objWMIService变量。(更准确的说,GetObject方法返回一个COM组件提供的SWbmObject对象的一个引用,但是它需要先声明这个技术,除非你是在试图给人留下不好的印象)。
因此,换言之,当这个语句被执行时:
Set objWMIService = GetObject("winmgmts:\.rootCIMV2:Win32_TimeZone") |
……我们获得一个返回的SWmebObject对象。现在对象有了属性,那么SWmebObject对象会有什么属性呢?它拥有的一个属性是Properties_,使用标准的<object>.<properties>标记表示一个SWebmObject对象的Properties_ 属性是通过SWebmObject.Properties指定的(没错,下划线是属性命名的一部分)。你可以在MSDN上阅读更多的关于SWebmObject的SWbemObject.Properties_属性, 然后你就可以知道这个属性是“当前类或者实例的一个属性集合”,或者换言之,SWbemObject.Properties_属性是一个集合。并且要谨记一点,集合是一类包含着多元素的对象(它可以是对象或者属性,但不能是方法)。
因此,换言之,SWbemObject.Properties_实际上就是一个集合(一类对象)。既然对象能够有属性,那么这个对象也可以有属性。一个集合能拥有的一个属性是.count,它返回对象属性的个数。例如,<collection>.<count>返回了集合中的元素个数。因此,这也就意味着SWbemObject.Properties_.count是SWbemObject.Properties_对象的.count属性。因此,这里有2个间隔符,而不是通常情况的只有1个间隔符语法:<object>.<property>。
至少,这就是我所理解的东西,但请记住我不是个开发人员——我只是个跟你一样学习如何使用脚本并用来谋生的一样的人罢了。
显示类的属性
现在我们可以枚举(返回数量)Win32_TimeZone类的属性了,那么我们又将如何做才能返回属性的实际名称呢?通过把下面这一行附加到我们的DisplayClassProperties.vbs脚本最后:
For Each objItem in objWMIService.Properties_ Wscript.Echo "Property: " & objItem.name Next |
当我们运行我们的脚本时,我们将得到这样的结果:
C:scripts>DisplayClassProperties.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. Number of properties of :Win32_TimeZone class is 24 Property: Bias Property: Caption Property: DaylightBias Property: DaylightDay Property: DaylightDayOfWeek Property: DaylightHour Property: DaylightMillisecond Property: DaylightMinute Property: DaylightMonth Property: DaylightName Property: DaylightSecond Property: DaylightYear Property: Description Property: SettingID Property: StandardBias Property: StandardDay Property: StandardDayOfWeek Property: StandardHour Property: StandardMillisecond Property: StandardMinute Property: StandardMonth Property: StandardName Property: StandardSecond Property: StandardYear |
重新查阅我们的在MSDN上描述Win32_TimeZone 类的页面,我们可以看到上面所有的类的属性名称都已经成功的显示了。
结论
这种方法的作用在于它能把任何WMI类的属性名称列举出来,这样我们就可以知道关于这个类的更多的东西。(记住,在这一系列的第三章了解 WMI中,我们已经知道如何列举命名空间下的所有WMI类的名称,并且通过这个清单,我们可以继续探索,看看我们可以使用WMI来做管理哪些东西。)
例如,如果我们我们要列举了Win32_BootConfiguration WMI类的属性。如果是使用我们的DisplayClassProperties.vbs脚本来完成,我们只需改变这一行就可以:
strWMIQuery = ":Win32_TimeZone" |
接着往下是:
strWMIQuery = ":Win32_BootConfiguration" |
当我们做了这样的改变并重新运行了我们的脚本,我们得到这样的结果:
C:scripts>DisplayClassProperties.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. Number of properties of :Win32_BootConfiguration class is 9 Property: BootDirectory Property: Caption Property: ConfigurationPath Property: Description Property: LastDrive Property: Name Value: Property: ScratchDirectory Property: SettingID Property: TempDirectory |
我建议你把这文章与这一系列的第三章了解WMI结合起来去自己独立地探索WMI类和它们的属性。同时我们将在这一系列专题将来的文章中看到更多关于使用WMI管理Windows计算机更强大的功能。
作者
Mitch Tulloch是一个作家、培训师和Windows服务器操作系统、IIS管理、网络故障修复和安全方面的专业顾问。他已经写了15本书,其中包括:Microsoft Encyclopedia of Networking (Microsoft Press),Microsoft Encyclopedia of Security (Microsoft Press),Windows Server Hacks (O'Reilly),Windows Server 2003 in a Nutshell (O'Reilly),Windows 2000 Administration in a Nutshell (O'Reilly),and IIS 6 Administration (Osborne/McGraw-Hill)。Mitch居住在加拿大的Winnipeg,你可以他的网站www.mtit.com查到更多关于他的书的信息。
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
梭子鱼Web应用防火墙助力网站数据采集管理 有效预防攻击
网站数据持续地被脚本、bots病毒和其它一些自动执行的程序采集,这有时候是件好事,有时候却并非如此,通常介于两者之间。
-
使用脚本管理Windows网络(更新版)
“授人以鱼,不如授人以渔。”的确如此。而在忙碌的IT世界里,这也适用于脚本化管理:“给人一个有用的脚本,不如教他自己写脚本。”
-
使用脚本管理Windows 网络 第十三部分:返回所有值的脚本
在本系列的前一篇文章WindowsManagement Instrumentation属性中,我们编写了一个名为DisplayClassProperties.vbs的脚本,该脚本显示了WMI类中所有的属性名称。
-
使用脚本管理Windows 网络 第十一部分:更多的远程脚本技巧
本章将学习远程脚本技巧和本地管理员如何使用Windows Management Instrumentation Command-line (WMIC)进行远程查询。