注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 利用IPSec实现网络安全之..
 帮助

如何在服务中止时获得通知


2007-01-12 10:51:41

通常情况下,有多种不同的方法可以实现这个目的,但最简单的办法就是创建一个脚本来监视 WMI 事件。我们不打算在本专栏中详细解释 WMI 事件,但一个基本的想法就是,您可以请求 WMI 在发生某些事情的时候通知您。例如,您可以请求在硬盘空闲空间低于某个指定值或是 CPU 使用持续处在预定的水平之上时获得通知。同样,您可以请求在某个服务状态更改时获得通知;也就是说,在正在运行的服务被中止或是已停止的服务重新运行时获得通知。如果某个服务中止了,您可以请求 WMI 通知您。

以下脚本可以检查服务状态的变化;这个脚本每隔 30 秒钟会检查一次服务状态有无变化。该脚本中使用了一个无限循环,也就是说,只要启动这个脚本,它就会不断地运行下去,直到您重新启动计算机或是中止这个脚本进程。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService. _
    ExecNotificationQuery("Select * from __InstanceModificationEvent " _
        & "within 30 where TargetInstance isa 'Win32_Service'")
i = 0
Do While i = 0
    Set objService = colServices.NextEvent
    If objService.TargetInstance.State <> _
        objService.PreviousInstance.State Then
        Wscript.Echo objService.TargetInstance.Name _
            &  " is " & objService.TargetInstance.State _
                & ". The service previously was " & objService.PreviousInstance.State & "."
    End If
Loop

如您所见,非常简单。任何时候只要服务状态有变化,一个 __InstanceModificationEvent 类的实例就会被创建。这个脚本会将修改后的服务 (TargetInstance.State) 的当前状态与该服务 (PreviousInstance.State) 的先前状态进行比较。假如这两个服务是一样的,也就是说当前运行的服务和先前运行的服务是一样的,那又会怎样呢?这种情况下,我们只需忽略该事件;那意味着该服务的其他属性被更改了。(例如,您可能更改了服务密码,或是将服务由“手动”启动改为“自动”启动。)如果这两个状态不同,也就是说先前运行的服务现在停止了,那么就会出现一个弹出式消息框,告诉您服务的名称、它的当前状态以及先前状态。够酷吧,嗯?





    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: