TL;DR
Đường dẫn thực thi của service trong registry bị sai — nó trỏ đến một file không còn tồn tại. Hãy tìm đường dẫn đúng, cập nhật bằng sc config, rồi khởi động lại service.
sc config "YourServiceName" binpath= "C:\correct\path\to\service.exe"
sc start "YourServiceName"
Chuyện Gì Đang Xảy Ra
Mỗi Windows service lưu đường dẫn thực thi của nó trong registry tại:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<ServiceName>\ImagePath
Khi Windows báo Error 2: The system cannot find the file specified, Service Control Manager (SCM) đã cố khởi chạy file thực thi đó nhưng nhận về mã lỗi Win32 số 2 — ERROR_FILE_NOT_FOUND. File binary bị thiếu, đã bị di chuyển, hoặc đường dẫn trong registry chưa bao giờ đúng.
Đây là các nguyên nhân phổ biến:
- Bạn cài lại ứng dụng vào ổ đĩa hoặc thư mục khác, nhưng service entry không được cập nhật
- Gỡ cài đặt không hoàn toàn đã xóa file binary nhưng để lại phần đăng ký service
- Service được đăng ký thủ công với đường dẫn bị gõ sai
- Phần mềm diệt virus hoặc công cụ dọn dẹp đã âm thầm xóa file thực thi
- Bạn đang triển khai một service tự viết và trình cài đặt đã đặt file vào sai vị trí
Bước 1 — Xác Định Đường Dẫn Bị Lỗi
Trước tiên hãy lấy tên service (không phải tên hiển thị — chúng khác nhau). Mở Command Prompt với quyền Administrator và chạy:
sc query type= all state= all | findstr /i "SERVICE_NAME DISPLAY"
Đã biết tên rồi? Truy vấn trực tiếp:
sc qc "YourServiceName"
Tìm dòng BINARY_PATH_NAME trong kết quả:
[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
Bây giờ kiểm tra xem đường dẫn đó có thực sự tồn tại trên ổ đĩa không:
dir "C:\Program Files\OldApp\service.exe"
File Not Found? Đó chính là thủ phạm.
Bước 2 — Tìm File Binary
Tìm kiếm toàn bộ ổ C để tìm tên file thực thi:
where /r C:\ service.exe 2>nul
PowerShell nhanh hơn trên ổ đĩa lớn:
Get-ChildItem -Path C:\ -Filter "service.exe" -Recurse -ErrorAction SilentlyContinue | Select-Object FullName
Không tìm thấy gì? File thực sự đã biến mất — hãy cài lại ứng dụng trước khi tiếp tục. Nếu file xuất hiện ở chỗ khác, ghi lại đường dẫn mới và chuyển sang Bước 3.
Bước 3 — Sửa Đường Dẫn Service
Cách A: Dùng sc config (nhanh nhất)
Cập nhật đường dẫn bằng một lệnh duy nhất. Khoảng trắng sau binpath= là bắt buộc — bỏ qua nó và sc sẽ thất bại một cách âm thầm:
sc config "YourServiceName" binpath= "C:\NewPath\to\service.exe"
Đang chạy Java service hoặc .NET worker với tham số? Escape dấu nháy bên trong như sau:
sc config "YourServiceName" binpath= "\"C:\path\to\service.exe\" --arg1 value"
Cách B: Chỉnh Sửa Registry Trực Tiếp
Mở regedit và điều hướng đến:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName
Nhấp đúp vào ImagePath và dán đường dẫn đúng vào. Với các binary có tham số:
"C:\path\to\service.exe" --flag value
Kernel driver và system service thường dùng biến môi trường — giữ nguyên chúng thay vì mở rộng thành đường dẫn cố định:
%SystemRoot%\System32\yourdriver.sys
Cách C: Dùng PowerShell
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\YourServiceName" `
-Name "ImagePath" `
-Value '"C:\correct\path\to\service.exe"'
Bước 4 — Khởi Động Service và Xác Nhận
sc start "YourServiceName"
Kiểm tra service đang chạy:
sc query "YourServiceName"
Bạn muốn thấy STATE : 4 RUNNING trong kết quả. Hoặc dùng PowerShell:
Get-Service -Name "YourServiceName" | Select-Object Name, Status, StartType
Các Trường Hợp Ngoại Lệ Hay Gặp
Đường dẫn có khoảng trắng cần đặt trong dấu nháy
Bất kỳ đường dẫn nào có khoảng trắng đều phải được bọc trong dấu nháy bên trong ImagePath. Nếu không, SCM sẽ tách chuỗi tại khoảng trắng đầu tiên và cố tìm binary tại vị trí kiểu như C:\Program — rõ ràng sẽ thất bại:
# Sai — bị tách tại khoảng trắng trước "Files"
sc config "MySvc" binpath= C:\Program Files\App\svc.exe
# Đúng
sc config "MySvc" binpath= "\"C:\Program Files\App\svc.exe\""
Service chạy bằng tài khoản người dùng cụ thể
Khi service chạy bằng tài khoản domain hoặc local (không phải LocalSystem), tài khoản đó cần quyền đọc và thực thi trên cả file binary lẫn thư mục cha của nó. Kiểm tra bằng:
icacls "C:\path\to\service.exe"
Service là kernel driver
Driver nằm trong %SystemRoot%\System32\drivers\. Nếu file driver bị thiếu, cần chạy lại trình cài đặt hoặc giải nén lại gói driver — không thể chỉ trỏ ImagePath đến vị trí tùy ý cho driver.
Chỉ muốn xóa service lỗi đi?
Nếu ứng dụng đã gỡ cài đặt và bạn chỉ muốn dọn sạch mục service bị bỏ lại:
sc delete "YourServiceName"
Nó sẽ không biến mất khỏi Services MMC ngay lập tức — hãy khởi động lại máy hoặc chờ SCM tự làm mới.
Xác Nhận Sửa Lỗi Vẫn Còn Sau Khi Khởi Động Lại
Với các service tự khởi động, xác nhận đường dẫn vẫn còn sau khi khởi động lại:
sc qc "YourServiceName" | findstr START_TYPE
# Kết quả phải hiển thị: AUTO_START hoặc DEMAND_START
# Mô phỏng việc khởi động khi restart
sc stop "YourServiceName"
sc start "YourServiceName"
sc query "YourServiceName"
Vẫn thấy lỗi? Mở Event Viewer:
eventvwr.msc
Vào Windows Logs → System và lọc theo Source: Service Control Manager. Toàn bộ lịch sử lỗi của service sẽ hiển thị ở đó, thường có nhiều chi tiết hơn so với những gì dòng lệnh cung cấp.

