共用方式為


使用 Authz API 檢查存取

應用程式會呼叫 AuthzAccessCheck 函式,判斷是否要授與安全性實體物件的存取權。

AuthzAccessCheck函式會採用AUTHZ_ACCESS_REQUESTSECURITY_DESCRIPTOR結構作為參數。 AUTHZ_ACCESS_REQUEST結構會指定要求的存取層級。 AuthzAccessCheck函式會針對指定用戶端內容的指定SECURITY_DESCRIPTOR評估要求的存取權。 如需安全性描述元如何控制物件存取的資訊,請參閱 DACLs 如何控制物件的存取權。

當搭配邏輯運算子使用時,屬性變數的格式必須是運算式;否則,系統會將其評估為未知。

回呼函式

如果要檢查之物件的SECURITY_DESCRIPTOR (DACL) 任意存取控制清單,則AuthzAccessCheck會針對 DACL 中包含的每個回呼 ACE 呼叫AuthzAccessCheckCallback 函式 () AuthzAccessCheckCallback函式。 回呼 ACE 是 ACE 類型包含 「callback」 一詞的任何 ACE 結構。 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;

}

將 SID 新增至用戶端內容

快取存取檢查

初始化用戶端內容

查詢用戶端內容