Chuyện gì đang xảy ra
Bạn cố khởi động một Windows Service — từ Services.msc, dòng lệnh, hoặc sau khi reboot — và nhận được thông báo này:
Windows could not start the service on Local Computer.
Error 1067: The process terminated unexpectedly.
Dịch ra: tiến trình của service (.exe) đã khởi động, rồi lập tức bị crash trước khi kịp báo cáo trạng thái "running" về Service Control Manager. Windows thấy tiến trình kết thúc quá nhanh. Nó không biết tại sao — chỉ biết rằng tiến trình đã không tồn tại được.
1067 là triệu chứng, không phải chẩn đoán. Bạn không thể fix nếu không biết nguyên nhân crash — và câu trả lời đó nằm trong log.
Bước 1: Mở Event Viewer trước tiên
Event Viewer hầu như luôn có lỗi thực sự. Thông báo 1067 chỉ là lớp bọc bên ngoài; nguyên nhân crash thật sự — thiếu DLL, file config sai, xung đột port — được ghi lại riêng.
Mở nó:
eventvwr.msc
Kiểm tra hai nơi:
- Windows Logs → Application — lỗi từ chính tiến trình service
- Windows Logs → System — sự kiện từ Service Control Manager (nguồn:
Service Control Manager)
Lọc các sự kiện "Error" màu đỏ có thời gian xảy ra gần lúc bạn cố khởi động service. Phần mô tả trong các sự kiện đó — không phải thông báo 1067 — mới là thứ cho bạn biết thực sự đã xảy ra chuyện gì.
Những thứ thường gặp:
The program can't start because VCRUNTIME140.dll was not found→ thiếu Visual C++ runtimeFailed to open config file: C:\path\to\config.json→ sai thư mục làm việc hoặc thiếu filebind: Only one usage of each socket address is normally permitted→ port đã bị chiếmAccess is denied→ vấn đề quyền truy cập file hoặc registry- Lỗi riêng của ứng dụng từ code service của bạn
Bước 2: Kiểm tra cấu hình service
Đảm bảo đường dẫn binary đúng và tài khoản service trông hợp lệ:
sc qc "YourServiceName"
Lệnh này hiển thị kết quả như sau:
SERVICE_NAME: YourServiceName
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\path\to\service.exe --config C:\path\to\config.ini
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Your Service
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
Xác nhận file binary thực sự tồn tại tại đường dẫn đó:
Test-Path "C:\path\to\service.exe"
False có nghĩa là service đã được đăng ký với một đường dẫn không còn tồn tại — thường xảy ra sau khi cài lại hoặc di chuyển thư mục. Sửa lại:
sc config "YourServiceName" binpath= "C:\correct\path\to\service.exe"
Khoảng trắng sau binpath= là bắt buộc — cú pháp của sc rất khó tính về điều này.
Bước 3: Chạy file thực thi trực tiếp
Mở command prompt với quyền Administrator và chạy file binary của service trực tiếp:
"C:\path\to\service.exe"
Hoặc với tham số:
"C:\path\to\service.exe" --config "C:\path\to\config.ini"
Chạy thủ công buộc lỗi phải hiển thị ra console thay vì để Service Control Manager nuốt chửng im lặng. Thiếu dependency, giá trị config sai, vấn đề quyền truy cập — tất cả đều in ra ngay lập tức khi bạn tự chạy binary, thay vì biến mất vào lớp bọc 1067 chung chung.
Nếu binary thoát ngay lập tức, kiểm tra exit code:
echo %errorlevel%
Exit code âm như -1073741515 (hex: 0xC0000135) là dấu hiệu rõ ràng của việc thiếu DLL dependency.
Bước 4: Khắc phục nguyên nhân gốc rễ
Thiếu DLL hoặc runtime
Event Viewer hiển thị thông báo kiểu VCRUNTIME140.dll was not found? Cài đặt runtime phù hợp:
- Với
VCRUNTIME140.dllhoặc tương tự: cài Visual C++ Redistributable - Với Java services: xác minh
JAVA_HOMEđã được đặt và phiên bản JRE đúng đã được cài - Với .NET services: kiểm tra các runtime đã cài bằng
dotnet --list-runtimes
Không tìm thấy hoặc file config không hợp lệ
Đây là cái bẫy làm nhiều người mắc phải: service không chạy từ thư mục của chính nó. Thư mục làm việc mặc định là C:\Windows\System32. Bất kỳ đường dẫn tương đối nào trong config của bạn đều âm thầm trỏ đến sai chỗ.
Luôn dùng đường dẫn tuyệt đối trong config của service, hoặc truyền vị trí config trực tiếp trong đường dẫn binary:
sc config "YourServiceName" binpath= "\"C:\path\to\service.exe\" --config \"C:\path\to\config.ini\""
Vấn đề quyền của tài khoản service
Xem SERVICE_START_NAME trong kết quả lệnh sc qc. Nếu là LocalService, NetworkService, hoặc tài khoản domain tùy chỉnh thay vì LocalSystem, tài khoản đó có thể không có quyền đọc thư mục binary hoặc các file config.
Kiểm tra quyền mà tài khoản đó có:
icacls "C:\path\to\service\directory"
Cấp quyền đọc và thực thi:
icacls "C:\path\to\service\directory" /grant "NT AUTHORITY\LocalService:(RX)" /T
Nếu service ghi file log, nó cần quyền ghi vào thư mục log — nếu không nó sẽ crash ngay khi cố mở file log mà nó không thể tạo.
Xung đột port
Một service bind port 8080 khi khởi động sẽ crash ngay lập tức nếu thứ gì đó đã chiếm port đó. Tìm kẻ gây ra:
netstat -ano | findstr :8080
Ghi lại PID ở cột cuối, rồi tra cứu nó:
tasklist | findstr 1234
Dừng tiến trình xung đột hoặc thay đổi port của service trong file config.
Bước 5: Khởi động lại service và xác nhận
Khởi động service và kiểm tra trạng thái:
sc start "YourServiceName"
sc query "YourServiceName"
Bạn muốn thấy:
STATE : 4 RUNNING
Hoặc trong PowerShell:
Get-Service -Name "YourServiceName" | Select-Object Name, Status, StartType
Chờ 10–15 giây, rồi query lại. Một service bị crash khi khởi động thường hiển thị RUNNING trong chốc lát trước khi chuyển lại thành STOPPED. Nếu điều đó xảy ra, quay lại Event Viewer — các lỗi mới từ lần thử đó sẽ có timestamp ngay trong khoảng thời gian đó.
Bài học rút ra
- Error 1067 luôn là triệu chứng. Lỗi thật sự nằm ở chỗ khác — thường là Event Viewer hoặc file log do chính service ghi ra.
- Chạy
.exethủ công với quyền Administrator là bước debug nhanh nhất. Nó bộc lộ những lỗi mà Service Control Manager sẽ nuốt chửng im lặng. - Đường dẫn tương đối trong config của service là cái bẫy phổ biến. Service không chạy từ thư mục của chính nó — hãy dùng đường dẫn tuyệt đối.
- Sau bất kỳ bản cập nhật Windows hoặc cài lại ứng dụng nào, hãy kiểm tra xem đường dẫn binary trong config service có còn trỏ đến vị trí hợp lệ không. Các mục registry trở nên lỗi thời khi phần mềm bị di chuyển hoặc nâng cấp.

