使用脚本管理Windows 网络 第十三部分:返回所有值的脚本

2009-1-12    | |
打印本文章
RSS

导读:本文为使用脚本管理Windows网络的第十三部分:返回所有值的脚本。

关键词:Windows 网络管理 脚本

正在加载数据...

【TechTarget中国原创】你可以使用脚本来管理你的Windows网络。在本文中,我们将学习如何修改一个苦力或“返回所有值”脚本来列举Windows Management Instrumentation(WMI)类的任意属性的名称和值。

在本系列的前一篇文章WindowsManagement Instrumentation属性中,我们编写了一个名为DisplayClassProperties.vbs的脚本,该脚本显示了WMI类中所有的属性名称。这个脚本是这样的,它使用Win32_BootConfiguration作为我们的WMI别名中连接的类:

【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 = "\root\CIMV2"
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:\\.\root\CIMV2:Win32_BootConfiguration")

注意我们是连接到在我们的WMI别名字符串指定的WMI类(Win32_BootConfiguration),这样可以返回一个包含所有这个类属性的集合。然后,我们想要显示每个属性的名称和值。但是由于没有连接到这个类的某个特定的实例,所以所有的返回值都是NULL。在WMI词汇表上,一个实例是“代表属于一个指定类的实际管理对象”,并且“该实例包含实际的数据”,而这个实际数据就是我们想要的。那么该如何连接一个类的实例呢?

连接一个类的实例,必须使用类的主要属性来指定一个特定的实例。我们再次查询WMI词汇表,可以看到主要属性是“一个为类实例提供唯一标识符的属性”,并且在MSDN文件中“这些主要属性是标识为Key限定符”。让我们查阅一下MSDN的Win32_BootConfiguration类来了解这个类的主要属性。图1显示了这个页面中说明这个类的主要属性的部分:

 使用脚本管理Windows网络

图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就可以启动。这样就出现了以下的窗口:

 使用脚本管理Windows网络

图2:Windows管理仪表检测

点击“Connect”按钮连接到root\cimv2命名空间

使用脚本管理Windows网络 

图3:连接到Win32_BootConfiguration类上

点击“Connect”返回主窗口,这时所有的按钮都可以使用了:

使用脚本管理Windows网络 

图4:连接到类后

现在点击“Enum Instances”按钮并输入类名称,这样你可以显示所有类的实例:

使用脚本管理Windows网络 

图5:显示类的实例

最后,点击“OK“显示类的所有实例,它们是以其主要属性(Name)方式枚举的:

 使用脚本管理Windows网络

图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 = "\root\CIMV2"
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: \Device\Harddisk0\Partition1
Property: ConfigurationPath     Value: \WINDOWS
Property: Description   Value: \Device\Harddisk0\Partition1
Property: LastDrive     Value: C:
Property: Name  Value: BootConfiguration
Property: ScratchDirectory      Value: C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp
Property: SettingID     Value:
Property: TempDirectory Value: C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp

将这些信息放到表格,使它更清晰:

BootDirectory \WINDOWS
Caption \Device\Harddisk0\Partition1
ConfigurationPath \WINDOWS
Description \Device\Harddisk0\Partition1
LastDrive C:
Name BootConfiguration
ScratchDirectory C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp
SettingID Value:
TempDirectory C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp

结论

我们可以看到这个简单的“返回所有值”脚本给了我们一些关于机器的有用信息。现在你自己可以尝试一下这个例子:尝试连接到Win32_DiskPartition类(如果你的机器上有一个以上的分区)的一个实例上,而不是连接到Win32_BootConfiguration类(这个类只有一个实例)的一个实例上。你可以这样做,首先使用wbemtest来显示这个类的实例(同时了解区别这些实例的主要属性),然后修改DisplayClassProperties.vbs脚本,这样它就会显示这个类的指定实例的属性和值(即,你所指定的磁盘分割区)。

查看全文
 
在使用DameWare Mini Remote Control工具远程管理局域网中的Winodws XP SP2工作站时,发现系统总是弹出拒绝远程连接的提示,对此我们该如何解决呢?
 
如何检查一个运行Windows Server 2003的计算机的网络IP配置如何通过执行一些简单的命令行(CL)PING测试来诊断网络连接问题?
 
在网络故障修复中使用PING命令将有助于减小Windows PC连接问题原因的分析范围。本文中所介绍的TCP/IP诊断方法将有利于我们了解PING的使用语法……
 
在网络故障修复中使用PING命令将有助于减小Windows PC连接问题原因的分析范围。本文中所介绍的TCP/IP诊断方法将有利于我们了解PING的使用语法……
 
问:在哪里我能找到升级Windows Server 2003到 Windows Server 2008的分步指南?您能给我一些建议吗?
VPN(Virtual Private Network),即“虚拟专用网络”,是对企业内部网的扩展。虚拟专用网可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并保证数据的安全传输。
网络是复杂的,网络出现故障的原因是多种多样的,那么我们该如何诊断网络故障,修复网络故障的方法有哪些呢,以及如何来进行网络故障的修复呢?在修复网络故障的过程中,我们常常会遇到许多问题,那么有没有什么可以遵循的原则呢?
网络管理员也负责网络备份、测试备份和灾难恢复过程。这对于电源或硬件故障、数据和/或网络问题以及物理灾难问题的恢复是至关重要的。
最新更新
专家答疑
技巧
David Minutella
编号640-503 的CCNP路由测试与编号640-504的CCNP的交换测试有什么不同之处?如果我一直在做网络管理员,并且已经取得了CCNA认证,那么我考取哪个认证更好呢?
Ed Tittel
随着经济的衰退, 有抱负的IT网络人员以及经验老道的职场人士开始重新审视就业市场。本文将探讨如何在网络领域中生存,甚至走上蓬勃发展之路。
Lindi Horton
问:我们公司有50位用户以及一个小型的数据存储和因特网服务器机房。我们从大集团总部的无线连接访问因特网和进行电子邮件交流,但是我们只有一个很小的域控制器。

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
登录Email
请输入您的登录Email
密码
下次自动登录