TL;DR
レジストリ内のサービスの実行ファイルパスが間違っています — 存在しないファイルを指しています。正しいパスを見つけ、sc config で更新し、サービスを再起動してください。
sc config "YourServiceName" binpath= "C:\correct\path\to\service.exe"
sc start "YourServiceName"
実際に何が起きているのか
すべてのWindowsサービスは、以下のレジストリキーに実行ファイルのパスを保存しています:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<ServiceName>\ImagePath
Windowsが Error 2: The system cannot find the file specified をスローする場合、サービスコントロールマネージャー(SCM)がその実行ファイルを起動しようとしたところ、Win32エラーコード2 — ERROR_FILE_NOT_FOUND が返ってきたということです。バイナリが存在しないか、移動されたか、そもそもレジストリのパスが正しくなかったかのいずれかです。
典型的な原因は以下のとおりです:
- アプリを別のドライブやフォルダに再インストールしたが、サービスエントリが更新されなかった
- 不完全なアンインストールによりバイナリは削除されたが、サービス登録が残ってしまった
- パスにタイポがある状態でサービスが手動登録された
- ウイルス対策ソフトやクリーンアップツールが実行ファイルをひそかに削除した
- カスタムサービスをデプロイしたが、インストーラーが誤った場所にファイルを配置した
ステップ1 — 壊れたパスを特定する
まずサービス名を確認します(表示名とは異なります)。管理者権限のコマンドプロンプトを開いて実行してください:
sc query type= all state= all | findstr /i "SERVICE_NAME DISPLAY"
名前がわかっている場合は直接クエリできます:
sc qc "YourServiceName"
出力の BINARY_PATH_NAME の行を確認してください:
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: YourServiceName
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Program Files\OldApp\service.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Your Service
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
次に、そのパスがディスク上に実際に存在するか確認します:
dir "C:\Program Files\OldApp\service.exe"
ファイルが見つからない場合は、それが原因です。
ステップ2 — バイナリを探し出す
Cドライブ全体を対象に実行ファイル名を検索します:
where /r C:\ service.exe 2>nul
大容量ドライブではPowerShellの方が高速です:
Get-ChildItem -Path C:\ -Filter "service.exe" -Recurse -ErrorAction SilentlyContinue | Select-Object FullName
何も見つからない場合、ファイルは完全に消えています — 先にアプリケーションを再インストールしてください。別の場所で見つかった場合は、新しいパスを控えてステップ3に進んでください。
ステップ3 — サービスのパスを修正する
方法A:sc config を使う(最も速い)
1つのコマンドでパスを更新します。binpath= の後のスペースは必須です — これを省略すると sc は何のエラーも出さずに失敗します:
sc config "YourServiceName" binpath= "C:\NewPath\to\service.exe"
引数を必要とするJavaサービスや.NETワーカーの場合は、内側のクォートをこのようにエスケープしてください:
sc config "YourServiceName" binpath= "\"C:\path\to\service.exe\" --arg1 value"
方法B:レジストリを直接編集する
regedit を開いて以下に移動します:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName
ImagePath をダブルクリックして正しいパスを貼り付けます。引数を取るバイナリの場合:
"C:\path\to\service.exe" --flag value
カーネルドライバやシステムサービスは環境変数を使うことが多いため、絶対パスに展開せずそのままにしておいてください:
%SystemRoot%\System32\yourdriver.sys
方法C:PowerShell を使う
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\YourServiceName" `
-Name "ImagePath" `
-Value '"C:\correct\path\to\service.exe"'
ステップ4 — サービスを起動して確認する
sc start "YourServiceName"
実行中であることを確認します:
sc query "YourServiceName"
出力に STATE : 4 RUNNING が表示されれば成功です。PowerShellでも確認できます:
Get-Service -Name "YourServiceName" | Select-Object Name, Status, StartType
見落としやすいエッジケース
スペースを含むパスのクォート処理
スペースを含むパスは ImagePath 内でクォートで囲む必要があります。クォートがないと、SCMは最初のスペースで分割し、C:\Program のような場所でバイナリを探そうとして明らかに失敗します:
# 誤り — "Files" の前のスペースで分割される
sc config "MySvc" binpath= C:\Program Files\App\svc.exe
# 正しい
sc config "MySvc" binpath= "\"C:\Program Files\App\svc.exe\""
特定のユーザーアカウントでサービスを実行する場合
サービスがドメインアカウントやローカルアカウント(LocalSystem以外)で実行される場合、そのアカウントはバイナリとその親ディレクトリの両方に対して読み取りおよび実行権限が必要です。以下で確認できます:
icacls "C:\path\to\service.exe"
サービスがカーネルドライバの場合
ドライバは %SystemRoot%\System32\drivers\ 配下に存在します。ドライバファイルが見つからない場合は、インストーラーを再実行するかドライバパッケージを再展開する必要があります — ドライバの場合、ImagePath を任意の場所に向けても機能しません。
不要になったサービスを削除したい場合
アプリがすでにアンインストールされており、残骸エントリだけを削除したい場合:
sc delete "YourServiceName"
Services MMCからすぐに消えるわけではありません — 再起動するか、SCMがリフレッシュするまで待ってください。
再起動後も修正が維持されることを確認する
自動起動サービスの場合、再起動サイクルを経てもパスが保持されることを確認します:
sc qc "YourServiceName" | findstr START_TYPE
# 表示されるべき内容: AUTO_START または DEMAND_START
# 再起動時の起動をシミュレート
sc stop "YourServiceName"
sc start "YourServiceName"
sc query "YourServiceName"
まだエラーが出る場合は、イベントビューアーを開いてください:
eventvwr.msc
Windowsログ → システム に移動し、ソース:Service Control Manager でフィルタリングしてください。サービスのエラー履歴が表示され、コマンドラインよりも詳細な情報が得られることが多いです。

