Tình huống xảy ra
2 giờ sáng. Một service vừa crash trên Windows server. Bạn mở CMD, gõ lệnh quen thuộc:
net stop MyService
net start MyService
Và nhận ngay cái tát:
System error 5 has occurred.
Access is denied.
Hoặc bạn thử dùng sc:
sc stop MyService
[SC] OpenService FAILED 5:
Access is denied.
Vẫn bức tường đó. Service vẫn chết, incident vẫn còn mở, và thời gian đang cạn dần.
Tại sao lỗi này xảy ra
Error 5 là cách Windows nói rằng tiến trình đang gọi Service Control Manager (SCM) không có đủ quyền. Có hai nguyên nhân chính:
- Bạn đang chạy CMD với tư cách user thường — dù tài khoản của bạn thuộc nhóm Administrators, UAC vẫn gỡ bỏ admin token theo mặc định. Thực tế bạn đang hoạt động như một user bình thường cho đến khi bạn chủ động nâng quyền.
- Service có phân quyền bị khóa chặt — một số service (antivirus, EDR agent, Windows Defender) chặn tường minh việc start/stop đối với tất cả mọi người, ngoại trừ SYSTEM hoặc một tài khoản service cụ thể.
Chín phần mười là do nguyên nhân đầu tiên. Bạn đã mở CMD từ Start menu hoặc shortcut trên desktop mà không click chuột phải.
Cách sửa nhanh: Elevated CMD
Xử lý được 90% trường hợp. Mất khoảng 10 giây.
Cách 1 — Nâng quyền bằng chuột phải
- Nhấn
Win, gõcmd - Chuột phải vào Command Prompt → Run as administrator
- Chấp nhận UAC prompt
- Thử lại lệnh:
net stop MyService
net start MyService
Thanh tiêu đề sẽ hiển thị "Administrator: Command Prompt" — đó là xác nhận bạn đã được nâng quyền.
Cách 2 — PowerShell một dòng (không cần giao diện đồ họa)
Đang kẹt trong terminal chưa được nâng quyền? Khởi chạy một CMD đã nâng quyền từ đó:
Start-Process cmd -Verb RunAs -ArgumentList '/k sc stop MyService'
Để dừng và khởi động lại trong một lần:
Start-Process cmd -Verb RunAs -ArgumentList '/k net stop MyService && net start MyService'
Cách 3 — Dùng cmdlet PowerShell gốc
Stop-Service -Name "MyService" -Force
Start-Service -Name "MyService"
Stop-Service và Start-Service đều gọi vào SCM bên dưới. Ưu điểm: thông báo lỗi dễ đọc thay vì các exit code khó hiểu.
Xác nhận đã sửa thành công
sc query MyService
Tìm dòng STATE : 4 RUNNING trong kết quả. Thích dùng PowerShell hơn? Chạy lệnh này:
Get-Service -Name "MyService" | Select-Object Name, Status
Kết quả mong đợi:
Name Status
---- ------
MyService Running
Vẫn bị Error 5 dù đã chạy với quyền Administrator?
Kiểm tra lại thanh tiêu đề có ghi "Administrator: Command Prompt" không. Nếu có mà vẫn bị error 5, bản thân service đang có security descriptor hạn chế — admin token của bạn vẫn chưa đủ.
Kiểm tra quyền hiện tại của service
sc sdshow MyService
Bạn sẽ nhận được một chuỗi SDDL thô như D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA).... Cần tìm hai thứ: RP (quyền start) và WP (quyền stop). Nếu cả hai không xuất hiện cạnh BA (Built-in Administrators), đó chính là vấn đề.
Cấp quyền toàn quyền cho Administrators trên service
Dùng sc sdset để ghi đè descriptor. Đây là SDDL full-control chuẩn cho Administrators — an toàn với hầu hết các service không quan trọng:
sc sdset MyService "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)"
Ý nghĩa các token quan trọng:
BA— Built-in AdministratorsCCDCLCSWRPWPDTLOCRSDRCWDWO— Toàn quyền: start, stop, pause, cấu hình, xóaSY— Tài khoản Local SystemIU/SU— Người dùng Interactive và Service (chỉ đọc)
Thử lại net stop MyService sau khi chạy lệnh này. Lần này sẽ thành công.
Sửa triệt để: Đừng để mắc lỗi này lặp lại
Nếu deployment script hoặc automation của bạn cứ liên tục gặp lỗi này, giải pháp thực sự là tích hợp sẵn việc nâng quyền vào script — thay vì cứ phải nhớ click chuột phải mỗi lần.
Với scheduled task
Mở Task Scheduler, tìm task, rồi:
- Chuột phải → Properties
- Tích chọn Run with highest privileges
- Trong mục "Security options", xác nhận tài khoản là Administrator
Với deployment script (file batch)
Thêm đoạn tự nâng quyền này vào đầu file .bat. Script sẽ tự khởi chạy lại với quyền admin nếu phát hiện chưa được nâng quyền:
@echo off
net session >nul 2>&1
if %errorlevel% neq 0 (
echo Requesting admin privileges...
powershell -Command "Start-Process '%~f0' -Verb RunAs"
exit /b
)
net stop MyService
net start MyService
Với PowerShell script
#Requires -RunAsAdministrator
Restart-Service -Name "MyService" -Force
Write-Host "Service restarted successfully."
Chỉ thị #Requires -RunAsAdministrator ít được dùng và ít được biết đến. PowerShell sẽ từ chối chạy script hoàn toàn nếu chưa được nâng quyền — bạn nhận được thông báo rõ ràng "phải chạy với quyền Administrator" ngay từ đầu, thay vì bị báo lỗi access denied lúc đang chạy giữa chừng.
Service từ xa: Câu chuyện khác
Quản lý service trên máy khác qua sc \\servername mà vẫn bị error 5? Nâng quyền trên máy local không đủ trong trường hợp này.
sc \\remoteserver query MyService
[SC] OpenSCManager FAILED 5:
Access is denied.
Ba cách khắc phục quyền truy cập từ xa:
- Thêm tài khoản domain của bạn vào nhóm local Administrators trên máy từ xa (đáng tin cậy nhất)
- Dùng
runas /user:remoteserver\Administrator sc \\remoteserver stop MyServiceđể cung cấp thông tin đăng nhập rõ ràng - Dùng PowerShell remoting để xử lý credential gọn hơn:
Invoke-Command -ComputerName remoteserver -ScriptBlock { Restart-Service MyService } -Credential (Get-Credential)
Tóm tắt
- 90% trường hợp: mở lại CMD với quyền Administrator, thử lại lệnh
- Xác nhận bằng
sc query MyService→ tìm dòngSTATE : 4 RUNNING - Vẫn lỗi dù đã nâng quyền: sửa DACL của service bằng
sc sdset - Automation: thêm tự động nâng quyền vào file batch hoặc
#Requires -RunAsAdministratorvào PowerShell script - Máy từ xa: tài khoản của bạn phải thuộc nhóm local Admins trên máy đích, không chỉ máy của bạn

