在 C++ 中使用授权管理器建立客户端上下文
在授权管理器中,应用程序通过调用表示客户端上下文的 IAzClientContext 对象的 AccessCheck 方法,确定是否向客户端授予对操作的访问权限。
应用程序可以使用令牌句柄、域和用户名或客户端 SID) 的安全标识符 (字符串表示形式来创建客户端上下文。
使用 IAzApplication 接口的 InitializeClientContextFromToken、InitializeClientContextFromName 和 InitializeClientContextFromStringSid 方法创建客户端上下文。
以下示例演示如何从客户端令牌创建 IAzClientContext 对象。 该示例假定驱动器 C 的根目录中有一个名为 MyStore.xml 的现有 XML 策略存储,该存储包含名为 Expense 的应用程序,并且变量 hToken 包含有效的客户端令牌。
#include <windows.h>
void ExpenseCheck(ULONGLONG hToken)
{
IAzAuthorizationStore* pStore = NULL;
IAzApplication* pApp = NULL;
IAzClientContext* pClientContext = NULL;
BSTR storeName = NULL;
BSTR appName = NULL;
HRESULT hr;
void MyHandleError(char *s);
// Create a null VARIANT for function parameters.
VARIANT myVar;
VariantInit(&myVar);
// Initialize COM.
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not initialize COM.");
// Create the AzAuthorizationStore object.
hr = CoCreateInstance(
/*"b2bcff59-a757-4b0b-a1bc-ea69981da69e"*/
__uuidof(AzAuthorizationStore),
NULL,
CLSCTX_ALL,
/*"edbd9ca9-9b82-4f6a-9e8b-98301e450f14"*/
__uuidof(IAzAuthorizationStore),
(void**)&pStore);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not create AzAuthorizationStore object.");
// Allocate a string for the policy store.
if(!(storeName = SysAllocString(L"msxml://c:\\MyStore.xml")))
MyHandleError("Could not allocate string.");
// Initialize the store.
hr = pStore->Initialize(0, storeName, myVar);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not initialize store.");
// Create an application object.
if (!(appName = SysAllocString(L"Expense")))
MyHandleError("Could not allocate application name string.");
hr = pStore->OpenApplication(appName, myVar, &pApp);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not open application.");
// Create a client context from a token handle.
hr = pApp->InitializeClientContextFromToken(hToken, myVar,
&pClientContext);
if (!(SUCCEEDED(hr)))
MyHandleError("Could not create client context.");
// Use the client context as needed.
// Clean up resources.
pStore->Release();
pApp->Release();
pClientContext->Release();
SysFreeString(storeName);
SysFreeString(appName);
VariantClear(&myVar);
CoUninitialize();
}
void MyHandleError(char *s)
{
printf("An error occurred in running the program.\n");
printf("%s\n",s);
printf("Error number %x\n.",GetLastError());
printf("Program terminating.\n");
exit(1);
}