Windows OSの管理において、バックグラウンドで動作するサービスの管理はシステム管理者にとって避けて通れない重要なタスクです。
従来のコントロールパネルにある「サービス」管理ツール(services.msc)を使用する方法もありますが、大量のサーバーを管理する場合や自動化を検討する場合にはPowerShellの利用が非常に効率的です。
本記事では、PowerShellでサービス一覧を確認するための基本コマンドである「Get-Service」の使い方から、実務で役立つ高度なフィルタリング手法までを詳しく解説します。
この記事を読むことで、コマンドラインから素早く目的のサービスを見つけ出し、その状態を正確に把握するスキルを習得できるでしょう。
Get-Serviceコマンドの基本操作
PowerShellでサービス情報を取得するための最も基本的なコマンドレットは、Get-Serviceです。
このコマンドを単体で実行すると、ローカルコンピューターに登録されているすべてのサービスが一覧として表示されます。
まずは、管理者権限でPowerShellプロンプトを起動し、以下のコマンドを入力してみましょう。
# すべてのサービスを取得する基本コマンド
Get-Service
Status Name DisplayName
------ ---- -----------
Stopped AarSvc_56789 Agent Activation Runtime_56789
Running Appinfo Application Information
Stopped AppIDSvc Application Identity
...
出力結果には、「Status(状態)」「Name(サービス名)」「DisplayName(表示名)」の3つの列がデフォルトで表示されます。
StatusがRunningであればサービスは稼働中であり、Stoppedであれば停止していることを示します。
特定のサービス名がわかっている場合は、引数としてその名前を指定することで、特定のサービスのみの情報をピンポイントで取得可能です。
# 「WinRM」サービスの状態を確認する
Get-Service -Name WinRM
このように、引数を指定することで不要な情報を排除し、必要なデータだけを素早く確認することができます。
表示名を利用した検索
サービス名(Name)ではなく、コントロールパネルなどで見かける「表示名」で検索したい場合には、-DisplayNameパラメーターを使用します。
サービス名はシステム上の短い識別子ですが、表示名は人間が理解しやすい長い名前になっていることが一般的です。
# 表示名に「Windows」が含まれるサービスを取得する
Get-Service -DisplayName "Windows*"
アスタリスク(*)を使用することでワイルドカード検索が可能になり、部分一致するサービスをまとめて抽出できます。
サービスのフィルタリング手法
実務においては、膨大なサービス一覧から「現在実行中のものだけ」や「特定の条件に合致するものだけ」を抽出したい場面が多くあります。
PowerShellでは、パイプライン(|)とWhere-Objectを組み合わせることで、柔軟なフィルタリングが可能です。
実行中のサービスのみを表示する
現在システムでアクティブに動作しているサービスのみを確認したい場合は、以下のようなコマンドを実行します。
# 実行中のサービスのみをフィルタリングして表示する
Get-Service | Where-Object { $_.Status -eq "Running" }
このコマンドは、まずすべてのサービスを取得し、その中からStatusプロパティが「Running」に等しいものだけを通過させています。
反対に、停止しているサービスのみを確認したい場合は、-eq "Stopped"に変更するだけで対応可能です。
高度な条件によるフィルタリング
Where-Objectを利用すれば、複数の条件を組み合わせた複雑な抽出も容易に行えます。
例えば、「名前が『Net』で始まり、かつ状態が『Stopped』のサービス」を探す場合は以下のように記述します。
# 複雑な条件でサービスを検索する
Get-Service | Where-Object { $_.Name -like "Net*" -and $_.Status -eq "Stopped" }
このように、比較演算子(-eq, -like, -andなど)を使いこなすことで、管理対象のサービスを自由自在に絞り込むことができます。
依存関係にあるサービスを確認する
特定のサービスを停止しようとした際、他のサービスも一緒に停止してしまうことがあります。
これはサービス間に「依存関係」があるためであり、Get-Serviceではこれらの関係も確認できます。
# 特定のサービスが依存しているサービスを確認する
Get-Service -Name LanmanWorkstation | Select-Object -Property Name, RequiredServices
RequiredServicesプロパティを確認することで、そのサービスが動作するために必要な他のサービスを知ることができます。
表示形式のカスタマイズと並べ替え
デフォルトの表示項目だけでは情報が不足している場合、表示する列をカスタマイズしたり、順序を並べ替えたりすることで視認性を高められます。
必要なプロパティを選択する(Select-Object)
Get-Serviceが持つ情報は、デフォルトで表示される3項目だけではありません。
Select-Objectを使用することで、スタートアップの種類(StartType)などの詳細情報を追加して表示できます。
# サービス名、状態、スタートアップの種類を表示する
Get-Service | Select-Object Name, Status, StartType
以下の表は、Get-Serviceでよく利用される主なプロパティをまとめたものです。
| プロパティ名 | 説明 |
|---|---|
| Name | サービスのシステム名(識別子) |
| DisplayName | 管理ツールなどで表示される名前 |
| Status | 現在の状態(Running, Stopped, Pausedなど) |
| StartType | 起動時の設定(Automatic, Manual, Disabled) |
| CanStop | そのサービスが停止可能かどうか |
サービスを並べ替える(Sort-Object)
大量のリストを閲覧する際は、状態別や名前順に並んでいたほうが効率的です。
Sort-Objectコマンドレットを使用すると、指定したプロパティに基づいて結果をソートできます。
# 状態(Status)で昇順に並べ替えて表示する
Get-Service | Sort-Object Status
降順にしたい場合は、-Descendingパラメーターを付与してください。
実践的な利用シーンと応用
ここからは、より実務に近い形での応用テクニックを紹介します。
リモートコンピューターのサービスを確認する
PowerShellの強みは、ネットワーク上の別のコンピューターに対しても同様の操作が行える点にあります。
Invoke-Commandを利用して、リモートサーバーのサービス一覧を取得してみましょう。
# リモートコンピューター「Server01」のサービス一覧を取得する
Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Service }
これにより、自席の端末から離れた場所にあるサーバーの稼働状況を即座に確認できます。
ただし、この操作にはリモート管理(WinRM)が有効であることと、適切なアクセス権限が必要です。
結果を外部ファイルに出力する
定期的な監査や報告のために、サービスの一覧をファイルとして保存しておきたい場合があります。
Export-Csvを使用すれば、Excelで開ける形式でデータを保存できます。
# サービス一覧をCSVファイルとして出力する
Get-Service | Select-Object Name, DisplayName, Status, StartType | Export-Csv -Path "C:\temp\ServiceList.csv" -Encoding UTF8 -NoTypeInformation
CSV形式で出力しておけば、後からデータの加工や比較が容易になり、システム構成管理の資料としても役立ちます。
特定のステータス以外をすべて抽出する
「正常に動いているもの以外」を見つけ出すことは、トラブルシューティングにおいて非常に重要です。
例えば、「自動起動に設定されているのに停止しているサービス」を見つけるには以下のように記述します。
# 自動起動設定なのに停止しているサービスを抽出
Get-Service | Where-Object { $_.StartType -eq "Automatic" -and $_.Status -eq "Stopped" }
このような条件指定を行うことで、本来動作しているべきサービスが何らかの理由で落ちている状況を迅速に特定できます。
まとめ
PowerShellのGet-Serviceコマンドレットは、Windowsサービスの管理において非常に強力かつ柔軟なツールです。
単に一覧を表示するだけでなく、Where-ObjectによるフィルタリングやSelect-Objectによる情報の整理を組み合わせることで、必要な情報を的確に抽出できます。
GUIツールでは時間がかかる複雑な検索や複数台の管理も、コマンド一行で完結させることが可能です。
まずは基本的なコマンドから使い始め、徐々にパイプラインを活用した高度な操作に慣れていくことをおすすめします。
本記事で紹介したテクニックを活用して、日々のシステム管理業務の効率化を実現してください。
