Làm th nào đ t t máy/kh i đ ng máy ?
V n Chí Nam
Khoa Công ngh Thông tin, H KHTN TP.HCM
(vcnam@fit.hcmuns.edu.vn )
Phiên b n c p nh t ngày 18/04/2005
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 :
HÀM EXITWINDOWSEX
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
Trang 2Làm th nào đ t t máy/kh i đ ng máy ?
CÀI T
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