中国开发网: 论坛: 程序员情感CBD: 贴子 61760
pcplayer: 如何設定 Process 權限
經測試發現 , 在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

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录