Delegación de la definición de permisos en C++
Los almacenes de directivas de autorización que se almacenan en Active Directory admiten la delegación de administración. La administración se puede delegar a usuarios y grupos en el nivel de almacén, aplicación o ámbito.
En cada nivel, hay una lista de administradores y lectores. Los administradores de un almacén, una aplicación o un ámbito pueden leer y modificar el almacén de directivas en el nivel delegado. Los lectores pueden leer el almacén de directivas en el nivel delegado, pero no pueden modificar el almacén.
Un usuario o grupo que sea administrador o lector de una aplicación también debe agregarse como usuario delegado del almacén de directivas que contiene esa aplicación. Del mismo modo, se debe agregar un usuario o grupo que sea administrador o lector de un ámbito como usuario delegado de la aplicación que contiene ese ámbito.
Por ejemplo, para delegar la administración de un ámbito, primero agregue el usuario o grupo a la lista de usuarios delegados del almacén que contiene el ámbito llamando al método IAzAuthorizationStore::AddDelegatedPolicyUser . A continuación, agregue el usuario o grupo a la lista de usuarios delegados de la aplicación que contiene el ámbito llamando al método IAzApplication::AddDelegatedPolicyUser . Por último, agregue el usuario o grupo a la lista de administradores del ámbito llamando al método IAzScope::AddPolicyAdministrator .
Los almacenes de directivas basados en XML no admiten la delegación en ningún nivel.
No se puede delegar un ámbito dentro de un almacén de autorización almacenado en Active Directory si el ámbito contiene definiciones de tareas que incluyen reglas de autorización o definiciones de roles que incluyen reglas de autorización.
En el ejemplo siguiente se muestra cómo delegar la administración de una aplicación. En el ejemplo se supone que hay un almacén de directivas de autorización de Active Directory existente en la ubicación especificada, que este almacén de directivas contiene una aplicación denominada Expense y que esta aplicación no contiene tareas con scripts de reglas de negocios.
#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);
}