Sửa lỗi 'Access is denied' trên Windows khi Chạy Lệnh với Quyền Admin

intermediate🪟 Windows2026-03-18| Windows 10, Windows 11, Windows Server 2019/2022 — CMD, PowerShell, File Explorer

Error Message

Access is denied
#windows#permission#admin#uac

Tóm tắt nhanh

Nhấn chuột phải vào terminal → Run as administrator. Vẫn bị chặn? Hãy lấy quyền sở hữu file hoặc thư mục đích:

takeown /f "C:\path\to\file" /r /d y
icacls "C:\path\to\file" /grant %USERNAME%:F /t

Cách này xử lý được 90% trường hợp. Tiếp tục đọc nếu vẫn chưa được.

Nguyên nhân

Access is denied trên Windows không có nghĩa là mật khẩu của bạn sai. Nó có nghĩa là kiểm tra quyền đã thất bại ở cấp độ hệ điều hành. Có năm nguyên nhân khác nhau dẫn đến lỗi này, và mỗi nguyên nhân cần cách sửa khác nhau:

  • Chưa chạy với quyền nâng cao — terminal của bạn mở mà không có quyền admin dù tài khoản thuộc nhóm Administrator.
  • UAC split-token — Windows chạy tài khoản admin với token bị hạn chế theo mặc định. Một tiến trình cần được nâng quyền rõ ràng mới có toàn bộ quyền admin.
  • Bạn không phải chủ sở hữu file — các file hệ thống, file do người dùng khác tạo, hoặc file thuộc sở hữu của TrustedInstaller sẽ chặn ghi ngay cả với admin.
  • ACL từ chối rõ ràng — một ACE Deny ghi đè lên mọi quy tắc Allow, kể cả tư cách thành viên nhóm admin. Điều này làm nhiều người bị vấp.
  • File đang bị khóa — một tiến trình khác đang giữ khóa độc quyền. Kiểm tra quyền thành công nhưng I/O bị chặn ở tầng hệ thống file.

Cách 1: Chạy CMD hoặc PowerShell với quyền Administrator

Lỗi này xảy ra thường xuyên, kể cả với sysadmin có kinh nghiệm. Thuộc nhóm Administrators không tự động cho bạn quyền nâng cao — shell phải yêu cầu quyền đó một cách rõ ràng.

  • Nhấn Win, gõ cmd hoặc powershell, rồi nhấn chuột phải → Run as administrator.
  • Hoặc từ terminal hiện có: Start-Process powershell -Verb RunAs

Kiểm tra xem việc nâng quyền có thành công không — thanh tiêu đề phải hiển thị Administrator: Command Prompt. Xác nhận bằng lệnh:

whoami /groups | findstr "S-1-16-12288"

Nếu dòng đó xuất hiện, bạn có token đặc quyền cao (elevated). Không có output nghĩa là bạn vẫn đang chạy với quyền bị hạn chế.

Cách 2: Lấy quyền sở hữu File hoặc Thư mục

Các file hệ thống và file từ Windows Update thường thuộc sở hữu của SYSTEM hoặc TrustedInstaller. Admin được nâng quyền vẫn không thể ghi vào chúng nếu chưa lấy quyền sở hữu trước — đây là thiết kế có chủ ý.

Từ CMD được nâng quyền:

takeown /f "C:\path\to\target" /r /d y

Sau đó cấp quyền toàn quyền cho bản thân:

icacls "C:\path\to\target" /grant %USERNAME%:F /t /c

Các tham số: /t = đệ quy, /c = tiếp tục khi có lỗi, F = toàn quyền kiểm soát.

Với một file hệ thống đơn lẻ (ví dụ: thay thế một DLL):

takeown /f "C:\Windows\System32\somefile.dll"
icacls "C:\Windows\System32\somefile.dll" /grant Administrators:F

Xác nhận: Chạy lại lệnh bị lỗi ban đầu. Kiểm tra quyền hiện tại bằng:

icacls "C:\path\to\target"

Cách 3: Xóa ACE Deny rõ ràng bằng PowerShell

Một mục Deny trong ACL sẽ ghi đè tất cả — kể cả quyền admin. Bạn không thể chỉ thêm một quy tắc Allow lên trên nó. Bạn phải xóa mục Deny đó đi.

Đầu tiên, xem những gì thực sự có trong ACL:

$acl = Get-Acl "C:\path\to\target"
$acl.Access | Format-Table IdentityReference, FileSystemRights, AccessControlType

Thấy mục Deny cho tài khoản của bạn hoặc Users? Xóa nó đi:

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
  "BUILTIN\Users", "FullControl", "Deny"
)
$acl.RemoveAccessRule($rule)
Set-Acl "C:\path\to\target" $acl

Thay BUILTIN\UsersFullControl bằng giá trị thực tế hiển thị trong mục deny.

Cách 4: Mở khóa File đang bị tiến trình khác giữ

Quyền đã ổn nhưng vẫn bị chặn? File bị khóa thường là thủ phạm. Một tiến trình khác đang mở file đó với khóa độc quyền, và Windows sẽ không cho bạn động vào cho đến khi tiến trình đó giải phóng nó.

Tìm tiến trình đang khóa bằng Sysinternals handle.exe:

# Với handle.exe của Sysinternals đã có trong PATH:
handle.exe "C:\path\to\file"

Không có Sysinternals? Dùng Resource Monitor: nhấn Win+R → gõ resmon → tab CPU → Associated Handles → tìm tên file.

Đóng hoặc kết thúc tiến trình đang khóa, sau đó thử lại lệnh của bạn.

Cách 5: Registry Key bị từ chối truy cập

Lỗi registry dưới HKLM là vấn đề riêng biệt. Chỉ nâng quyền thôi là chưa đủ — các key được bảo vệ như HKLM\SAM hoặc HKLM\SECURITY yêu cầu bạn phải lấy quyền sở hữu trước, giống như với file.

# Kiểm tra chủ sở hữu hiện tại
$key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey(
  "SOFTWARE\SomeKey", $true
)

# Nếu lệnh đó báo lỗi: lấy quyền sở hữu qua regedit
# Nhấn chuột phải vào key → Permissions → Advanced → Owner → đổi sang tài khoản của bạn

Để ghi nhanh bằng script, bỏ qua PowerShell API và dùng reg add từ terminal được nâng quyền:

reg add "HKLM\SOFTWARE\SomeKey" /v ValueName /t REG_SZ /d "data" /f

Cách 6: Scheduled Tasks và Services

Lỗi Scheduler và Service là câu chuyện khác. Vấn đề thường không phải ở quyền của bạn — mà là tài khoản dịch vụ đang chạy task đó. Nó không có quyền truy cập tài nguyên mà nó đang cố truy cập.

Đổi service để chạy với LocalSystem (quyền truy cập rộng) hoặc gắn với một user cụ thể:

sc.exe config ServiceName obj= "LocalSystem" password= ""

# Hoặc với một tài khoản cụ thể:
sc.exe config ServiceName obj= ".\YourUsername" password= "yourpassword"

Khởi động lại để áp dụng:

net stop ServiceName && net start ServiceName

Danh sách kiểm tra nhanh

  • Terminal có được nâng quyền không? (whoami /groups | findstr S-1-16-12288)
  • Ai là chủ sở hữu file? (icacls "path" — tìm dòng owner)
  • Có ACE Deny rõ ràng không? (tìm (DENY) trong output của icacls)
  • File có đang bị khóa không? (Resource Monitor → Associated Handles)
  • Đây có phải đường dẫn được hệ thống bảo vệ không? (ví dụ: C:\Windows\System32)

Mẹo thêm

Đang làm việc đồng thời trên cả Windows và Linux — WSL, triển khai đa nền tảng, và những thứ tương tự? Unix Permissions Calculator trên ToolCraft giúp bạn tính toán giá trị chmod một cách trực quan trước khi áp dụng. Rất tiện khi bạn cần quyền file Linux phải khớp với những gì đang cấu hình ở phía Windows.

Phòng ngừa

  • Giữ các script cần nâng quyền trong một thư mục riêng kèm README rõ ràng — tránh vòng lặp "sao cái này lại lỗi nữa".
  • Dùng runas /user:Administrator cmd cho các lệnh nâng quyền một lần mà không cần mở cửa sổ mới thủ công.
  • Trong CI/CD pipeline trên Windows, luôn chỉ định tài khoản dịch vụ agent và cấp quyền icacls cho thư mục làm việc trước lần chạy đầu tiên.

Related Error Notes