Làm sao để tắt máy / khởi động lại máy
Trong môi trường Windows, lập trình viên hoàn toàn có thể tắt máy (Shutdown, PowerOff), khởi động lại máy (Restart) hoặc thoát khỏi người dùng hiện hành (LogOff) chỉ thông qua các đoạn code trong chương trình. Bài viết này giới thiệu cách thực hiện ...
Trong môi trường Windows, lập trình viên hoàn toàn có thể tắt máy (Shutdown, PowerOff), khởi động lại máy (Restart) hoặc thoát khỏi người dùng hiện hành (LogOff) chỉ thông qua các đoạn code trong chương trình.
Bài viết này giới thiệu cách thực hiện các chức năng như vậy :
Khai báo
BOOL ExitWindowsEx( UINT uFlags, DWORD dwReason );
Diễn giải
Hàm ExitWindowsEx có 2 tham số :
uFlags : thông báo kiểu “thoát khỏi” Windows muốn thực hiện. uFlags gồm có
các tham số : EWX_LOGOFF, EWX_REBOOT, EWX_POWEROFF,
EWX_SHUTDOWN và hai tham số tùy chọn : EWX_FORCE,
EWX_FORCEIFHUNG. Nhóm tham số đầu tiên (4 tham số) cho phép chọn lựa cách thực thi, trong đó hai tham số EWX_POWEROFF, EWX_SHUTDOWN có cách thực hiện tương đương việc chọn chức năng Shutdown trên HĐH Windows, điểm khác biệt giữa hai tham số này nằm ở chỗ tắt nguồn hay không tắt nguồn (EWX_POWEROFF cho phép tắt nguồn trong khi EWX_SHUTDOWN thì không!). Nhóm tham số thứ hai (2 tham số) cho phép chọn lựa kiểu “ép buộc” thoát khỏi Windows; EWX_FORCE dùng “biện pháp mạnh” đối với các chương trình (có nghĩa là không cần hỏi người sử dụng cần thoát hay không) còn EWX_FORCEIFHUNG thì “nhẹ nhàng hơn” (chờ đợi sự đồng ý của người dùng).
dwReason : không áp dụng trên các hệ điều hành Windows 2000, Windows NT, Windows Me/98/95.
Lưu ý
Trong cài đặt, cần lưu ý trường hợp phải khởi động máy lại (Restart / Reboot) hoặc tắt máy hẳn (PowerOff / Shutdown). Cả hai trường hợp này cần phải thiết lập quyền thực thi. (Vì lý do an toàn, một số quyền trên hệ điều hành sẽ không được thực thi công việc đó). Chính vì vậy, cần phải sử dụng hàm AdjustTokenPriveleges để điều chỉnh quyền SE_SHUTDOWN_NAME.
Một ví dụ cho trường hợp tắt máy (Shutdown)
BOOL MySystemShutdown() { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return( FALSE ); // Lấy giá trị LUID của quyền tắt máy LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Lấy quyền tắt máy cho tiến trình hiện tại AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) return FALSE; // Tắt máy và ép buộc tất cả các ứng dụng phải bị đóng //Điều chỉnh các quyền khác ở chổ này if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) return FALSE; return TRUE; }
Có thể tham khảo thêm chi tiết các hàm có liên quan trong MSDN.