windows提權操作以及系統開機關機重啟代碼(用到了LookupPrivilegeValue和AdjustTokenPrivileges調整進程的Token權限)


對於UAC提權操作,一般在編譯期間,如果程序有需求要提權,會在編譯器里設置,vs2010比較簡單,在工程屬性里可以直接設置,vs2005稍微有點兒麻煩,參考這篇文章:

http://www.seanyxie.com/vs2005%E4%B8%8B%E7%A8%8B%E5%BA%8Fuac%E6%8F%90%E6%9D%83/

 

這里給出一段示例代碼,用來提權操作,實現windows的開機,關機,重啟等操作。

 

 

#include <Windows.h> #include <tchar.h> /* 系統特權提升 @lpName: SE_SHUTDOWN_NAME 關機,重啟權限 */ BOOL PrivilegePromote(LPCTSTR lpName) { HANDLE hToken = NULL; TOKEN_PRIVILEGES tkp = {0}; // 打開進程令牌  if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)) { return FALSE; } // 查找系統權限的特權值  if (!LookupPrivilegeValue(NULL,lpName,&tkp.Privileges[0].Luid)) { CloseHandle(hToken); return TRUE; } // 調整令牌特權  if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL)) { CloseHandle(hToken); return FALSE; } return TRUE; } /* 系統啟動控制:注銷,重啟,關機 @dwFlags:EWX_LOGOFF | EWX_REBOOT | EWX_SHUTDOWN @bForce:是否強制 */ BOOL StartUpContrl(DWORD dwFlags,BOOL bForce) { // 參數校驗  if (dwFlags != EWX_LOGOFF && dwFlags != EWX_REBOOT && dwFlags != EWX_SHUTDOWN) { return FALSE; } // 獲取系統版本,ExitWindowsEx 在NT平台上需要提升權限  OSVERSIONINFO osvi = {0}; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // 版本信息獲取  if ( !GetVersionEx(&osvi)) { return FALSE; } // 是NT系統 需要進行權限提升  if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { PrivilegePromote(SE_SHUTDOWN_NAME); } dwFlags |= (bForce != FALSE)? EWX_FORCE : EWX_FORCEIFHUNG; return ExitWindowsEx(dwFlags, 0); } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd ) { if (_tcscmp(lpCmdLine,_T("/r")) == 0){ StartUpContrl(EWX_REBOOT,TRUE); } else if (_tcscmp(lpCmdLine,_T("/s")) == 0){ StartUpContrl(EWX_SHUTDOWN,TRUE); } else if (_tcscmp(lpCmdLine,_T("/l")) == 0){ StartUpContrl(EWX_LOGOFF,TRUE); } return 0; }
BOOL ExitWindowsEx(
UINT uFlags, // 關閉參數
DWORD dwReserved // 系統保留,一般取0

);

 

 

參數介紹:

uFlags

指定關閉的類型。此參數必須有下列值的組合:
EWX_FORCE
強制終止進程。當此標志設置,Windows不會發送消息WM_QUERYENDSESSION和WM_ENDSESSION的消息給目前在系統中運行的程序。這可能會導致應用程序丟失數據。因此,你應該只在緊急情況下使用此標志。
EWX_LOGOFF
關閉所有進程,然后注銷用戶。
EWX_POWEROFF
關閉系統並關閉電源。該系統必須支持斷電。
Windows要求:
Windows NT中調用進程必須有 SE_SHUTDOWN_NAME 特權。
Windows 9X中:可以直接調用。
EWX_REBOOT
關閉系統,然后重新啟動系統。
Windows要求:
Windows NT中:調用進程必須有SE_SHUTDOWN_NAME特權。
Windows 9X中:可以直接調用。
EWX_SHUTDOWN
關閉系統,安全地關閉電源。所有文件緩沖區已經刷新到磁盤上,所有正在運行的進程已經停止。
Windows要求:
Windows NT中:調用進程必須有SE_SHUTDOWN_NAME特權。
Windows 9X中:可以直接調用。

dwReserved

系統保留,這參數被忽略。一般取0。
返回值
如果函數成功,返回值為非零。
如果函數失敗,返回值是零。想獲得更多 錯誤信息,請調用 GetLastError函數。

 

 

 

ExitWindowsEx函數返回后,啟動了關閉。關閉或注銷。
在關機或登錄操作中,應用程序在允許關閉的時間具體數額內回應關機請求。如果時間到期時,Windows會顯示一個對話框,允許用戶強行關閉應用程序:關閉、重試,或取消關機要求。如果存在EWX_FORCE指定值,Windows會關閉應用程序而不顯示該對話框。
Windows NT中:關閉或重新啟動系統,調用進程必須使用 AdjustTokenPrivileges函數使SE_SHUTDOWN_NAME特權。Windows 95中:安全特權,不支持或需要。

 

http://www.seanyxie.com/windows%E6%8F%90%E6%9D%83%E6%93%8D%E4%BD%9C%E4%BB%A5%E5%8F%8A%E7%B3%BB%E7%BB%9F%E5%BC%80%E6%9C%BA%E5%85%B3%E6%9C%BA%E9%87%8D%E5%90%AF%E4%BB%A3%E7%A0%81/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM