【Management】WMI 永続的監視の削除方法
#なんども更新してすみません
今日、オーディエンスマーケの S 嬢から、水戸名産 干し納豆 をもらいました。納豆好きの私は大喜びなのですが、隣に座っている高添は、はなはだ迷惑そうです。
さて、4月2日のセミナーで説明できなかった部分の補足です。
セミナーでは、WMI の永続的監視機能を使用することで、スクリプトをサービス化することができるというお話と、その手順について解説しました。
※なんのことやら...という方は、是非とも5月30日(土)に予定しているリピートセッションにご参加ください(詳細は追って)
アンケートに「監視の削除方法を教えてください」と書かれており、うかつにも説明が抜けていたことが判明しました...。
この場を借りて補足させていただきます。
---
以下のようなmof ファイル(拡張子 mof のテキストファイル)を作成したとします。
#pragma namespace(" \\\\.\\root\\subscription") #PRAGMA AUTORECOVER instance of ActiveScriptEventConsumer as $Cons { Name = "LogonUserLogging"; ScriptingEngine = "VBScript"; ScriptFileName = "c:\\tmp\\demoscript\\wmisample08.vbs"; }; instance of __EventFilter as $Filt { Name = "LogonUser"; Query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 " "WHERE TargetInstance ISA \"Win32_LogonSession\ " "; QueryLanguage = "WQL"; EventNamespace = "root\\cimv2"; }; instance of __FilterToConsumerBinding { Filter = $Filt; Consumer = $Cons; }; |
このファイルを、以下の書式でコンパイルします。
mofcomp.exe hogehoge.mof
これにより、
「SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA Win32_LogonSession」というクエリーにシステムのイベントがヒットすると、「c:\tmp\demoscript\wmisample08.vbs」を実行する
という監視の仕組みがOSに登録されます。
では、登録された仕組みをどうやって削除するか。
上の mof ファイルの1行目を見てください。
\\\.\\root\\subscription は、「Root\Subscription」というネームスペースに、この監視の仕組みが登録されることを意味しています。
具体的には、Subscription配下の、以下の3つのクラスに登録されています。
ネームスペース:Root\Subscription
クラス:__FilterToConsumerBinding (フィルターとスクリプトのバインド情報)
クラス:__ActiveScriptEventConsumer (スクリプト情報)
クラス:__EventFilter (フィルター情報)
CIM Studio で見てみると、以下のとおりです。
MOFファイルのそれぞれのブロックの instance と同じクラス名であることがわかるでしょう。
監視を停止するには、__FilterToConsumerBinding をクリックしてインスタンスを開き、該当するインスタンスを削除します。
Vista/2008 以降を使用している場合には、管理者特権モードでCIM Studioを起動する必要があるので注意してください。
ただ、これだけだとゴミが残るので、__ActiveScriptEventConsumer および __EventFilter 配下のインスタンスも削除しておきましょう。
当該インスタンスを見分けるには、上記 mof ファイルに書かれている「Name」プロパティの値を参照します。今回の例では、LogonUserLogging と LogonUser が該当します。
・
さて...「えぇ、GUI使うのー?面倒くさいー!」とお思いの方、手を挙げてください。
....ですよね。
そこで、WMICコマンドを使う方法も書いておきます。
以下の書式を参考になさってください。
ちなみに、この操作も、コマンドプロンプトを「管理者として実行」で開いてください(Vista/2008の場合)。
C:\>WMIC /NAMESPACE:\\root\subscription PATH __EventFilter Where Name="LogonUser" Delete インスタンス \\JUNICHIA-BANDIT\ROOT\subscription:__EventFilter.Name="LogonUser" を削除しています インスタンスは正しく削除されました。 C:\>WMIC /NAMESPACE:\\root\subscription PATH ActiveScriptEventConsumer Where Name="LogonUserLogging" Delete インスタンス \\JUNICHIA-BANDIT\ROOT\subscription:ActiveScriptEventConsumer.Name="LogonUserLogging" を削除しています インスタンスは正しく削除されました。 C:\>WMIC /NAMESPACE:\\root\subscription PATH __FilterToConsumerBinding WHERE (__RELPATH like '%LogonUser%' and __RELPATH like '%LogonUserLogging%') Delete インスタンス \\JUNICHIA-BANDIT\ROOT\subscription:__FilterToConsumerBinding.Consumer="\\\\.\\root\\subscription: ActiveScriptEventConsumer.Name= \"LogonUserLogging\"",Filter="\\\\.\\root\\subscription:__EventFilter.Name=\"LogonUser\"" を削除しています インスタンスは正しく削除されました。 C:\> |
コマンドで削除するにあたり、注目していただきたいのは、クエリーの書き方です。
勘の良い方は既におわかりのとおり、上記の「 (__RELPATH like '%LogonUser%' and __RELPATH like '%LogonUserLogging%') 」の部分は、部分一致を表しています。
間に and が書かれていることから、複数の条件を結合していることがわかります。
便利ですね>WMI