【バッチファイル】Windowsのサービス状態を自動で比較チェックする。OS再起動後の状態確認が一発でできます。

スポンサーリンク




作業を自動化する

WindowsサーバのメンテナンスでOSを再起動する事はよくあると思います。

OS再起動後に動いていないサービスがあった時は、OS再起動前のサービス状態と見比べる必要がありますが、人の目だと大変です。

今回はサービス状態の比較をバッチで行う方法を説明します。

  • WindowsOSのメンテナンスを行うがサービスの確認に不安がある
  • OS再起動前は起動状態で、OS再起動後は停止状態になっているサービスを知りたい
  • サービスをファイルに出力してFCコマンドで比較したがずれてしまった

こんな方に読んでもらいたいです。

 

 

スポンサーリンク

具体的なやり方

OS再起動前とOS再起動後にサービス状態をファイルに出力しておく。

メモ帳を開いてこの後に説明するプログラムをコピペしてサービス比較.batというファイル名で保存します。

後は、そのファイルをダブルクリックすればサービスの比較を自動でやって、異常があれば画面に表示してくれます。

 

バッチファイルを作って動かす

コピーするプログラム

この下に書いてあるプログラムをコピーしてメモ帳に貼り付けます。

ファイル名をサービス比較.batとしてデスクトップへ保存します。

 

@echo off
rem サービス停止情報のファイル取得方法はWindows PowerShellで下記2行のコマンドを実行する
rem $now = Get-Date -Format "yyyyMMdd"
rem get-wmiobject win32_service | select Name,State | Where-Object {$_.State -eq "Stopped" } > service-before_$now.log

rem 「service-before_yyyymmdd.log」のファイル名を準備
set filename-before=service-before_%date:~0,4%%date:~5,2%%date:~8,2%.log
set filename-after=service-after_%date:~0,4%%date:~5,2%%date:~8,2%.log

rem 異常時のメッセージ
set NGMSG1=「
set NGMSG2=」は元々起動してましたが、現在は停止状態です。

rem 異常が無かった場合に最後に表示させるメッセージ
set OKMSG1=サービス状態は正常です。

rem 比較した結果を格納する。(一致=true 不一致=false)
set MATCHFLAG=

rem 一致しなかったサービス名を一時的に格納する。
set NGSERVICE=

rem 最終的な結果を格納する。(正常=true 異常=false)
set RESULT=

rem for内での変数処理用
setlocal enabledelayedexpansion

for /f "delims=" %%a in (%filename-after%) do (
    set MATCHFLAG=false
    for /f "delims=" %%b in (%filename-before%) do (
        if %%a==%%b (
            set MATCHFLAG=true
        ) else (
            set NGSERVICE=%%a
        )
    )
    if not !MATCHFLAG!==true (
        set MSG=%NGMSG1%!NGSERVICE!%NGMSG2%
        echo !MSG!
        set RESULT=false
    )
)
if not !RESULT!==false (
    echo !OKMSG1!
)
endlocal
pause

 

この2行はファイルを読み込んで、読み込んだ行を%%aまたは%%bに入れる処理を繰り返します。

  • for /f “delims=” %%a in (%filename-after%) do (
  • for /f “delims=” %%b in (%filename-before%) do (

この%%aと%%bを比較する事でその行が存在しているか判断するようになっています。

実行したときに文字化けする場合があるので、ファイルを保存する文字コードはANSIにしてください。
メモ帳の「名前を付けて保存」を押した後の保存画面で「保存」ボタンの左にある”文字コード”を「ANSI」を指定して保存します。

 

比較するファイルを作成する

サービス状態のファイル出力方法はいくつかあると思いますが、今回はWindowsPowerShellの「get-wmiobject win32_service」を使います。

ここからのコマンドはPowerShellのPS C:\Users\mizusibuki>となっている画面で実行してください。ログインしているユーザー名になっていると思います。

ファイル名を当日日付にする為、日付用の変数を準備する。

$now = Get-Date -Format “yyyyMMdd”
サービス一覧の中からステータスがストップの状態のサービスをファイルに書き出す。
get-wmiobject win32_service | select Name,State | Where-Object {$_.State -eq “Stopped” } > service-before_$now.log
ファイルはコマンドを実行したC:\Users\xxxxxに作成されます。
これで取得できたファイルはこんな感じになります。
Name                                     State  
----                                     -----  
AJRouter                                 Stopped
AppIDSvc                                 Stopped
AppMgmt                                  Stopped
ALG                                      Stopped

私のPCで実行した結果ですが、かなり多かったのでテスト用に上4つだけに絞りました。

続けて再起動後のサービス一覧も取得します。
取得するコマンドは同じですが、書き出すファイル名の部分だけbeforeからafterに変更しています。

ファイル名を当日日付にする為、日付用の変数を準備する。

$now = Get-Date -Format “yyyyMMdd”
サービス一覧の中からステータスがストップの状態のサービスをファイルに書き出す。
get-wmiobject win32_service | select Name,State | Where-Object {$_.State -eq “Stopped” } > service-after_$now.log
これで取得できたファイルはこんな感じになります。
Name                                     State  
----                                     -----  
AdobeFlashPlayerUpdateSvc                Stopped
AJRouter                                 Stopped
ALG                                      Stopped
AppIDSvc                                 Stopped
AppMgmt                                  Stopped

同じだと比較の効果が分からないのでわざと場所をずらしたり、サービスを追加したりしています。

  • ALG 表示されている場所を5番目から3番目へ移動
  • AdobeFlashPlayerUpdateSvc 新たに追加

 

実行する

作成したサービス比較.batをダブルクリックします。

コマンドプロンプトが起動して結果が表示されました。

「AdobeFlashPlayerUpdateSvc Stopped」は元々起動してましたが、現在は停止状態です。
続行するには何かキーを押してください . . .

想定通りの動きです。

AdobeFlashPlayerUpdateSvcはOS再起動前のファイルにストップとして存在しなかったのに、OS再起動後のファイルにはストップとして存在していたので再起動によって止まってしまった事がわかります。

また順番を変えたALGについてはOS再起動前も後もストップの状態なので異常にはなっていません。

サービスの状態に異常がない場合は下記表示になります。

サービス状態は正常です。
続行するには何かキーを押してください . . .

 

ちなみにこの2つのファイルをFCコマンドで比較してみました。

C:\Users\mizusibuki>fc service-before_20220419.log service-after_20220419.log
ファイル service-before_20220419.log と SERVICE-AFTER_20220419.LOG を比較しています
***** service-before_20220419.log
----                                     -----
AJRouter                                 Stopped
AppIDSvc                                 Stopped
***** SERVICE-AFTER_20220419.LOG
----                                     -----
AdobeFlashPlayerUpdateSvc                Stopped
AJRouter                                 Stopped
ALG                                      Stopped
AppIDSvc                                 Stopped
*****

***** service-before_20220419.log
ALG                                      Stopped
***** SERVICE-AFTER_20220419.LOG
*****

差異があることはわかりますが、かなり見にくいです。
AdobeFlashPlayerUpdateSvcに異常がある事やALGの行がずれているだけという部分はわかりません。

うまくバッチが動かない場合は、各ファイルの文字コードがANSIになっているか確認してください。
スポンサーリンク

やった事のまとめ

OS再起動前後にPowerShellでサービス状態をファイルに出力して、バッチファイルを実行する事で、異常のあるサービスを見つける事ができました。

作業するサーバが数台であれば目視で確認も可能だと思いますが、サーバ追加によって数十台になってくると集中力に限界がくると思います。
最初にバッチファイルを作っておくことで、作業が楽で正確になっていくのでぜひとりいれてみましょう。

タイトルとURLをコピーしました