Windowsサーバのサービス一覧を出力する方法

業務でサーバのサービス一覧とステータスを出力することになった。

要件は以下の通り。

  • サーバは約300台
  • OSはWindows2003、2008、2012、2016の混在環境
  • 言語は日本語と英語
  • 必要項目は、ホスト名、サービス名、表示名、サービスの状態、スタートアップの種類の5つ
  • 言語の種類は問わず

この条件だとscコマンドかPowerShellを使用するのが妥当と思う。

ネットで調べながら、2つの方法を確認したので備忘録を兼ねて掲載しておく。

PowerShellを使用する方法

Get-Service | Export-CSV c:\temp\service.csv -encoding Default

※エンコードを指定しないと全角文字が文字化けするので注意
Get-Service | Select-Object Name,Status,Displayname | Export-CSV c:\temp\service.csv -encoding Default

※エクスポートする項目を指定します。

バッチファイルを使用する方法

Windows10 Professional上での動作を確認しています。
対象サーバは、Windows Server 2016、2012、2008、2003、2000です。

@echo off
rem ///////////////////////////////////////////////////////////////////////////////
rem 概要         :任意のWindowsサーバでサービスの一覧をCSVファイルとして出力する
rem 入力ファイル :serverlist.txt(対象サーバを指定する)
rem                ホスト名、もしくはIPアドレスを入力。複数入力時は改行すること。
rem 出力ファイル :%computername%_sl_yyyymmdd_hhmmss.csv
rem               (ホスト名,サービス名,表示名,状態,スタートアップ)
rem 作成者       :ITStudy
rem ///////////////////////////////////////////////////////////////////////////////

setlocal

rem ファイルから対象サーバを読み込む
for /F %%s IN (serverlist.txt) do call :svinfoget %%s

rem --------------------------------------------------------------------------------------
rem サーバ情報を取得
rem --------------------------------------------------------------------------------------
:svinfoget
set tsv=%1

rem 現在の時刻を取得(hhmmssss)
set t=%time: =%
set t=%t::=%
set t=%t:.=%

rem 取得するサービスリスト
set slist=%tsv%_sl_%date:/=%_%t%.csv
if exist %slist% del /f/s/q %slist% >nul 2>&1

rem 一時ファイル
set cklist=svc.txt
if exist %cklist% del /f/s/q %cklist% >nul 2>&1

rem --------------------------------------------------------------------------------------
rem サービス情報取得
rem --------------------------------------------------------------------------------------
rem サーバ上に登録されている全サービスのリスト取得 
sc \\%tsv% query state= all type= service | find "SERVICE_NAME" > %cklist%
for /F "tokens=1-3 delims=:" %%a IN (%cklist%) do call :serviceinfo "%%b"

rem 一時ファイルの削除
if exist %cklist% del /f/s/q %cklist% >nul 2>&1

exit /b

rem --------------------------------------------------------------------------------------
rem サービスの詳細情報を取得(スタートアップの種類/表示名/状態)
rem --------------------------------------------------------------------------------------
:serviceinfo
set svcname=%~1
set svcname=%svcname:~1%

rem スタートアップの種類の抜き出し
for /F "skip=1 tokens=1-3 delims=: " %%A IN ('sc \\%tsv% qc "%svcname%"') do (
if "%%A" == "START_TYPE" set STYPE=%%C
)

rem 表示名の抜き出し
for /F "skip=1 tokens=1-2 delims=:" %%A IN ('sc \\%tsv% qc "%svcname%"') do (
if "%%A" == "        DISPLAY_NAME       " set DN="%%B"
)

rem 状態の抜き出し
for /F "skip=1 tokens=1-3 delims=: " %%A IN ('sc \\%tsv% queryex "%svcname%"') do (
if "%%A" == "STATE" set ST=%%C
)

rem ファイル出力
echo %tsv%,%svcname%,%DN%,%ST%,%STYPE% >> %slist%

exit /b
endlocal

ファイルは以下からダウンロードできます。
・servicecheck.bat・・・実行ファイル
・serverlist.txt・・・対象サーバリスト
・localhost_sl_20190501_16380641.csv・・・出力ファイル

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