程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 淺談系統的定時關機

淺談系統的定時關機

編輯:關於VC++

在寫這個程序之前,我曾看到過別人用SDK寫的關機程序。不過他的程序只在WIN9X下有效,在2000中就不行了,不能關機只能注銷。因為2000屬於多用戶操作系統,要想關機就要獲得權限。在查閱了MSDN後整理出了這個關機程序。 TOKEN_PRIVILEGES tkp;
  HANDLE hToken;

    if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  {
    MessageBox("OpenProcessToken failed!");
  }
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);   //獲得本地機唯一的標識
  tkp.PrivilegeCount = 1; 
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);   //調整獲得的權限

  if (GetLastError() != ERROR_SUCCESS)
  {
      MessageBox("AdjustTokenPrivileges enable failed!");
  }
    fResult =InitiateSystemShutdown(
       NULL,         // 要關的計算機用戶名,可在局域網網中關掉對方的機器,NULL表示關本機
       "由於系統不穩定,WINDOWS將在上面的時間內關機,請做好保存工作!", // 顯示的消息
       10,                // 關機所需的時間
       TRUE,
       TRUE);   //設為TRUE為重起,設為FALSE為關機
    if(!fResult)
    {
       MessageBox("InitiateSystemShutdown failed.");
  }
    tkp.Privileges[0].Attributes = 0;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
    if (GetLastError() != ERROR_SUCCESS)
  {
       MessageBox("AdjustTokenPrivileges disable failed.");
  }
    ExitWindowsEx(EWX_SHUTDOWN,0);   //開始關機
   
圖一是程序運行畫面:

圖一

具體實現細節請查閱源代碼。WIN2000 + VC++6.0下通過編譯。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved