2009-06-14 28 views
3

以下是我正在使用的代碼(從msdn複製),但即使當用戶不是本地管理員,它返回就好像它是任何想法?使用checkTokenMemberShip返回總是正確的,即使進程用戶不是管理員

BOOL IsUserAdmin(VOID) 
/*++ 
Routine Description: This routine returns TRUE if the caller's 
process is a member of the Administrators local group. Caller is NOT 
expected to be impersonating anyone and is expected to be able to 
open its own process and process token. 
Arguments: None. 
Return Value: 
    TRUE - Caller has Administrators local group. 
    FALSE - Caller does not have Administrators local group. -- 
*/ 
{ 
BOOL b; 
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; 
PSID AdministratorsGroup; 
b = AllocateAndInitializeSid(
    &NtAuthority, 
    2, 
    SECURITY_BUILTIN_DOMAIN_RID, 
    DOMAIN_ALIAS_RID_ADMINS, 
    0, 0, 0, 0, 0, 0, 
    &AdministratorsGroup); 
if(b) 
{ 
    if (!CheckTokenMembership(NULL, AdministratorsGroup, &b)) 
    { 
     b = FALSE; 
    } 
    FreeSid(AdministratorsGroup); 
} 

return(b); 
} 

回答

2

在MSDN文檔here ...有一張紙條上使用VISTA(或更高版本),這時候提問題。

爲了解釋,如果您在Vista上使用此API - API將返回true,因爲Vista使用拆分令牌的方式來實現安全性。

以下是原帖(最初由tchao書面):

當UAC在Windows Vista中啓用 - 這是默認設置,在管理員帳戶 線程 都會有一雙拆分令牌: 已過濾的令牌和提升的令牌。 過濾後的標記將具有本地 管理員組的SID其組, 但SID沒有啓用,直到 線後通過UAC對話框或 編程 用戶的認可得到提升的令牌。上述樣品 代碼表明,無論一個過濾 管理員令牌和升高 管理員令牌作爲具有 本地管理員組SID 「啓用」,但不與過濾管理員令牌 ,其具有其TOKEN_ELEVATION_TYPE視情況 TokenElevationTypeLimited。

如果你看看當地 管理員組關聯與 管理員篩選的令牌,它 只有否認,但 CheckTokenMembership()將顯示 管理員過濾令牌是 成員的(啓用?)本地 管理員組。也許這是 也是一個函數實現錯誤?!

+0

+1 ......換句話說,Vista的UAC的,管理員帳戶仍然是管理員的成員但是在沒有UAC提示的情況下,有些(無效)努力阻止流程在該SID下行使權利。 我會做的唯一的其他評論是,具有NULL第一個參數的CheckTokenMembership會檢查當前的_thread模擬_或_thread primary_標記,而不是MSDN示例代碼錯誤暗示的流程標記。 – 2009-07-30 00:23:15

相關問題