如何設定 Process 權限 |
|
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
經測試發現 , 在Win32的環境裡 Login User 的執行權限並不代表Process的執行權限, 許多Win32 API 都需要AdjustTokenPrivileges來調整 Process對系統的控制能力.以關機為例 , User 可以執行關機動作卻無法以程式直接呼叫 ExitWindows or ExitWindowsEx 作關機動作 . RegSaveKey 也是 , 若不將Process 設為 E_BACKUP_NAME 也無法順利將Registry的資料備份或還原。 see "Windows NT Privileges" in MSDN
bool AdjustPrivileges( LPCTSTR lpstrName ) { bool brc = false ; OSVERSIONINFO osv; osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // 要記得設定 bool bc = GetVersionEx (&osv); // 取得OS版本 if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) { TOKEN_PRIVILEGES tp; HANDLE hToken; LUID luid; if (!::OpenProcessToken (::GetCurrentProcess (),TOKEN_ADJUST_PRIVILEGES, &hToken)) { // ShowMessage ("OpenProcessToken: Failure"); return false ; } if(!LookupPrivilegeValue(NULL, lpstrName , &luid)) { // ShowMessage ("LookupPrivilegeValue: Failure"); return false ; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid =luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; ::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),NULL, NULL ); if (::GetLastError() != ERROR_SUCCESS){ // ShowMessage ("AdjustTokenPrivileges: Failure"); return false ; } } return true ; } // // for Win98/98 ok // MyShutdown16( ) { ExitWindows(0,0); } // // for WinNT/2000 // MyShutdown32( ) { if ( AdjustPrivileges( SE_SHUTDOWN_NAME ) ) ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN,0); } MySaveRegistry( ) { if ( AdjustPrivileges( SE_BACKUP_NAME ) ) RegSaveKey( HKEY_CURRENT_USER , "c:\\backup.dat" , NULL ) ; }發表人 - allenchan 於 2004/12/10 20:38:21 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |