使用脚本程序管理Windows网络(3)
2010年11月19日
使用脚本程序管理Windows网络 第三部分:理解WMI
了解Windows Management Instrumentation(WMI)是如何工作,以及如何使用VBScript脚本,本文最初发表于windowsnetworking.com。
在本系列专题的前两篇文章中,我们了解到如何使用VBScript修改一个Windows计算机的一个网络适配器的IP地址。其中,我们还学到了很多关于Windows脚本编写的基本概念,如类、对象、属性、方法和不同类型的变量,包括字符串变量、整数变量、数组和集合。我们还了解到一些关于写好脚本的基本方法,如定义变量、实现错误处理、接受用户设置、显示验证输出,以及通过注释来文档化脚本。
我们的最终脚本已经按要求工作了,但可能仍有一些方面你觉得难以理解。比如,让我们看一下下面这一行:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
在我的第一篇文章,对于这一行我作了以下评论:“通过定义一个objWMIService对象并将它赋值为GetObject方法返回的句柄,就可以连接到本地计算机的root\cimv2命名空间了”。
这究竟意味着什么呢?到底什么是WMI,它究竟是如何工作的呢?而且为什么它对于想要了解如何编写脚本来管理Windows电脑的你来说是如此重要的呢?
理解WMI
大约在Window98出现或是更早以前,WMI就已经出现,只是这那之前它有一个不大相同的名称:基于Web的企业管理(WBEM) 。 WBEM是由Microsoft,Cisco,Intel,Compaq和BMC Software共同开发的技术,目的是为是更容易管理企业环境中的桌面系统和服务器系统。WMI提供了一个模型以表示、存储和查询Windows计算机的配置和状态信息以及其他运行状况。开发人员可以使用WMI写脚本或托管的代码去查看和修改设置在Windows电脑上的配置,以此查看Windows的应用和服务的状态,同时还做了很多其他有助于管理员进行Windows网络部署、维护和故障排除的其他的功能。
换句话说, WMI表示:
●Windows――只工作在安装了Microsoft Windows的计算机上工作;
●管理――可以用来管理这些电脑;
●检测工具――提供查看和修改这些计算机上配置的工具。
有一个很好的比喻是把Windows电脑比一个汽车,而WMI则作为你车上的控制台的电子(仪表),以显示上你车子的速度、引擎温度、RPMS 等等。这些仪表板的控制并不是它们自身完成的――你仍然要想出办法通过获取这些电子信息并且以一个可读的形式显示出来。使用WMI写VBScripts就是如同创造仪表板显示元件一样,整合到汽车的仪表盘中,以告诉你所想知道的信息并控制你的引擎。换句话说,Windows安装了通过WMI构建的所有这些工具――你只需要弄清楚如何使用它就可以通过它做一些有用的事情,比如改变你机器的IP地址、查看当前的时区、重启远程机器、显示已安装的修复程序列表等等。
WMI命名空间
我们要了解关于MWI的所有事,现在还不够。实际上,要找出WMI是否可以做一些特别的事情是需要一点耐心和领会能力的。让我们首先考虑WMI命名空间。在WMI术语,一个名字空间是类和类的实例的一种逻辑数据库。下面是一个简单的shownamespaces.vbs脚本,它列举了在根命名空间下的所有WMI命名空间:
Set objWMIService = GetObject("winmgmts:\\.\root")
Set colNamespaces = objWMIService.InstancesOf("__NAMESPACE")
For Each objNamespace In colNamespaces
WScript.Echo objNamespace.Name
Next
下面是在WindowsXP 机器上运行这个脚本的结果:
C:\scripts>cscript ShowNamespaces.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
SECURITY
RSOP
Cli
SecurityCenter
WMI
CIMV2
Policy
Microsoft
DEFAULT
directory
subscription
每个这样的命名空间都是一个可能的来源,你可以查询关于Window计算机某个状态或配置的资料(而且也可以经常修改配置)。这些命名空间是像硬盘驱动器上的文件夹分层次地组织的。例如,我们可以通过下面的方式修改我们脚本的第一行来显示在root\CIMN2命名空间下的所有的命名空间:
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
当你运行修改后脚本时,输出结果是这样的:
C:\scripts>cscript ShowNamespaces.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
ms_409
Applications
事实上,root\ CIMV2是Windows机器上默认的WMI命名空间。这意味着,如果你在脚本的第一行里不指定连接的命名空间,那么WMI默认就会自动连接到root\ CIMV2命名空间。因此,如果我们将第一行改为:Set objWMIService = GetObject("winmgmts:\\") ... 我们会得到与上面相同的结果。请注意,我们去掉了winmgmts:\\.\\root\CIMV2句号后面的内容。如果你还记得在我们的第一篇文章,这个句号表示本地计算机,同时默认地WMI假设你想要在本地计算机上工作,这意味着你可以去掉句号后面的部分。而编写脚本最好的做法是在脚本中使用变量(来定义它们),以下是一个更广泛使用的可以用来显示WMI命名空间脚本:
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim objWMIService
Dim colNamespaces
Dim objNamespace
strComputer = "."
strWMINamespace = "\root\CIMV2"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace)
Set colNamespaces = objWMIService.InstancesOf("__NAMESPACE")
For Each objNamespace In colNamespaces
WScript.Echo objNamespace.Name
Next
为什么要把它变得这么复杂呢?主要的原因是增加灵活性!举例来说,如果我们需要运行在远程计算机上运行这个脚本,我们可以改变strComputer为远程计算机的IP地址值。或者如果我们需要显示命名空间的不同部分,我们可以添加几行到我们的脚本中以接受用户对strWMINamespace变量的输入。
WMI提供者
找到合适的命名空间只是第一个挑战(虽然大部分的情况下连接到默认的命名空间就已经足够了)。你还必须访问正确的提供者,以便取回或更新你的目标系统的数据。下面是一个ShowProviders.vbs脚本,可以显示root\CIMV2命名空间的所有WMI提供者:
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim objWMIService
Dim colWin32Providers
Dim objWin32Provider
strComputer = "."
strWMINamespace = "\root\CIMV2"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace)
Set colWin32Providers = objWMIService.InstancesOf("__Win32Provider")
For Each objWin32Provider In colWin32Providers
WScript.Echo objWin32Provider.Name
Next
以下就是在Windows XP机器上运行这个脚本的输出结果:
C:\scripts>cscript ShowProviders.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
Win32_WIN32_TSLOGONSETTING_Prov
MS_NT_EVENTLOG_PROVIDER
Win32_WIN32_TSENVIRONMENTSETTING_Prov
SCM Event Provider
ProviderSubSystem
VolumeChangeEvents
NamedJobObjectLimitSettingProv
HiPerfCooker_v1
WMIPingProvider
Microsoft WMI Forwarding Event Provider
Win32_WIN32_TSNETWORKADAPTERSETTING_Prov
SystemConfigurationChangeEvents
Win32_WIN32_TERMINALSERVICE_Prov
Win32_WIN32_TSREMOTECONTROLSETTING_Prov
Win32_WIN32_TSNETWORKADAPTERLISTSETTING_Prov
Win32_WIN32_COMPUTERSYSTEMWINDOWSPRODUCTACTIVATIONSETTING_Prov
Win32_WIN32_TSSESSIONDIRECTORY_Prov
CmdTriggerConsumer
Standard Non-COM Event Provider
SessionProvider
WBEMCORE
RouteEventProvider
WhqlProvider
Win32_WIN32_TSSESSIONSETTING_Prov
Win32_WIN32_TERMINalterMINALSETTING_Prov
Win32_WIN32_TSCLIENTSETTING_Prov
Win32_WIN32_TERMINALSERVICESETTING_Prov
WMI Kernel Trace Event Provider
Win32_WIN32_PROXY_Prov
NamedJobObjectProv
MS_Shutdown_Event_Provider
SECRCW32
Win32ClockProvider
MS_Power_Management_Event_Provider
Win32_WIN32_WINDOWSPRODUCTACTIVATION_Prov
RouteProvider
Cimwin32A
Msft_ProviderSubSystem
Win32_WIN32_TERMINALSERVICETOSETTING_Prov
NamedJobObjectSecLimitSettingProv
Win32_WIN32_TSSESSIONDIRECTORYSETTING_Prov
Win32_WIN32_TSPERMISSIONSSETTING_Prov
Win32_WIN32_TSACcount_Prov
Win32_WIN32_TERMINAL_Prov
MSIProv
DskQuotaProvider
NetDiagProv
Win32_WIN32_TSGENERALSETTING_Prov
CIMWin32
NamedJobObjectActgInfoProv
NT5_GenericPerfProvider_V1
WMI Self-Instrumentation Event Provider
MS_NT_EVENTLOG_EVENT_PROVIDER
看起来很复杂,不是吗?但是,使用这一系列的提供者,你可以轻松地搜索MSDN上有关某一特定提供者的更多的信息,并找到它所支持的方法。这就是你可以使用WMI对供应商所做的操作。
WMI类
除了命名空间和提供者,如果你想要利用WMI来脚本化Windows管理任务,你还需要理解WMI类。一个类是你可以用WMI管理的一种类型对象的一种模板。比如,Win32_LogicalDisk类是一个Windows机器上的逻辑磁盘摸板,而WMI则使用这个类为每一个安装的硬盘产生一个实例。
下面的ShowClasses.vbs脚本显示root\CIMV2命名空间的所有类(潜在的管理对象):
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim objWMIService
Dim colClasses
Dim objClass
strComputer = "."
strWMINamespace = "\root\CIMV2"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace)
Set colClasses = objWMIService.SubclassesOf()
For Each objClass In colClasses
WScript.Echo objClass.Path_.Path
Next
下面是在Windows XP上运行这个脚本时输出的内容:
C:\scripts>cscript ShowClasses.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
\\XP\ROOT\CIMV2:__SystemClass
\\XP\ROOT\CIMV2:__thisNAMESPACE
\\XP\ROOT\CIMV2:__Provider
\\XP\ROOT\CIMV2:__Win32Provider
\\XP\ROOT\CIMV2:__IndicationRelated
\\XP\ROOT\CIMV2:__EventGenerator
\\XP\ROOT\CIMV2:__TimerInstruction
\\XP\ROOT\CIMV2:__IntervalTimerInstruction
...
\\XP\ROOT\CIMV2:MSFT_WMI_GenericNonCOMEvent
\\XP\ROOT\CIMV2:MSFT_WmiSelfEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_OperationEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_ComServerLoadOperationEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_InitializationOperationFailureEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_LoadOperationEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_OperationEvent_Pre
\\XP\ROOT\CIMV2:Msft_WmiProvider_deleteClassAsyncEvent_Pre
\\XP\ROOT\CIMV2:Msft_WmiProvider_GetObjectAsyncEvent_Pre
...
\\XP\ROOT\CIMV2:Win32_ComputerSystemEvent
\\XP\ROOT\CIMV2:Win32_ComputerShutdownEvent
\\XP\ROOT\CIMV2:Win32_SystemTrace
\\XP\ROOT\CIMV2:Win32_ModuleTrace
\\XP\ROOT\CIMV2:Win32_ModuleLoadTrace
\\XP\ROOT\CIMV2:Win32_ThreadTrace
\\XP\ROOT\CIMV2:Win32_ThreadStartTrace
\\XP\ROOT\CIMV2:Win32_ThreadStopTrace
\\XP\ROOT\CIMV2:Win32_ProcessTrace
\\XP\ROOT\CIMV2:Win32_ProcessStartTrace
\\XP\ROOT\CIMV2:Win32_ProcessStopTrace
同样,这一切看起来有点还是挺复杂的,但你可以使用这些类在MSDN上搜索更多关于某一特定的WMI类信息,以此找到这个类相关的属性和方法。
使用WMI
下面让我们学以致用。上面脚本中显示的其中一个类是Win32_TimeZone,让我们用这个类显示电脑上所配置的时区。首先,我们需要知道关于这个类的更多信息,在MSDN上搜索“Win32_TimeZone类”会找到关于它的信息网页。在这个页面中我们可以找到这个类所支持的属性和方法(虽然实际上这个特定的级别只有属性而没有方法),这样使用这些信息,我们就应该可以写出我们所要的脚本。
这个小实验证明Caption属性是我们所要显示的,因为这是存储在机器上对最可读的(human-readable)形式的时区信息。以下这个命名为DisplayTimeZone.vbs的脚本,我们将用其查询WMI ,搜索这方面的资料并进行显示:
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem
strComputer = "."
strWMINamespace = "\root\CIMV2"
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>cscript 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)
让我们看看这个脚本是如何工作的。首先,你可以看到它很多基于我们先前的脚本。换句话说,我们是从使用以下语句连接WMI开始的:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace)
而下面一句是新的:
Set colItems = objWMIService.execQuery(strWMIQuery)
我们在这里要做的是执行对WMI一个查询以从中收集一些信息。这个查询已经在之前使用以下的语句定义了:
strWMIQuery = "select FROM Win32_TimeZone"
这个SQL的select语句本质上返回Win32_TimeZone提供者所能提供给我的所有记录(*号),然后将这些结果保存在colItems集合中。然后,我们循环遍历集合中的每一项(其实查询结果中只有一项记录)和显示这一项的Caption属性,就是下列字符串:
(GMT-06:00) Central Time (US & Canada)
练习
我们将在这一系列接下来的文章中深入研究WMI脚本编写,但现在让我们尝试做一个练习。将上面displaytimezone.vbs脚本中的内容到记事本(保证自动换行是关闭的),并将其另存为PageFile.vbs。现在修改脚本上的一行(实际上只是一行的一小部分),这样当脚本运行时显示路径和系统的PageFile(也就是虚拟内存)而不是时区。提示:在MSDN上搜索有关Win32_PageFile类的信息。我将在接下来的系列文章中解释这个练习的答案。
发表评论
-
转笔记
2012-01-20 10:06 870转笔记 2010年09月29日 *作者:alxston ... -
HTTP 错误 500.100 - 内部服务器错误 - ASP 错误 不能使用(未知的) 文件使用中
2012-01-20 10:06 558HTTP 错误 500.100 - 内部服务器错误 - ASP ... -
powerdesigner逆向工程生成PDM时的列注释解决方案
2012-01-20 10:06 628powerdesigner逆向工程生成PDM时的列注释解决方案 ... -
WinCe 配置文件解析
2012-01-20 10:05 653WinCe 配置文件解析 2011年01月20日 Win ... -
如何访问Facebook、Twitter及Youtube等网站
2012-01-20 10:05 10如何访问Facebook、Twitter及Youtube等网站 ... -
开机快速自动联网(一句话的VBS)
2012-01-19 15:07 727开机快速自动联网(一句话的VBS) 2010年10月20日 ... -
VBS WScript.Shell 隐藏cmd命令行
2012-01-19 15:07 788VBS WScript.Shell 隐藏cmd命令行 201 ... -
全自动申请qq号vbs代码
2012-01-19 15:07 726全自动申请qq号vbs代码 2011年08月25日 下面 ... -
利用VBS创建快捷方式
2012-01-19 15:07 953利用VBS创建快捷方式 2010年06月19日 利用VB ... -
NSClassFromString
2012-01-17 04:54 1795NSClassFromString 2010年11月06日 ... -
速度-电脑运行速度慢的各种原因及解决方法zz
2012-01-17 04:54 524速度-电脑运行速度慢的 ... -
CEGUI 学习笔记 - 启动详细分析
2012-01-17 04:54 1073CEGUI 学习笔记 - 启动详 ... -
Unity Android让游戏移植变得异乎寻常的简单
2012-01-17 04:53 926Unity Android让游戏移植变得异乎寻常的简单 20 ... -
config配置中文解释
2012-01-17 04:53 661config配置中文解释 2011年04月02日 con ... -
as3 正则表达式
2012-01-16 03:44 513as3 正则表达式 2009年10月04日 /\scom ... -
AS3正则与js正则中反向引用
2012-01-16 03:44 742AS3正则与js正则中反向引用 2010年09月29日 ... -
常用数字正则表达式
2012-01-16 03:44 767常用数字正则表达式 20 ... -
常用正则表达式
2012-01-16 03:44 638常用正则表达式 2010年04月17日 常用数字正则表达 ... -
揭开正则表达式的神秘面纱
2012-01-16 03:44 576揭开正则表达式的神秘 ...
相关推荐
使用脚本程序管理Windows网络,使用脚本程序管理Windows网络
WSH Windows 脚本宿主的基本任务 <br> 访问网络 <br> 访问网络连接 控制网络打印机 <br> 创建自动登录脚本 驱动应用程序 执行文件管理操作 <br> 复制文件和文件夹 映射到特殊文件夹...
首先,我使用了典型的“宏程序员”的做法,我试图结合简单的语句创建一个脚本程序。有时这种方法的工作,但我常常是语法和运行时的错误消息轰炸。我也错过了,我也可以用来复制文件,启动程序,获取用户输入,等强大...
向用户发送系统管理消息 远程关闭一台Windows NT计算机 使用Windows NT系统属性对话框 Windows NT诊断程序(Diagnostic)简介 使用Windows NT诊断程序打印一份报告 在Windows 95客户机上安装Windows NT系统管理工具 ...
NetSetMan 使用配置好的网络信息自动对系统网络进行配置,用程序代替了繁琐的人工操作,简单方便;第一次使用NetSetMan时需要将使用的网络都配置一下,切换到不同网络时只需要打开NetSetMan选择设定好的配置选项点击...
progman 程序管理器 regedit 注册表 regedit.exe 注册表 regedt32 注册表编辑器 regsvr32 /u *.dll 停止dll文件运行 regsvr32 /u zipfldr.dll 取消ZIP支持 rononce p 15秒关机 rsop.msc 组策略结果...
主要内容有:脚本开发、对象调用、系统对话框调用、文件系统访问、其他程序的调用进程控制、注册表操作、系统信息处理、事件操作、网络通信、打印机等外设的使用、图标摘录、多媒体控制、数据库应用和服务器管理等。
2 VER 1.3.0.63 增强了同一脚本程序的多脚本语言功能,真正实现了同一脚本里使用多种语言 增加例程 javascript学习.sps 演示了VBS调用JS的函数并得到返回值 修正了多语言脚本的Code代码段读取分析...
给WINDOWS7或Vista添加网络功能权限的脚本文件,使网络程序可以在非管理员用户下运行.
7.7 wevtutil——管理Windows事件 343 第8章 故障恢复 349 8.1 bcdedit——配置数据存储编辑器 349 8.1.1 bcdedit命令简介 349 8.1.2 应用于存储的bcdedit命令选项 349 8.1.3 应用于存储项的bcdedit命令选项 351 ...
主要内容有:脚本开发、对象调用、系统对话框调用、文件系统访问、其他程序的调用进程控制、注册表操作、系统信息处理、事件操作、网络通信、打印机等外设的使用、图标摘录、多媒体控制、数据库应用和服务器管理等。
主要内容有:脚本开发、对象调用、系统对话框调用、文件系统访问、其他程序的调用进程控制、注册表操作、系统信息处理、事件操作、网络通信、打印机等外设的使用、图标摘录、多媒体控制、数据库应用和服务器管理等。
压缩文件中包含了近100个本人收集和实际应用的所有脚本,代码详细,涉及Windows账号,AD域管理,操作系统,注册表,文件读写,网络,端口扫描等等vbs代码,经典快下哦,vbs交流请加群70539804,本人是群主
第3章管理WindowsServer2008用户和组1小时57分钟18节 3-1管理用户10:56 3-2用户的SID和用户的身份09:34 3-3禁用管理员02:29 3-4创建隐藏账户08:56 3-5创建不属于管理员组的管理员06:54 3-6使用密码重设盘恢复密码06:...
sharpoint,ISA,使用脚本程序管理Windows网络等学习资料
8-3使用组策略部署打印机09:42 8-4设置打印权限05:50 8-5设置打印机的优先级08:00 8-6启用打印池实现打印任务负载均衡06:21 8-7通过http发送打印作业03:58 第9章磁盘管理2小时18分钟13节 9-1MBR和GPT磁盘分区13:32 9...
第1章 Windows应用程序开发入门 1 1.1 第一个实例程序 1 1.1.1 start.exe 1 1.1.2 Windows API 2 1.1.3 程序入口函数 2 1.1.4 start.c代码分析 2 1.2 编译代码 3 1.2.1 安装Visual Studio 3 1.2.2 ...
第1章 UNIX和Windows网络互连 1 1.1 系统规划 4 1.1.1 桌面客户议题 5 1.1.2 企业计算问题 5 1.1.3 域和Realms 5 1.1.4 口令 6 1.2 使用Samba共享资源 6 第2章 UNIX概述 7 2.1 服务和守护进程 7 2.2 init进程 9 2.3 ...