Kỹ thuật khởi chạy ứng dụng WPF dưới quyền tài khoản System bằng PsExec

Vấn đề về quyền truy cập trong ứng dụng Desktop

Trong quá trình phát triển các ứng dụng dành cho máy khách (desktop), đặc biệt là các công cụ quản trị hệ thống, nhu cầu chạy ứng dụng với quyền cao nhất là khá phổ biến. Phương pháp truyền thống thường sử dụng Windows Service để chạy nền. Tuy nhiên, phương pháp này tồn tại một hạn chế lớn: các phiên bản Windows hiện đại (phiên bản 6.0 trở đi) ngăn chặn Service tương tác với màn hình desktop (Session 0 isolation). Điều này dẫn đến việc các ứng dụng có giao diện người dùng (GUI) như WPF hoặc WinForms không thể hiển thị được nếu được triệu gọi trực tiếp từ Service. Để giải quyết vấn đề này, chúng ta có thể sử dụng công cụ PsExec để khởi chạy trực tiếp tiến trình dưới tài khoản System nhưng vẫn hiển thị được giao diện.

Giới thiệu công cụ PsExec

PsExec là một công cụ dòng lệnh mạnh mẽ thuộc bộ công cụ PsTools do Microsoft Sysinternals phát triển. Nó hoạt động như một sự thay thế nhẹ nhàng cho Telnet, cho phép các quản trị viên thực thi các tiến trình trên hệ thống cục bộ hoặc từ xa mà không cần cài đặt thủ công bất kỳ phần mềm khách (client software) nào lên máy đích. Công cụ này đặc biệt hữu ích để khởi chạy các chương trình trong ngữ cảnh bảo mật của tài khoản System hoặc để truy xuất thông tin từ xa.

Các tham số lệnh quan trọng

Cú pháp chung của PsExec bao gồm nhiều tùy chọn, nhưng để khởi chạy ứng dụng WPF với quyền System và có tương tác giao diện, chúng ta tập trung vào các cờ sau:

  • -s: Chạy tiến trình dưới quyền tài khoản System (Local System account).
  • -i: Chạy tiến trình để nó có thể tương tác với màn hình desktop của người dùng. Bắt buộc đối với ứng dụng có GUI.
  • -d: Không chờ tiến trình kết thúc (non-interactive mode với Console), trả lại quyền điều khiển ngay lập tức cho dòng lệnh.
  • -accepteula: Tự động chấp nhận thỏa thuận cấp phép để tránh hiện tượng tạm dừng hiển thị cửa sổ EULA.

Quy trình thực hiện

1. Chuẩn bị môi trường:

Tải bộ công cụ PsTools từ trang chính thức của Microsoft. Sau khi giải nén, sao chép file PsExec.exe vào thư mục hệ thống (ví dụ: C:\Windows\System32) hoặc thêm thư mục chứa file vào biến môi trường PATH để có thể gọi lệnh từ bất kỳ đâu.

2. Xây dựng ứng dụng mẫu:

Giả sử chúng ta đã có một dự án WPF và đã thực hiện build (Release hoặc Debug). File thực thi nằm tại đường dẫn:

D:\Projects\WpfSystemTool\bin\Release\net8.0-windows\WpfSystemTool.exe

3. Thực thi lệnh khởi chạy:

Mở Command Prompt (cmd) hoặc PowerShell với quyền Run as Administrator. Sử dụng lệnh sau để khởi động ứng dụng:

psexec -i -d -s "D:\Projects\WpfSystemTool\bin\Release\net8.0-windows\WpfSystemTool.exe"

4. Xác minh kết quả:

Sau khi thực thi lệnh, ứng dụng WPF sẽ xuất hiện trên màn hình. Để kiểm tra xem ứng dụng có thực sự chạy dưới quyền System hay không, hãy mở Task Manager (Quản lý tác vụ), chuyển đến tab Details (Chi tiết), tìm đến tiến trình WpfSystemTool.exe và quan sát cột User Name. Giá trị hiển thị ở đây phải là SYSTEM.

Đăng vào ngày 8 tháng 7 lúc 16:21