對於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,