即使进程用户不是管理员,使用checkTokenMemberShip也始终返回true

时间:2009-06-14 11:25:41

标签: c++

以下是我正在使用的代码(从msdn复制),但即使pocess用户不是本地管理员,它也会返回,好像是任何想法一样?

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 个答案:

答案 0 :(得分:2)

在MSDN文档中here ...在VISTA(或更高版本)上使用此功能时,会有一个提示。

换句话说,如果你在Vista上使用它 - API将返回true - 因为Vista使用拆分令牌来保证安全。

以下是原始备注(最初由tchao撰写):

  

在Windows中启用UAC时   Vista - 这是默认设置,a   管理员帐户中的线程   将有一对拆分令牌:a   过滤后的令牌和提升的令牌。   过滤后的令牌将具有本地   管理员将其组中的SID分组,   但是直到那个SID才会启用   线程获取提升后的令牌   用户通过UAC对话框的批准或   编程。以上样本   代码显示两者都已过滤   管理员令牌和提升   管理员令牌有   本地管理员组SID   “启用”,但事实并非如此   使用筛选的管理员令牌   它的TOKEN_ELEVATION_TYPE为   TokenElevationTypeLimited。

     

如果你看当地人   管理员组关联   管理员过滤了令牌,它是   只是否认,但是   CheckTokenMembership()将显示   管理员过滤的令牌是一个   本地的成员(已启用?)   管理员组。也许这就是   还有一个函数实现错误?!

答案 1 :(得分:0)

更新Gabriel's answer,Microsoft工程师就该主题撰写了一篇文章:

http://msdn.microsoft.com/en-us/windows/ff420334.aspx