【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 で見てみると、以下のとおりです。

image

MOFファイルのそれぞれのブロックの instance と同じクラス名であることがわかるでしょう。

監視を停止するには、__FilterToConsumerBinding をクリックしてインスタンスを開き、該当するインスタンスを削除します。

Vista/2008 以降を使用している場合には、管理者特権モードでCIM Studioを起動する必要があるので注意してください。

image

ただ、これだけだとゴミが残るので、__ActiveScriptEventConsumer および __EventFilter 配下のインスタンスも削除しておきましょう。

当該インスタンスを見分けるには、上記 mof ファイルに書かれている「Name」プロパティの値を参照します。今回の例では、LogonUserLoggingLogonUser が該当します。

さて...「えぇ、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