一個小筆記(1):設定重啟電腦、自動啟動

來源:互聯網
上載者:User

標籤:

【設定重啟電腦】

使用API函數ExitWindowsEx 
BOOL WINAPI ExitWindowsEx(
  _In_ UINT  uFlags,
  _In_ DWORD dwReason
);
 【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winuser%2FExitWindowsEx);k(ExitWindowsEx);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
如果方法執行成功,返回非零值
其實MSDN裡有例子,MSDN的例子大多都是一個很寶貴的資源~
直接Copy一個過來,改一下地方就行了:
  
#include <windows.h>
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "advapi32.lib")
BOOL MySystemShutdown()
{
   HANDLE hToken; 
   TOKEN_PRIVILEGES tkp; 
 
   // Get a token for this process. 
 
   if (!OpenProcessToken(GetCurrentProcess(), 
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
      return( FALSE ); 
 
   // 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); 
 
   if (GetLastError() != ERROR_SUCCESS) 
      return FALSE; 
 
   // Shut down the system and force all applications to close. 
 
   if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 
               SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
               SHTDN_REASON_MINOR_UPGRADE |
               SHTDN_REASON_FLAG_PLANNED)) 
      return FALSE; 
   //Reboot was successful
   return TRUE;
}
 
在使用ExitWindosEx之前,要使用其他一些函數,為什嗎?
ExitWindowsEx函數屬於“高危”動作,系統會“需要確認”我們的程式是否真的要這樣子做。
所以我們在讓系統知道“我們的確要用這個函數來做高危動作”
在系統裡,這叫許可權,我們要給自己的程式“提權”,所以就會有上面的一堆代碼了。
OpenProcessToken:開啟當前進程Token
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winbase%2FOpenProcessToken);k(OpenProcessToken);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
LookupPrivilegeValue:使程式擁有相應的許可權(跟系統說:我要某個許可權)
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winbase%2FLookupPrivilegeValue);k(LookupPrivilegeValue);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
AdjustTokenPrivileges:應用許可權(跟系統說:我確定要使用這個許可權)
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winbase%2FAdjustTokenPrivileges);k(AdjustTokenPrivileges);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true

 

【自動啟動】

註冊表中有6個地方可以寫入開機啟動資訊,
其中一個位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
步驟:
第一步,開啟註冊表,使用API函數RegOpenKeyEx 
LONG WINAPI RegOpenKeyEx(
  _In_     HKEY    hKey,
  _In_opt_ LPCTSTR lpSubKey,
  _In_     DWORD   ulOptions,
  _In_     REGSAM  samDesired,
  _Out_    PHKEY   phkResult
);
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winreg%2FRegOpenKeyEx);k(RegOpenKeyEx);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
如果方法執行成功,傳回值為:ERROR_SUCCESS
 
HKEY hKey = { 0 };
// 開啟註冊表
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", 0, KEY_WRITE, &hKey);
 
第二步,寫入註冊表,使用API函數RegSetValueEx
LONG WINAPI RegSetValueEx(
  _In_             HKEY    hKey,
  _In_opt_         LPCTSTR lpValueName,
  _Reserved_       DWORD   Reserved,
  _In_             DWORD   dwType,
  _In_       const BYTE    *lpData,
  _In_             DWORD   cbData
);
 
 【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winreg%2FRegSetValueEx);k(RegSetValueEx);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
如果方法執行成功,傳回值為:ERROR_SUCCESS
 
char szPath[MAXBYTE] = { 0 };
GetModuleFileNameA(nullptr, szPath, MAXBYTE);
// 寫入資訊
RegSetValueEx(hKey, L"ReBootDemo", 0, REG_SZ, (byte*)szPath, strlen(szPath));
 
 
然後就可以啦!大功告成。

一個小筆記(1):設定重啟電腦、自動啟動

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.