你可以使用脚本来管理你的Windows网络。在本文中,我们将学习如何修改一个苦力或“返回所有值”脚本来列举Windows Management Instrumentation(WMI)类的任意属性的名称和值。 在本系列的前一篇文章WindowsManagement Instrumentation属性中,我们编写了一个名为DisplayClassProperties.vbs的脚本,该脚本显示了WMI类中所有的属性名称。这个脚本是这样的,它使用Win32_BootConfiguration作为我们的WMI别名中连接的类: Option Explicit On Error&nbs……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号

TechTarget
官方微博

TechTarget中国
你可以使用脚本来管理你的Windows网络。在本文中,我们将学习如何修改一个苦力或“返回所有值”脚本来列举Windows Management Instrumentation(WMI)类的任意属性的名称和值。
在本系列的前一篇文章WindowsManagement Instrumentation属性中,我们编写了一个名为DisplayClassProperties.vbs的脚本,该脚本显示了WMI类中所有的属性名称。这个脚本是这样的,它使用Win32_BootConfiguration作为我们的WMI别名中连接的类:
Option Explicit On Error Resume Next Dim strComputer Dim strWMINamespace Dim strWMIQuery Dim objWMIService Dim colItems Dim objItem strComputer = "." strWMINamespace = "rootCIMV2" strWMIQuery = ":Win32_BootConfiguration" Set objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery) WScript.Echo "Number of properties of " & strWMIQuery & " class is " & objWMIService.Properties_.count For Each objItem in objWMIService.Properties_ Wscript.Echo "Property: " & objItem.name Next |
当在Windows XP工作站上(将Cscript.exe预配置作为默认Windows 脚本主机)运行这个脚本(使用本地管理身份)时,得到了下面的结果:
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 Property: ScratchDirectory Property: SettingID Property: TempDirectory |
同时,在前一篇文章中也同样提及到,这个脚本非常容易被定制来用于显示任何WMI类的属性名称。比如,假设想要显示Win32_DiskPartition类的所有属性名称。只需要修改下面这一行:
strWMIQuery = ":Win32_BootConfiguration" |
改为
strWMIQuery = ":Win32_DiskPartition" |
接着,当再次运行我们的脚本时,得到下面的结果:
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_DiskPartition class is 34 Property: Access Property: Availability Property: BlockSize Property: Bootable Property: BootPartition Property: Caption Property: ConfigManagerErrorCode Property: ConfigManagerUserConfig Property: CreationClassName Property: Description Property: DeviceID Property: DiskIndex Property: ErrorCleared Property: ErrorDescription Property: ErrorMethodology Property: HiddenSectors Property: Index Property: InstallDate Property: LastErrorCode Property: Name Property: NumberOfBlocks Property: PNPDeviceID Property: PowerManagementCapabilities Property: PowerManagementSupported Property: PrimaryPartition Property: Purpose Property: RewritePartition Property: Size Property: StartingOffset Property: Status Property: StatusInfo Property: SystemCreationClassName Property: SystemName Property: Type |
显示每个属性的值
这个时候你可能会问:“怎么回事?所有的脚本所执行的就是显示一个类的每个属性名称。为什么不显示每个属性的值呢?”很好,这是个不错的问题!让我们看看是否可以修改这个脚本(重新使用Win32_BootConfiguration作为我们的类),这样脚本就不仅仅显示所有属性的名称而且还显示它们的值。实现这个步骤,我们可以改变这一行:
Wscript.Echo "Property: " & objItem.name |
改为:
Wscript.Echo "Property: " & objItem.name & vbTab & "Value: " & objItem.value |
当运行这个脚本时,得到这个结果:
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 Value: Property: Caption Value: Property: ConfigurationPath Value: Property: Description Value: Property: LastDrive Value: Property: Name Value: Property: ScratchDirectory Value: Property: SettingID Value: Property: TempDirectory Value: |
所有的值都是NULL,即空白。为什么呢?让我们看看这个行以弄清楚是怎么一回事:
Set objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery) |
插入每个变量的值,可以如下重写这一行:
Set objWMIService = GetObject("winmgmts:\.rootCIMV2:Win32_BootConfiguration") |
注意我们是连接到在我们的WMI别名字符串指定的WMI类(Win32_BootConfiguration),这样可以返回一个包含所有这个类属性的集合。然后,我们想要显示每个属性的名称和值。但是由于没有连接到这个类的某个特定的实例,所以所有的返回值都是NULL。在WMI词汇表上,一个实例是“代表属于一个指定类的实际管理对象”,并且“该实例包含实际的数据”,而这个实际数据就是我们想要的。那么该如何连接一个类的实例呢?
连接一个类的实例,必须使用类的主要属性来指定一个特定的实例。我们再次查询WMI词汇表,可以看到主要属性是“一个为类实例提供唯一标识符的属性”,并且在MSDN文件中“这些主要属性是标识为Key限定符”。让我们查阅一下MSDN的Win32_BootConfiguration类来了解这个类的主要属性。图1显示了这个页面中说明这个类的主要属性的部分:
图1:Win32_BootConfiguring类的主要属性
在MSND这个页面上,我们可以看到Win32_BootConfiguration类的主要属性是Name。这就意味着如果我们想要连接这个类的指定实例来获取类的每一个属性的值,我们需要在我们的WMI别名字符串中为这个属性指定一个值。换句话说,我们所需要做的就是改变这一行:
strWMIQuery = ":Win32_BootConfiguration" |
更改为:
strWMIQuery = ":Win32_BootConfiguration.Name='SOMETHING'" |
……这个“SOMETHING”就是这个类的指定实例的Name属性的值。
那么我们怎样才能找到这个类的指定实例的主要属性的值呢?其中一个方式就是使用Windows Management Instrumentation Tester (wbemtest.exe)。从命令提示符中输入wbemtest就可以启动。这样就出现了以下的窗口:
图2:Windows管理仪表检测
点击“Connect”按钮连接到rootcimv2命名空间
图3:连接到Win32_BootConfiguration类上
点击“Connect”返回主窗口,这时所有的按钮都可以使用了:
图4:连接到类后
现在点击“Enum Instances”按钮并输入类名称,这样你可以显示所有类的实例:
图5:显示类的实例
最后,点击“OK“显示类的所有实例,它们是以其主要属性(Name)方式枚举的:
图6:Win32_BootConfiguration的实例
当完成以上步骤之后,结果显示在我们的机器上这个类的实例只有一个并且这个实例的Name属性的值是“BootConfiguration”。这就意味着为了显示我们机器上的Win32_BootConfiguration类的实例的所有属性的值,我们所需要做的只是修改这一行:
strWMIQuery = ":Win32_BootConfiguration" |
为:
strWMIQuery = ":Win32_BootConfiguration.Name='BootConfiguration'" |
换句话说,我们所改进后的DisplayClassProperties.vbs脚本现在是这样的:
Option Explicit On Error Resume Next Dim strComputer Dim strWMINamespace Dim strWMIQuery Dim objWMIService Dim colItems Dim objItem strComputer = "." strWMINamespace = "rootCIMV2" strWMIQuery = ":Win32_BootConfiguration.Name='BootConfiguration'" Set objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery) WScript.Echo "Number of properties of " & strWMIQuery & " class is " & objWMIService.Properties_.count For Each objItem in objWMIService.Properties_ Wscript.Echo "Property: " & objItem.name & vbTab & "Value: " & objItem.value 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_BootConfiguration.Name='BootConfiguration' class is 9 Property: BootDirectory Value: WINDOWS Property: Caption Value: DeviceHarddisk0Partition1 Property: ConfigurationPath Value: WINDOWS Property: Description Value: DeviceHarddisk0Partition1 Property: LastDrive Value: C: Property: Name Value: BootConfiguration Property: ScratchDirectory Value: C:WINDOWSsystem32configsystemprofileLocal SettingsTemp Property: SettingID Value: Property: TempDirectory Value: C:WINDOWSsystem32configsystemprofileLocal SettingsTemp |
将这些信息放到表格,使它更清晰:
BootDirectory WINDOWS Caption DeviceHarddisk0Partition1 ConfigurationPath WINDOWS Description DeviceHarddisk0Partition1 LastDrive C: Name BootConfiguration ScratchDirectory C:WINDOWSsystem32configsystemprofileLocal SettingsTemp SettingID Value: TempDirectory C:WINDOWSsystem32configsystemprofileLocal SettingsTemp |
结论
我们可以看到这个简单的“返回所有值”脚本给了我们一些关于机器的有用信息。现在你自己可以尝试一下这个例子:尝试连接到Win32_DiskPartition类(如果你的机器上有一个以上的分区)的一个实例上,而不是连接到Win32_BootConfiguration类(这个类只有一个实例)的一个实例上。你可以这样做,首先使用wbemtest来显示这个类的实例(同时了解区别这些实例的主要属性),然后修改DisplayClassProperties.vbs脚本,这样它就会显示这个类的指定实例的属性和值(即,你所指定的磁盘分割区)。
作者
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的能源管理》等。
相关推荐
-
3种配置工具用于网络变更管理
网络配置工具试图解决痛点问题,这些工具试图减少数据中心和园区或广域网中与管理网络设备相关的辛苦且容易出错的任务 […]
-
2019年6个无线网络技术新兴趋势
又到了每年年终盘点的时候。现在是时候回顾一下网络行业,特别是我的专业领域:无线网络技术领域。与往年一样,今年我 […]
-
Big Switch公司为分组代理实现分析和记录能力
Big Switch Networks公司是一家基于软件提供白盒网络技术产品的供应商,该公司为其网络分组代理产 […]
-
区块链技术可以用于网络管理吗?没那么快
有IT分析人士称,区块链技术用于网络管理价值不大。他们还分析了物联网安全以及灾难发生时AI会发生的事。 Glo […]