[阅读: 463] 2004-12-11 02:55:52
經測試發現 , 在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