checkTokenMembership 函数 (securitybaseapi.h)
CheckTokenMembership 函数确定是否在访问令牌中启用指定的安全标识符 (SID) 。 如果要确定应用容器令牌的组成员身份,则需要使用 CheckTokenMembershipEx 函数。
语法
BOOL CheckTokenMembership(
[in, optional] HANDLE TokenHandle,
[in] PSID SidToCheck,
[out] PBOOL IsMember
);
parameters
[in, optional] TokenHandle
访问令牌的句柄。 句柄必须具有对令牌TOKEN_QUERY访问权限。 令牌必须是 模拟令牌。
如果 TokenHandle 为 NULL, 则 CheckTokenMembership 使用调用线程的模拟令牌。 如果线程未模拟,该函数将复制线程 的主令牌 以创建 模拟令牌。
[in] SidToCheck
指向 SID 结构的指针。 CheckTokenMembership 函数检查访问令牌的用户和组 SID 中是否存在此 SID。
[out] IsMember
指向接收检查结果的变量的指针。 如果 SID 存在并且具有 SE_GROUP_ENABLED 属性, 则 IsMember 返回 TRUE;否则返回 FALSE。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
CheckTokenMembership 函数简化了确定访问令牌中是否同时存在和已启用 SID 的过程。
即使令牌中存在 SID,系统也不得在访问检查中使用 SID。 SID 可能已禁用或具有 SE_GROUP_USE_FOR_DENY_ONLY 属性。 在执行访问检查时,系统仅使用已启用的 SID 授予访问权限。 有关详细信息,请参阅 访问令牌中的 SID 属性。
如果 TokenHandle 是受限令牌,或者 TokenHandle 为 NULL ,并且调用线程的当前有效令牌是受限令牌, 则 CheckTokenMembership 还会检查 SID 是否存在于限制 SID 列表中。
示例
以下示例演示如何检查管理员本地组中的成员身份的令牌。
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);
}
要求
最低受支持的客户端 | Windows XP [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | securitybaseapi.h (包括 Windows.h) |
Library | Advapi32.lib |
DLL | Advapi32.dll |