تو ويندوز با تابع ExitWindowsEx API ميشه کامپيوتر رو خاموش/ ريبوت/لاگ آف/و... کرد اما در ويندوز هایNT به صورت معمول نميشه از اين تابع استفاده کرد و برنامه بايد حق استفاده و دسترسی به اين تابع رو کسب کنه.
برای کسب امتياز:
bool Adjustprivilege()
{
bool ret;
HANDLE hToken;
LUID mLUID;
TOKEN_PRIVILEGES privs;
HANDLE hProc = GetCurrentProcess();
ret = OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
if(ret == false)
{
printf("error: OpenProcessToken, %d\n", GetLastError());
return false;
}
ret = LookupPrivilegeValueA(NULL, "SeShutdownPrivilege", &mLUID);
if(ret == false)
{
printf("error: LookupPrivilegeValueA, %d\n", GetLastError());
return false;
}
privs.PrivilegeCount = 1;
privs.Privileges[0].Luid = mLUID;
privs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
ret = AdjustTokenPrivileges (hToken, FALSE, &privs, 0, NULL, NULL);
if(ret == false)
{
printf("error: AdjustTokenPrivileges, %d\n", GetLastError());
return false;
}
return ret;
}
طرز استفاده:
int main()
{ /*
EWX_SHUTDOWN | EWX_FORCE Force ShutDown
EWX_SHUTDOWN ShutDown
EWX_LOGOFF LogOff
EWX_REBOOT Restart
more... http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
*/
bool ret = Adjustprivilege();
if(ret)
{
ExitWindowsEx(EWX_SHUTDOWN, TRUE);
}
return 0;
}
توجه کنيد فلگ EWX_FORCE برای اعمال فوری ديگر فلگ ها استفاده ميشه و بايد همراه ديگر فلگ ها استفاده بشه.