Sửa lỗi 'Error 2: The system cannot find the file specified' khi khởi động Windows Service

intermediate🪟 Windows2026-05-09| Windows 10, Windows 11, Windows Server 2016/2019/2022 — mọi Windows Service (tùy chỉnh, bên thứ ba hoặc tích hợp sẵn)

Error Message

Windows could not start the service on Local Computer. Error 2: The system cannot find the file specified.
#windows#service#registry#sc

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.

Related Error Notes