- WMI Fun !! -|WMI StepWMI SampleSearchWMI Fun !! GroupsAbout WMI Fun !!
Top Page >> WMI Step >> WMIでイベントを取得してみよう
WMIでイベントを取得してみよう
Topics

今まではプロパティを取得・設定したりメソッドを実行していたりしまいたが、これだけでは芸がないと思ったのでここではイベントの取得を行ってみようと思います。
VBSを使用してサンプルを紹介しますが基本的にはVBでも問題なく使用可能です。(単にVBでやると私の環境では固まることがまれにあったので、VBSで書いているだけです。)


Sample Code

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

Comment

では実行してみましょう。
実行するとこのスクリプトはあるイベントが発生するまで待機する形になります。
これを実現しているのは

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 を本で勉強したい方へ。 Windows PowerShellインアクション を読んでみては?
なかなか WMI のことが乗っている書籍は少ないですが…管理系業務に係る方には楽しめるかも?
パソコンで目が疲れたら、ブルーベリーアイ
『ブルーベリーアイ』1粒中ビルベリーエキス160mg【楽天シニア市場】
 ^ Copyright(C) 1997-2006 とお All rights reserved. <<