Authz API を使用したアクセスの確認
アプリケーションは、 AuthzAccessCheck 関数を呼び出して、セキュリティ保護可能なオブジェクトへのアクセスを許可するかどうかを決定します。
AuthzAccessCheck 関数は、AUTHZ_ACCESS_REQUESTとSECURITY_DESCRIPTORの両方の構造体をパラメーターとして受け取ります。 AUTHZ_ACCESS_REQUEST構造体は、要求されるアクセス レベルを指定します。 AuthzAccessCheck 関数は、指定したクライアント コンテキストの指定したSECURITY_DESCRIPTORに対して要求されたアクセスを評価します。 セキュリティ記述子がオブジェクトへのアクセスを制御する方法については、「 オブジェクトへのアクセスを DACLs が制御する方法」を参照してください。
論理演算子と共に使用する場合、属性変数は式の形式である必要があります。それ以外の場合は、不明として評価されます。
コールバック関数
チェックするオブジェクトのSECURITY_DESCRIPTORの随意アクセス制御リスト (DACL) にコールバック アクセス制御エントリ (ACE) が含まれている場合、AuthzAccessCheck は DACL に含まれるコールバック ACE ごとに AuthzAccessCheckCallback 関数を呼び出します。 コールバック ACE は、ACE 型に "callback" という単語が含まれる任意の ACE 構造体です。 AuthzAccessCheckCallback 関数は、リソース マネージャーが AuthzInitializeResourceManager 関数を呼び出して初期化されるときに登録する必要があるアプリケーション定義関数です。
コールバック関数を使用すると、アプリケーションは実行時に評価されるビジネス ロジックを定義できます。 AuthzAccessCheckCallback 関数が呼び出されると、呼び出しの原因となったコールバック ACE が、評価のためにコールバック関数に渡されます。 アプリケーション定義ロジックが TRUE と評価された場合、コールバック ACE はアクセス チェックに含まれます。 それ以外の場合は無視されます。
アクセス結果のキャッシュ
アクセス チェックの結果をキャッシュし、AuthzCachedAccessCheck 関数の今後の呼び出しで使用できます。 アクセス チェックのキャッシュの詳細 (例を含む) については、「 アクセス チェックのキャッシュ」を参照してください。
例
次の例 では、組 み込みの管理者READ_CONTROLアクセスできる SECURITY_DESCRIPTOR を作成します。 このセキュリティ記述子を使用して、「クライアント コンテキストの初期化」の例で作成したクライアント コンテキストで指定されたクライアントのアクセスをチェックします。
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;
}
関連トピック