<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Vbs脚本编程简明教程补充读物-初窥WMI

第二部分:利用脚本来认识 WMI

命令提示符的工具确实好用,但是却显示不出我们是高手,高手都是能利用程序来实现目的的。下面我们就开始用脚本来实现我们的任务,功能将更加强大,操作将更加灵活。

无论脚本还是真正意义上的程序,要检索 WMI 托管资源信息进而查询并利用 WMI ,都需要遵循以下三个步骤的。

1 .连接到 WMI 服务。建立一个到目标计算机上的 Windows 管理服务的连接。

2 .检索 WMI 托管资源的实例。主要取决于要执行的任务。

3 .显示 WMI 某实例属性和调用其方法。

1 .任务四:利用脚本实时监视对方进程

在任务一和任务三中我们都是在查看对方的进程,出来的结果对我们意义不是很大,在这个任务中我们要从现在开始每当他开一个任务我们就察觉到,并把它记录下来。我们要在他开进程的那一秒开始报告并记录,我们要清楚他所开的程序所在的位置,我们要比他更清楚地知道这些信息。

现在我们就按照前面提到的三个步骤来实现任务。

首先,我们连接到对方的 WMI 。在这里我们首先调用 VBScript 的中的 Createobject ()来得到一个对象,然后利用这个特殊的对象的方法来连接到远程的计算机上。这个特殊的对象就是 wbemscripting.swbemlocator

set olct=createobject("wbemscripting.swbemlocator")

set wbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

注意其中的 strComputer 就是你所要连接的计算机的名称或者 IP 地址, strUser strPwd 当然就是用户名和密码了,我们说过这个用户必须是具有管理员权限的才可以。 root\cimv2 WMI 的命名空间,关于 WMI 的命名空间,大家可以到“计算机管理 \WMI 控件”中看到,这里面的学问就大了,得慢慢琢磨,为了我们的任务快速实现,我就不多解释了。用这种方法连接到 WMI ,返回一个对 SWbemServices 对象的引用,一旦有一个对 SWbemServices 对象的引用。我们就可以进行第二个步骤了。

在第二个步骤中,我们将得到 WMI 托管资源的实例,我们利用 WbemServices 中的一个方法 ExecNotificationQuery 可以查询我们所要的类,进而可以得到该类中实例。

Set colMonitoredProcesses = wbemServices. _

ExecNotificationQuery("select * from __instancecreationevent " _

& " within 1 where TargetInstance isa 'Win32_Process'")

注意这里有个类似于 SQL 语言的查询语言,这里叫做 WQL 语言,懂 SQL 的一看就明白了,不懂的就在网上找找它的资料,满天都是。得到的 colMonitoredProcesses 是所查询的类的实例的集合。有了这些我们的第三个步骤就可以开始了。

在第三个步骤中,我们将显示出得到的实例中的属性。刚才我们得到的是实例的集合,在这里我们通过 colMonitoredProcesses.NextEvent 来获取每一个具体的实例,得到每一个具体的实例后,我们就可以显示出他们的属性,也就是我们想看的东西了。这里我们显示了 CommandLine 的属性值。

到现在你是否有些迷惑了,因为你还不知道到底 WMI 里面有那些类,具体类又有哪些属性,呵呵,没有关系的,用一些工具可以很轻松的得到这些信息。比如系统自带的 wbemtest ,在运行中敲入这个程序名,你就可以看到这些了,它也遵循连接、查询、枚举这三个步骤。自己慢慢玩吧,很快你就会发现 WMI 太大了,单是命名空间就有 10 多个,然后单是我们常用的空间 root\CIMV2 里面就有近 1000 个类,每个类里面又有好多的属性,有些类还有好多方法。哈哈,头晕了吧?没关系,其实你只需要知道其中的一些就好了。

看到这些估计你的头已经很大了,但是恭喜你,我们的这个任务已经完成了,是的,就是这么简单,下面我将完整代码奉献出来。

Set colArgs = WScript.Arguments

If WScript.arguments.count < 3 then

WScript.Echo "USAGE:" & vbCrLf & " Monitor Computer User Password files"

WScript.quit

End If

strComputer = wscript.arguments(0)

strUser = wscript.arguments(1)

strPwd = wscript.arguments(2)

strFile = wscript.arguments(3)

set olct=createobject("wbemscripting.swbemlocator")

set wbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

Set colMonitoredProcesses = wbemServices. _

ExecNotificationQuery("select * from __instancecreationevent " _

& " within 1 where TargetInstance isa 'Win32_Process'")

i = 0

Do While i = 0

Set objLatestProcess = colMonitoredProcesses.NextEvent

Wscript.Echo now & " " & objLatestProcess.TargetInstance.CommandLine

Set objFS = CreateObject("Scripting.FileSystemObject")

Set objNewFile = objFS.OpenTextFile(strFile,8,true)

objNewFile.WriteLine Now() & " " & objLatestProcess.TargetInstance.CommandLine

objNewFile.Close

Loop

到这个程序的核心了吧?相信你已经懂了其中的很多,剩余的部分代码我稍后解释。我们先来感性认识一下,先看它该怎么用吧!把上面的代码拷贝到记事本中,然后保存为 monitor.vbs 的文件,然后在命令提示符下输入:

CSCRIPT monitor.vbs

回车,你就会看到帮助,下面举例说明这个脚本的具体用法:

CSCRIPT monitor.vbs 192.168.1.2 user password C:\1.txt

在命令提示符下敲入上面的命令就 OK 了,每当对方开一个程序的时候,你就可以看到时间,程序路径和程序名。如果你没有时间去看这些信息,你还可以等有时间的时候到 C:\1.txt 看到这些信息。

小知识:

每次使用脚本,都必须敲入 CSCRIPT 和脚本的后缀名,很麻烦。这是因为系统默认的执行引擎是 WSCRIPT ,可以将它改成 CSCRIPT 。另外一个让人不爽的是脚本执行后总要显示微软的说明,好像脚本不是我们写的一样。不过你可以通过在命令提示符下敲入下面的命令来解决这个问题:

cscript //nologo //h:cscript //s

这样你以后再运行这些脚本的时候就不用在敲入 CSCRIPT 了,也不用在写入 .vbs 的后缀名了,就上面的例子来说,你可以这样用:

monitor 192.168.1.2 user password C:\1.txt

解释:

1 )前面的那几行,大概就是为了显示帮助和处理我们在后面输入的参数。应用到了 WScript.Arguments 这个对象,利用它我们可以来获取并处理脚本的参数。

2 )那个死循环是为了让我们一直监视他(她),每当他开一个程序,我们就得到一个新的实例,我们就可以知道他更多的信息,哈哈,够狠吧。这样你也就知道了,当我们这个脚本运行后,只有通过我们人为中止才能中断监视,人为中止的方法大家可以用 CTRL+C 来完成,也可以用各种野蛮的方法来中止。

3 )在代码中出现的另外一个核心对象就是 FileSystemObject ,应该是大家的老朋友了吧,我这里就不再做解释了,我们在这里应用它主要是为了将结果同时保存到一个文件中,我们利用它来创建或打开一个文件,将信息追加进去。

4 )至于那个 NOW ,虽然体积很小,但是却正是它给我们提供了时间这个重要的信息。

5 )如果你想要监视的是自己的计算机而不是远程的计算机(据我所知,这个应用还是很广的)。那么请将计算机名的参数写为一个小点,用户名和密码留为空。如下所示:

monitor . "" "" C:\1.txt

2 .任务五:利用脚本给对方开放共享

有了任务四的基础,这次我们就先看代码吧:

Set colArgs = WScript.Arguments

If WScript.arguments.count < 5 then

WScript.Echo "USAGE:" & vbCrLf & " Rshare Computer User Password SharePath ShareName"

WScript.quit

End If

strComputer = wscript.arguments(0)

strUser = wscript.arguments(1)

strPwd = wscript.arguments(2)

strPath = wscript.arguments(3)

strShareName = wscript.arguments(4)

intMaximumAllowed = 1

strDescription = "Temporary share"

Const SHARED_FOLDER = 0

set olct=createobject("wbemscripting.swbemlocator")

set wbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

Set objSWbemObject = wbemServices.Get("Win32_Share")

intReturnvalue = objSWbemObject.Create(strPath, _

strShareName, _

SHARED_FOLDER, _

intMaximumAllowed, _

strDescription)

if(intReturnvalue = 0) Then

WScript.Echo "The share have been created successfully"

End If

解说:

1 )我们可以看出来前面的那几行是为显示帮助和处理输入参数而存在的。

2 )紧接着设置了几个变量,为以后做参数用的。这里我们可以先不理会它。

3 )连接到主机的 WMI ,然后就是查询。前面已经说的很详细了。

4 )这次得到实例集后,我们用了它的一个方法,也就是这个方法让共享成为了可能,联系到第二部分的内容,我们不难知道第一个参数表示要共享的路径和文件名,第二个参数表示共享名,第三个参数为 0 就可以了,第四个参数是指可以连接的人数,第五个参数是共享描述了,而我们只关心前面的两个参数。如果手头有 MSDN 那就好办了,到 MSDN 中可以查到该方法的更详细的内容。

5 )这次我们根据第四步的返回值来得到共享是否成功,并给出提示。不同的返回值代表不同的意义。这个信息在 MSDN 中可以很清楚地查到。比如 0 代表成功返回, 2 代表拒绝访问, 9 代表用户名错误, 25 代表主机名没有找到等等。

6 )这次我们要注意的是,用这个脚本来实现远程文件共享,要求远程存在这个文件,否则无法共享。当然你也可以利用教本创建自己的文件夹,很容易的,自己创建吧。

7 )如上脚本创建后的共享是完全共享。就是可以删除修改文件的。

8 )用法举例: share netp net swswsw C:\dodo marsh

好了,到现在为止,大家应该对这位朋友有些了解了,我的介绍任务也就告一段落了,如果大家想进一步认识它,那就主要靠大家的主动性了。这次我们主要通过 WMIC 和脚本来认识它,下次我将带领大家通过真正的程序代码来认识它,让它也有个象 Windows 一样漂亮的脸蛋。今天我所提到的估计只能算是 WMI 的万分之一,都算不上是冰山一角。剩余的要靠自己来发挥了。如果你肯利用你的所学,那么奇迹就会产生。

 

摘自BeyondTechnology的Blog,文章看起来像是翻译的,由浅入深,比说明文档更容易接受,都是些基础,个人觉得不错。