Windowsのサービスとは、バックグラウンドで動作するプログラムで、Windows OSの様々な機能やアプリケーションの実行に必要なものです。Windowsのサービスは、起動時に自動的に実行され、ユーザーがログインしていないときでも、バックグラウンドで動作し続けます。Windowsサービスは、システム管理者が制御することができ、サービスの開始、停止、一時停止、再開、または削除などの操作を行うことができます。その特性上、ユーザーの意図しないところで動き始め動き続けるサービスもまま現れます。この記事では、ファイル名からWindowsサービスを検索する方法を解説します。これにより、プロセス、ファイル、サービス間の関連性を確認し、不要なサービスが実行されているかどうかを判断することが容易になります。
Windows ではサービスを実行ファイルの名前から検索する機能はデフォルトではありません。少なくとも自分は見つけられませんでした。。しかし、PowerShellスクリプトを使って、ファイル名からサービスを検索する方法を実現できます。これにより、サービスがすでに登録されているかどうかを確認できます。
次のPowerShellスクリプトは、実行ファイルの名前からサービスを検索する方法を示しています。
# SearchServicesByFileName.ps1 # サービスを実行ファイルの名前から検索するスクリプト # 実行引数を$FilePathに格納 Param( [Parameter(Mandatory=$true)] [string]$FilePath ) # Win32_Service WMIクラスからサービス情報を取得する # PathNameがnullでなく、$FilePathで指定された文字列が含まれているサービスのみを抜き出すする $services = Get-WmiObject -Class Win32_Service | Where-Object {$_.PathName -ne $null -and $_.PathName.Contains($FilePath)} # フィルタリングされたサービスの名前、実行状態、ファイルパスを表示する $services | Select-Object Name, State, PathName
実行例は次です。
> .\SearchServicesByFileName.ps1 ApplicationWebServer Name State PathName ---- ----- -------- NIApplicationWebServer Running "C:\Program Files (x86)\National Instruments\Shared\NI WebServer\ApplicationWebServer.exe" -user NIApplicationWebServer64 Stopped "C:\Program Files\National Instruments\Shared\NI WebServer\ApplicationWebServer.exe" -user
この様なスクリプトを使用することで、プロセス、ファイル、サービス間の関係を確認し、何かを探す際にファイルとサービスを結び付けることが容易になります。例えば、予期せずポートを占有しているプロセスがサービスに登録されていて、毎回自動的に起動するようになっていて、毎回ポートを占有する様になっているかどうかを調べることができます。このような情報はサービスの管理や最適化を行う際に役立ちます。