天天看點

程式設計實作Windows關機、重新開機、登出

#include <windows.h>

//使能關機特權函數

BOOL EnableShutdownPrivilege()

{

    HANDLE hProcess = NULL;

    HANDLE hToken = NULL;

    LUID uID = {0};

    TOKEN_PRIVILEGES stToken_Privileges = {0};

    hProcess = ::GetCurrentProcess();  //擷取目前應用程式程序句柄

    if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken))  //打開目前程序的通路令牌句柄(OpenProcessToken函數調用失敗傳回值為零)

        return FALSE;

    if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID))  //擷取權限名稱為"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函數調用失敗傳回值為零)

    stToken_Privileges.PrivilegeCount = 1;  //欲調整的權限個數

    stToken_Privileges.Privileges[0].Luid = uID;  //權限的LUID

    stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  //權限的屬性,SE_PRIVILEGE_ENABLED為使能該權限

    if(!::AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL))  //調整通路令牌裡的指定權限(AdjustTokenPrivileges函數調用失敗傳回值為零)

    if(::GetLastError() != ERROR_SUCCESS)  //檢視權限是否調整成功

    ::CloseHandle(hToken);

    return TRUE;

}

//關機函數

BOOL Shutdown(BOOL bForce)

    EnableShutdownPrivilege();  //使能關機特權函數

    if(bForce)

        return ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);  //強制關機

    else

        return ::ExitWindowsEx(EWX_SHUTDOWN,0);

//登出函數

BOOL Logoff(BOOL bForce)

        return ::ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0);  //強制登出

        return ::ExitWindowsEx(EWX_LOGOFF,0);

//重新開機函數

BOOL Reboot(BOOL bForce)

        return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);  //強制重新開機

        return ::ExitWindowsEx(EWX_REBOOT,0);

int main()

    Logoff(FALSE);  //登出

    Reboot(FALSE);  //重新開機

    Shutdown(FALSE);  //關機

    Logoff(TRUE);  //強制登出

    Reboot(TRUE);  //強制重新開機

    Shutdown(TRUE);  //強制關機

    return 0;

繼續閱讀