| - WMI Fun !! -|WMI Step|WMI Sample|Search|WMI Fun !! Groups|About WMI Fun !! | ||||||
| Top Page >> WMI Step >> WMIでイベントを取得してみよう | ||||||
|
WMIでイベントを取得してみよう
■Topics今まではプロパティを取得・設定したりメソッドを実行していたりしまいたが、これだけでは芸がないと思ったのでここではイベントの取得を行ってみようと思います。 VBSを使用してサンプルを紹介しますが基本的にはVBでも問題なく使用可能です。(単にVBでやると私の環境では固まることがまれにあったので、VBSで書いているだけです。) Option Explicit
Dim PrcEvt
Dim Prc
Dim Locator
Dim Service
Dim MesStr
Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer
Set Prc = Service.ExecNotificationQuery _
("SELECT * FROM __InstanceCreationEvent " _
& "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Set PrcEvt= Prc.NextEvent
If PrcEvt.TargetInstance.Name = "NOTEPAD.EXE" Then
MsgBox "メモ帳が起動しました。OKを押すとメモ帳を終了します。"
PrcEvt.TargetInstance.Terminate
End If
Set PrcEvt = Nothing
Set Prc = Nothing
Set Locator = Nothing
Set Service = Nothing
では実行してみましょう。 実行するとこのスクリプトはあるイベントが発生するまで待機する形になります。 これを実現しているのは Set Prc = Service.ExecNotificationQuery _ ("SELECT * FROM __InstanceCreationEvent " _ & "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'") Set PrcEvt= Prc.NextEvent になります。 ExecNotificationQueryメソッドが通知を待つためのオブジェクトを作成しています。このメソッドを実行するとSWbemEventSource型が帰ってきます。 この型にはNextEventメソッドが用意されていてWQLで指定したクエリーのイベントが発生するまでプログラムがそこで待機することになります。 今回はWin32_Processを使用したため何かプロセスが作成されればイベントが発生します。 WQLで指定しているWITHIN句はポーリングする間隔(秒)です。 __instancecreationeventはインスタンスが作成された際に発生するイベントを取得することを示しています。 TargetInstance isa 'Win32_Process'という形で明示しておく事によりイベント発生時にはTargetInstanceを経由してWin32_Processの各種値の取得が可能です。 最後にイベントが発生した際に起動されたプロセスが「NOTEPAD.EXE」であればメッセージボックスを表示して勝手に終了させてしまいます。 メモ帳が起動したかどうか確認するためにPrcEvt.TargetInstance.Nameという記述を行っていますがこれは、イベントが発生した際の情報が Win32_Processクラスの実装のとおりPrcEvt.TargetInstanceで参照できるようになるため可能になります。
WMI を本で勉強したい方へ。
なかなか WMI のことが乗っている書籍は少ないですが…管理系業務に係る方には楽しめるかも? |
|
| ^ | Copyright(C) 1997-2006 とお All rights reserved. | << |