應用程式會呼叫 AuthzAccessCheck 函式,判斷是否要授與安全性實體物件的存取權。
AuthzAccessCheck 函式會採用 AUTHZ_ACCESS_REQUEST 和 SECURITY_DESCRIPTOR 結構作為參數。 AUTHZ_ACCESS_REQUEST 結構會指定要求的存取層級。 AuthzAccessCheck 函式會針對特定客戶端上下文,以指定的 SECURITY_DESCRIPTOR 評估所要求的存取權。 如需安全性描述元如何控制物件存取的資訊,請參閱 DACLs 如何控制物件存取。
當搭配邏輯運算子使用時,屬性變數的格式必須是表達式;否則,它們會評估為未知。
回呼函式
如果要檢查的物件之 SECURITY_DESCRIPTOR 中的 自訂訪問控制清單 (DACL)包含任何回呼 訪問控制項 (ACE),那麼 AuthzAccessCheck 會針對 DACL 中包含的每個回呼 ACE 調用 AuthzAccessCheckCallback 函式。 回呼 ACE 是任何 ACE 結構,其 ACE 類型包含 「callback」 一詞。AuthzAccessCheckCallback 函式是應用程式定義的函式,呼叫 AuthzInitializeResourceManager 函式來初始化資源管理員時,必須註冊此函式。
回呼函式可讓應用程式定義要在運行時間評估的商業規則。 呼叫 AuthzAccessCheckCallback 函式時,導致呼叫的回呼 ACE 會傳遞至回呼函式進行評估。 如果應用程式定義的邏輯評估為 TRUE,則回呼 ACE 會包含在存取檢查中。 否則會被忽略。
快取存取結果
存取檢查的結果可以快取,並在日後呼叫 AuthzCachedAccessCheck 函式時使用。 如需快取存取檢查的詳細資訊,包括範例,請參閱 快取存取檢查。
例
下列範例會建立 SECURITY_DESCRIPTOR,允許 READ_CONTROL 內建系統管理員的存取權。 它會使用該安全性描述元來檢查在範例中 初始化用戶端內容時所建立的用戶端上下文所指定的客戶端的存取權限。
BOOL CheckAccess(AUTHZ_CLIENT_CONTEXT_HANDLE hClientContext)
{
#define MY_MAX 4096
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
ULONG cbSecurityDescriptorSize = 0;
AUTHZ_ACCESS_REQUEST Request;
CHAR ReplyBuffer[MY_MAX];
PAUTHZ_ACCESS_REPLY pReply = (PAUTHZ_ACCESS_REPLY)ReplyBuffer;
DWORD AuthzError =0;
//Allocate memory for the access request structure.
RtlZeroMemory(&Request, sizeof(AUTHZ_ACCESS_REQUEST));
//Set up the access request structure.
Request.DesiredAccess = READ_CONTROL;
//Allocate memory for the access reply structure.
RtlZeroMemory(ReplyBuffer, MY_MAX);
//Set up the access reply structure.
pReply->ResultListLength = 1;
pReply->Error = (PDWORD) ((PCHAR) pReply + sizeof(AUTHZ_ACCESS_REPLY));
pReply->GrantedAccessMask = (PACCESS_MASK) (pReply->Error + pReply->ResultListLength);
pReply->SaclEvaluationResults = NULL;
//Create security descriptor.
if(!ConvertStringSecurityDescriptorToSecurityDescriptor(
L"O:LAG:BAD:(A;;RC;;;BA)",
SDDL_REVISION_1,
&pSecurityDescriptor,
NULL))
{
printf_s("ConvertStringSecurityDescriptorToSecurityDescriptor failed with %d\n", GetLastError());
return FALSE;
}
//Call AuthzAccessCheck.
if(!AuthzAccessCheck(
0,
hClientContext,
&Request,
NULL,
pSecurityDescriptor,
NULL,
0,
pReply,
NULL))
{
printf_s("AuthzAccessCheck failed with %d\n", GetLastError());
LocalFree(pSecurityDescriptor);
return FALSE;
}
//Print results.
if(*pReply->GrantedAccessMask & READ_CONTROL)
{
printf_s("Access granted.\n");
}
else
{
printf_s("Access denied.\n");
}
LocalFree(pSecurityDescriptor);
return TRUE;
}
相關主題