// Get the LUID for the shutdown privilege. LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); // Cannot test the return value of AdjustTokenPrivileges. if (GetLastError() != ERROR_SUCCESS) MessageBox (NULL, TEXT("AdjustTokenPrivileges") , TEXT("Error"),MB_ICONERROR); // Shut down the system and force all applications to close. if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_POWEROFF, 0)) MessageBox (NULL, TEXT("ExitWindowsEx") , TEXT("Error"),MB_ICONERROR);
在98/ME下都可以正常关机,在2000和xp下没有试过,应该也行的,别忘了给我加分
我看不太懂
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
MessageBox (NULL, TEXT("OpenProcessToken") ,
TEXT("Error"),MB_ICONERROR);
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
MessageBox (NULL, TEXT("AdjustTokenPrivileges") ,
TEXT("Error"),MB_ICONERROR);
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_POWEROFF, 0))
MessageBox (NULL, TEXT("ExitWindowsEx") ,
TEXT("Error"),MB_ICONERROR);