初始化客户端上下文
应用程序必须先创建客户端上下文,然后才能使用 Authz API 执行访问检查或审核。
应用程序必须调用 AuthzInitializeResourceManager 函数来初始化资源管理器。 然后,应用程序可以调用多个函数之一来创建客户端上下文。 此外,如果要远程执行访问检查或审核,则必须使用 AuthzInitializeRemoteResourceManager 函数。
若要基于现有客户端上下文创建客户端上下文,请调用 AuthzInitializeContextFromAuthzContext 函数。
AuthzInitializeContextFromToken 函数使用登录令牌中的信息创建新的客户端上下文。 AuthzInitializeContextFromSid 函数使用指定的 SID 创建新的客户端上下文。
如果可能,请调用 AuthzInitializeContextFromToken 函数,而不是 AuthzInitializeContextFromSid。 AuthzInitializeContextFromSid 尝试检索客户端实际登录后登录令牌中可用的信息。 实际的登录令牌提供更多信息,例如登录类型和登录属性,并反映用于登录的身份验证包的行为。 AuthzInitializeContextFromToken 创建的客户端上下文使用登录令牌,生成的客户端上下文比 AuthzInitializeContextFromSid 创建的客户端上下文更完整、更准确。
注意
如果在条件表达式中引用,则必须在客户端上下文中存在安全属性变量;否则,引用它们的条件表达式术语将计算为未知。 有关条件表达式的详细信息,请参阅 条件 ACE 的安全描述符定义语言 主题。
示例
以下示例初始化 Authz 资源管理器并调用 AuthzInitializeContextFromToken 函数,以从与当前进程关联的登录令牌创建客户端上下文。
BOOL AuthzInitFromToken(AUTHZ_CLIENT_CONTEXT_HANDLE *phClientContext)
{
HANDLE hToken = NULL;
LUID Luid = {0, 0};
ULONG uFlags = 0;
//Initialize Resource Manager
if(!AuthzInitializeResourceManager(
AUTHZ_RM_FLAG_NO_AUDIT,
NULL,
NULL,
NULL,
L"My Resource Manager",
&g_hResourceManager
))
{
printf_s("AuthzInitializeResourceManager failed with %d\n", GetLastError);
return FALSE;
}
//Get the current token.
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
{
printf_s("OpenProcessToken failed with %d\n", GetLastError);
return FALSE;
}
//Initialize the client context
if(!AuthzInitializeContextFromToken(
0,
hToken,
g_hResourceManager,
NULL,
Luid,
NULL,
phClientContext
))
{
printf_s("AuthzInitializeContextFromToken failed with %d\n", GetLastError);
return FALSE;
}
printf_s("Initialized client context. \n");
return TRUE;
}
相关主题