以下是我正在使用的代码(从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);
}
答案 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工程师就该主题撰写了一篇文章: