现在的位置: 首页 > 综合 > 正文

如何在每次拔掉网线时都能收到通知?

2013年12月03日 ⁄ 综合 ⁄ 共 2150字 ⁄ 字号 评论关闭

如何在每次拔掉网线时都能收到通知?
问:
您好,脚本专家!有没有什么方法让我在每次计算机上的网线被拔掉时都能收到通知?

-- DD

答:
您好,DD。很多人在成长过程中都有过这样的经历:您的奶奶或姨妈或某个亲戚,住在带有一个大阁楼的房子里,这个阁楼里塞满了东西。不可否认,大多数时间里,当您在阁楼里徘徊时,不知道该找什么,但是您常常会很偶然地找到一些很酷很有用的东西。每次造访阁楼都像是一次寻宝旅行,您永远都不知道会在那里找到什么。

在 WMI 中,“root/wmi”命名空间就相当于奶奶的阁楼。这里有相当多的资料 – 在 Windows XP 测试计算机上有 374 个类 – 但是大多数类不是没有实现就是不返回任何数据。不过,您时不时地会发现一个很有用的类,比如每次网络连接丢失时都向您发出通知的类。研究这个命名空间就像是寻宝一样。

事实证明,“MSNdis_StatusMediaDisconnect”类 – 一个 WMI 事件类 – 可以监视计算机并在每次网络连接丢失时(不论是因为拔掉了网线还是因为其他的原因)向您发出通知。还是像往常那样,我们先向您展示脚本,然后再说明它是如何工作的:

strComputer = "."

Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/wmi")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("Select * from MSNdis_StatusMediaDisconnect")

Do While True
    Set strLatestEvent = colMonitoredEvents.NextEvent
    Wscript.Echo "A network connection has been lost:"
    WScript.Echo strLatestEvent.InstanceName, Now
    Wscript.Echo
Loop

如果您多少有点儿使用 WMI 事件脚本的经验,此脚本看起来会很熟悉。(如果您没有使用 WMI 事件脚本的经验,则您可能需要看一看Scripting Week 2 webcast 网络广播。)首先,我们连接到 WMI 服务;请注意,我们应连接到 root/wmi 而不是 root/cimv2。然后,我们使用“ExecNotificationQuery”申请在每次创建“MSNdis_StatusMediaDisconnect”类的新实例时都收到通知。您可能已经猜到了,每次网络连接丢失时都会创建此类的新实例。

然后,我们设置一个无限循环;通过设计,此脚本将连续不断地监视计算机上 MSNdis_StatusMediaDisconnect 类的新实例。(实际上,使脚本停止监视的唯一方法就是终止该脚本或该脚本过程。)然后此脚本暂停在以下这行代码上,等待下一个网络断开事件:

Set strLatestEvent = colMonitoredEvents.NextEvent

那么,如果我们拔开网线并将计算机从网络中断开,会发生什么事情呢?在这种情况下,将发生一个网络断开事件,将创建 MSNdis_StatusMediaDisconnect 类的新实例,且该脚本将发布与以下类似的通知:

A network connection has been lost:
Microsoft Wireless Notebook Adapter MN-720 3/172005 8:28:34 AM

很酷吧?然后该脚本继续循环并等待下一个网络断开的发生。如果再次发生这样的网络断开事件,便发布另一个通知。

附注。当然,并不局限于将您的消息回显到屏幕。您可以让您的脚本在发生网络断开时执行任何操作;我们只是想将情况简单化。
 

顺便提一句,有一个相似的类“MSNdis_StatusMediaConnect”,该类可在每次网络连接完成后向您发出通知。以下就是用于完成此操作的示例脚本:

strComputer = "."

Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/wmi")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("Select * from MSNdis_StatusMediaConnect")

Do While True
    Set strLatestEvent = colMonitoredEvents.NextEvent
    Wscript.Echo "A network connection has been made:"
    WScript.Echo strLatestEvent.InstanceName, Now
    Wscript.Echo
Loop

遗憾的是,我们不知道将这两个脚本合成一个脚本(即一个在网络连接时和网络断开时都会对您进行通知的脚本)的简便方法。虽然目前至少有一种方法可以做到这一点,但是该方法会带来一些安全问题,所以我们不推荐使用它。那么,若要同时监视这两种事件,您暂时需要分别运行两个独立的脚本。但是我们将会继续在整个 WMI 阁楼里翻箱倒柜;谁知道我们还能在那里找到别的什么东西呢。

【上篇】
【下篇】

抱歉!评论已关闭.