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

WMI设备管理05

2018年02月07日 ⁄ 综合 ⁄ 共 3226字 ⁄ 字号 评论关闭

【文章标题】: WMI设备管理05
【文章作者】: 有酒醉
【作者邮箱】: wuqr32@sina.com
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
七、事件和WQL

设备管理允许客户程序在特定事件发生的时候收到通知.也就是所谓的事件.WMI事件和NET事件非常类似,但是它们的底层结构是完全不同的.而WQL则就是WMI 查询语言,它跟SQL非常类似,这里不做探讨,简单理解即可.

WMI事件分为三种:

1、定时器事件,由__IntervalTimerInstruction系统类表示.它的结构如下:

class __IntervalTimerInstruction : __TimerInstruction
{
  uint32 IntervalBetweenEvents;
  boolean SkipIfPassed 
= FALSE;
  
string TimerId;
}
;

 PS:IntervalBetweenEvents应该设一个合理的数据,如果值太小,WMI将忽略它.

ManagementClass timerClass = new ManagementClass("__IntervalTimerInstruction");
ManagementObject timer 
= timerClass.CreateInstance();
timer[
"TimerId"= "Timer1";
timer[
"IntervalBetweenEvents"= 1000;
timer.Put();
// 预定计时器事件
// 创建计时器事件查询
WqlEventQuery query = new WqlEventQuery("__TimerEvent""TimerId="Timer1"");
// 初始化watcher,并预定query定义的事件
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
// 挂接事件的处理方法
watcher.EventArrived += 
          
new EventArrivedEventHandler((new EventHandler()).HandleEvent);

// 开始侦停事件
watcher.Start();
// 暂停线程执行,以使watcher侦听事件
System.Threading.Thread.Sleep(10000);
// 停止事件预定
watcher.Stop();

通过查询Win32_LocalTime也可以达到定时操作服务的效果.

示例 -- 自动运行问题

// TaskAutoRun.cs
// Author by Yzl

using System;
using System.Management;

public class TaskAutoRun
{
    
public static void Main(string[] args)
    
{
        TaskAutoRun service 
= new TaskAutoRun();
        service.Start();
        
// 输入任意字符终止服务
        Console.ReadLine();
        service.Stop();
    }

    
    
// 启动服务
    public void Start()
    
{
        
if (!bStop)
        

            Console.WriteLine(
"已经启动服务.");
            
return;
        }

        
        Console.Write(
"正在启动服务...");
        watcher 
= new ManagementEventWatcher(
                    
new WqlEventQuery("__InstanceModificationEvent",
                    
" TargetInstance ISA 'Win32_LocalTime' AND " +
                    
" TargetInstance.Second=0"));
        
        MyHandler handler 
= new MyHandler();
        watcher.EventArrived 
+= new EventArrivedEventHandler(handler.Arrived);
        
        watcher.Start();
        bStop 
= false;
        Console.WriteLine(
" 启动完毕.");
    }

    
    
// 停止服务
    public void Stop()
    
{
        
if (bStop)
        
{
            Console.WriteLine(
"服务并未启动");
             
return;
        }

        Console.Write(
"正在停止服务...");
        watcher.Stop();
        Console.WriteLine(
" 已终止.");
    }

    
    
public class MyHandler
    
{
        
public void Arrived(object sender,EventArrivedEventArgs e)
        
{
            Console.WriteLine(
"时间到达,可执行任务!");
        }

    }

    
    
bool bStop = true;
    
private ManagementEventWatcher watcher;
}

编译运行:
E:/>TaskAutoRun
正在启动服务... 启动完毕.
时间到达,可执行任务!
时间到达,可执行任务!
时间到达,可执行任务!
时间到达,可执行任务!
时间到达,可执行任务!
时间到达,可执行任务!
q
正在停止服务... 已终止.

E:/>

这里程序的意思是当秒为0时,执行任务.具体设置可以参照如下WQL语言;
SELECT * FROM __InstanceModificationEvent
WHERE
    TargetInstance ISA "Win32_LocalTime"
    AND TargetInstance.Year = 2001
    AND TargetInstance.DayOfWeek=5
    AND TargetInstance.Hour=8  //可以把这里设置为12点,这样一到12点它便自动执行
    AND TargetInstance.Minute=0
    AND TargetInstance.Second=0

--------------------------------------------------------------------------------
【版权声明】: 本文原创于泉州软件基地, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年03月15日 11:11:41

【上篇】
【下篇】

抱歉!评论已关闭.