Делегирование определения разрешений в C++
Хранилища политик авторизации, хранящиеся в Active Directory, поддерживают делегирование администрирования. Администрирование можно делегировать пользователям и группам на уровне магазина, приложения или область.
На каждом уровне имеется список администраторов и читателей. Администраторы магазина, приложения или область могут читать и изменять хранилище политик на делегированном уровне. Читатели могут читать хранилище политик на делегированном уровне, но не могут изменять хранилище.
Пользователь или группа, которые являются администратором или читателем приложения, также должны быть добавлены в качестве делегированного пользователя хранилища политик, содержащего это приложение. Аналогичным образом, пользователь или группа, которые являются администратором или читателем область, должны быть добавлены в качестве делегированного пользователя приложения, содержащего область.
Например, чтобы делегировать администрирование область, сначала добавьте пользователя или группу в список делегированных пользователей магазина, который содержит область путем вызова метода IAzAuthorizationStore::AddDelegatedPolicyUser. Затем добавьте пользователя или группу в список делегированных пользователей приложения, содержащего область, вызвав метод IAzApplication::AddDelegatedPolicyUser. Наконец, добавьте пользователя или группу в список администраторов область, вызвав метод IAzScope::AddPolicyAdministrator.
Хранилища политик на основе XML не поддерживают делегирование ни на одном уровне.
Область в хранилище авторизации, хранящееся в Active Directory, нельзя делегировать, если область содержит определения задач, включающие правила авторизации, или определения ролей, включающих правила авторизации.
В следующем примере показано, как делегировать администрирование приложения. В примере предполагается, что в указанном расположении имеется хранилище политик авторизации Active Directory, что это хранилище политик содержит приложение с именем Expense и что это приложение не содержит задач со скриптами бизнес-правил.
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0502
#endif
#include <windows.h>
#include <stdio.h>
#include <azroles.h>
#include <objbase.h>
void main(void)
{
IAzAuthorizationStore* pStore = NULL;
IAzApplication* pApp = NULL;
HRESULT hr;
void MyHandleError(char *s);
BSTR storeName = NULL;
BSTR appName = NULL;
BSTR userName = NULL;
VARIANT 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.");
// Create null VARIANT for parameters.
myVar.vt = VT_NULL;
// Allocate a string for the distinguished name of the
// Active Directory store.
if(!(storeName = SysAllocString
(L"msldap://CN=MyAzStore,CN=Program Data,DC=authmanager,DC=com")))
MyHandleError("Could not allocate string.");
// Initialize the store.
hr = pStore->Initialize
(AZ_AZSTORE_FLAG_MANAGE_STORE_ONLY, 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.");
// Add a delegated policy user to the store.
if (!(userName = SysAllocString(L"ExampleDomain\\UserName")))
MyHandleError("Could not allocate username string.");
hr = pStore->AddDelegatedPolicyUserName(userName, myVar);
if (!(SUCCEEDED(hr)))
MyHandleError
("Could not add user to store as delegated policy user.");
// Add the user as an administrator of the application.
hr = pApp->AddPolicyAdministratorName(userName, myVar);
if (!(SUCCEEDED(hr)))
MyHandleError
("Could not add user to application as administrator.");
// Clean up resources.
pStore->Release();
pApp->Release();
SysFreeString(storeName);
SysFreeString(appName);
SysFreeString(userName);
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);
}