wmicを使ったシステム管理

Adways Advent Calendar 2018 10日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar_2018


 

みなさんこんにちは。インフラDivの須藤です。
いよいよ12月も折り返しに差し掛かりましたね。

先週末は、町内会の役員としてクリスマス会を催してきました。
ちびっ子たちがサンタさんからプレゼントをもらう姿を見て、幼い頃の自分と重ね合わせてしまいました。
クリスマスイブに、枕元に靴下置いておいてワクワクしながら寝たら、翌日に父親から普通にプレゼントを手渡しされたのは今でも忘れられません。。

そんな話はさておき、今週はwmicを使ったシステム管理について書きたいと思います。
wmicとはWindows Management Instrumentation Command-line の頭文字を取ったもので、古くからWindowsのシステム管理に用いられています。
今回はwmicを使ったソフトウェアのインストールについて、実際に活用した事例をご紹介したいと思います。


 

1. 動機

とある日、AdobeやOffice製品等の、ファイルサイズの大きいソフトのインストールすることになりました。しかし、インストールが完了するまでPCの前に座って待たなければいけない。。逐次、PCの場所に赴き、進捗状況を確認するのが煩わしくなってしまったんですよね。 「ああ、、ソフトウェアのインストール状況をリモートで監視できたら」 と思い立って、wmicでリモートでソフトウェアのインストール状況を確認することにしました。

2. 事前調査

ターゲットとなるPCのイベントログを調査します。下記のイベントログからソフトウェアのインストール状況を知る手がかりを探します。
f:id:AdwaysEngineerBlog:20181212121803p:plain

今回は、Apps_CD_default_test というフォルダ内のコンポーネントをインストールしたので

ログメッセージ:Apps_CD_defaoult_test20180308 -- Configuration completed successfully

イベントID: 11728

というのを利用します。

3. 実践

吐き出されたログメッセージを手掛かりに、インストール状況を確認する場合は、ntevent を使います。検索するイベントログの種類によってLogfileの指定が異なるので、注意してください。また、特定のイベントを抽出する場合は、EventCodeを使います。

例えば、イベントID: 11728のアプリケーション(またはシステム)ログを検索する場合の式は以下になります。

C:\Users\ServerName>wmic ntevent where "(LogFile='application' and EventCode='11728')"
  • システムログの場合は, LogFile='system' と記載してください。

このままだと、あらゆるアプリケーションのイベントID: 11728を拾ってきてしまうので、Apps_CD_default_testというアプリケーションのインストール完了通知を取れるように、GET Messagefind文を使って文字列検索します。

C:\Users\ServerName>wmic ntevent where "(LogFile='application' and EventCode='11728')" | find "All Apps_CD_defaoult_test20180308 -- Configuration completed successfully"`

ターゲットとなるPC名が遠隔にある場合、/node: を使ってPCを指定します。

C:\Users\ServerName>wmic /node:"[PC-NAME]" ntevent where "(LogFile='application' and EventCode='11728')" | find "All Apps_CD_defaoult_test20180308 -- Configuration completed successfully"

上記を実行してみましょう。
f:id:AdwaysEngineerBlog:20181212121835p:plain
ターゲットへの接続が遅いと暫し待つことになりますが、このように必要な情報が取れました。

4. 応用

上記の構文を応用したサンプルスクリプトを記載します。
下記は、ターゲットホストのソフトウェア実行完了をリモートホストに伝えるスクリプトです。
ターゲットホストでソフトウェア実行のジョブが走っている事を前提に記載しています。
要所要所で端折っているので、ご利用の際には適宜加筆・修正してください。

set /P Target_PC="Set PC-NAME: "
echo %Target_PC%

REM イベントID:11728を検索し、検索件数をResultに代入する

:RETRY
for /F "usebackq tokens=*" %%c in (`c:\wmic /node:"%Target_PC%" wmic ntevent where "(LogFile='application' and EventCode='11728')" GET Message ^| find /C "All Apps_CD_defaoult_test20180308 -- Configuration completed successfully"`) do (
    set Result=%%c
)

REM インストール中である場合、イベントIDの検索件数が0件なので  
REM 5秒カウントしてRETRYまで戻る  
REM インストール完了するとResultに検索件数が1カウントされるのでスクリプトを終了する  

if "%Result%" == "0" (
   TIMEOUT /T 5 /NOBREAK
   set /A num=num+1
   goto RETRY
) else if "%Result%" == "1" (
   echo                    インストールが完了しました
   echo                    終了します
   goto End_Process
)

:End_Process
pause
exit

5. まとめ

今回はwmicについて紹介させていただきました。wmic自体、特に目新しいものではありませんが、意外と出来ることがたくさんあることに気付かなかったりするので、これからも、こういったレガシィな技術を自分のものにして、明日の自分の作業を効率化していきたいと思います。


 

次はswfzさんの記事です。

http://blog.engineer.adways.net/entry/advent_calendar_2018/11