Compartilhar via


Criando um objeto de repositório de políticas de autorização no C++

Um repositório de políticas de autorização contém informações sobre a política de segurança de um aplicativo ou grupo de aplicativos. As informações incluem aplicativos, operações, tarefas, usuários e grupos de usuários associados ao repositório. Quando um aplicativo que usa o Gerenciador de Autorização é inicializado, ele carrega essas informações do repositório. O repositório de políticas de autorização deve estar localizado em um sistema confiável porque os administradores desse sistema têm um alto grau de acesso ao repositório.

O Gerenciador de Autorização dá suporte ao armazenamento da política de autorização no serviço de diretório do Active Directory ou em um arquivo XML, conforme mostrado nos exemplos a seguir. Na API do Gerenciador de Autorização, um repositório de políticas de autorização é representado por um objeto AzAuthorizationStore . Os exemplos mostram como criar um objeto AzAuthorizationStore para um repositório do Active Directory e um repositório XML.

Criando um Repositório do Active Directory

Para usar o Active Directory para armazenar a política de autorização, o domínio deve estar no nível funcional do domínio do Windows Server 2003 . O repositório de políticas de autorização não pode estar localizado em um contexto de nomenclatura não domínio (também chamado de partição de aplicativo). É recomendável que o repositório esteja localizado no contêiner Dados do Programa em uma nova unidade organizacional criada especificamente para o repositório de políticas de autorização. Também é recomendável que o repositório esteja localizado na mesma rede local que os servidores de aplicativos que executam aplicativos que usam o repositório.

O exemplo a seguir mostra como criar um objeto AzAuthorizationStore que representa um repositório de políticas de autorização no Active Directory. O exemplo pressupõe que há uma unidade organizacional existente do Active Directory chamada Dados do Programa em um domínio chamado authmanager.com.

#pragma comment(lib, "duser.lib")

#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;
    HRESULT hr;
    void MyHandleError(char *s);
    BSTR storeName = NULL;

    //  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 a null VARIANT for function parameters.
    VARIANT myVar;
    VariantInit(&myVar);

    //  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 in Active Directory. Use the
 //  AZ_AZSTORE_FLAG_CREATE flag.
    hr = pStore->Initialize(AZ_AZSTORE_FLAG_CREATE, storeName, myVar);
    if (!(SUCCEEDED(hr)))
        MyHandleError("Could not initialize store.");

    //  Call the submit method to save changes to the new store.
    hr = pStore->Submit(0, myVar);
    if (!(SUCCEEDED(hr)))
        MyHandleError("Could not save data to the store.");

    //  Clean up resources.
    pStore->Release();
    VariantClear(&myVar);
    SysFreeString(storeName);
    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);
}

Criando um repositório de SQL Server

O Gerenciador de Autorização dá suporte à criação de um repositório de políticas de autorização baseado em SQL Server da Microsoft. Para criar um repositório de autorização baseado em SQL Server, use uma URL que começa com o prefixo MSSQL://. A URL deve conter uma cadeia de conexão SQL válida, um nome de banco de dados e o nome do repositório de políticas de autorização: **MSSQL:// ConnectionString/DatabaseName/**PolicyStoreName.

Se a instância do SQL Server não contiver o banco de dados especificado do Gerenciador de Autorização, o Gerenciador de Autorização criará um novo banco de dados com esse nome.

Observação

As conexões com um repositório de SQL Server não são criptografadas, a menos que você configure explicitamente a criptografia SQL para a conexão ou configure a criptografia do tráfego de rede que usa o IPsec (Internet Protocol Security).

 

O exemplo a seguir mostra como criar um objeto AzAuthorizationStore que representa um repositório de políticas de autorização em um banco de dados SQL Server.

#pragma comment(lib, "duser.lib")

#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;
    HRESULT hr;
    void MyHandleError(char *s);
    BSTR storeName = NULL;

    //  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.");
    
    VARIANT myVar; 
    myVar.vt = VT_NULL;

    //  Allocate a string for the SQL Server store.
    if(!(storeName = SysAllocString
   (L"MSSQL://Driver={SQL Server};Server={AzServer};/AzDB/MyStore")))
        MyHandleError("Could not allocate string.");
    
    //  Initialize the store. Use the
 //  AZ_AZSTORE_FLAG_CREATE flag.
    hr = pStore->Initialize(AZ_AZSTORE_FLAG_CREATE, storeName, myVar);
    if (!(SUCCEEDED(hr)))
        MyHandleError("Could not initialize store.");

    //  Call the submit method to save changes to the new store.
    hr = pStore->Submit(0, myVar);
    if (!(SUCCEEDED(hr)))
        MyHandleError("Could not save data to the store.");

    //  Clean up resources.
    pStore->Release();
    SysFreeString(storeName);
    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);
}

Criando um repositório XML

O Gerenciador de Autorização dá suporte à criação de um repositório de políticas de autorização no formato XML. O repositório XML pode estar localizado no mesmo computador em que o aplicativo é executado ou pode ser armazenado remotamente. Não há suporte para a edição direta do arquivo XML. Use o snap-in do MMC do Gerenciador de Autorização ou a API do Gerenciador de Autorização para editar o repositório de políticas.

O Gerenciador de Autorização não dá suporte à delegação da administração de um repositório de políticas XML. Para obter informações sobre delegação, consulte Delegando a definição de permissões no C++.

O exemplo a seguir mostra como criar um objeto AzAuthorizationStore que representa um repositório de políticas de autorização em um arquivo XML.

#pragma comment(lib, "duser.lib")

#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;
    HRESULT hr;
    void MyHandleError(char *s);
    BSTR storeName = NULL;

    //  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.");
    
    VARIANT myVar; 
    myVar.vt = VT_NULL;

    //  Allocate a string for the distinguished name of the XML store.
    if(!(storeName = SysAllocString(L"msxml://C:\\MyStore.xml")))
        MyHandleError("Could not allocate string.");
    
    //  Initialize the store in an XML file. Use the
 //  AZ_AZSTORE_FLAG_CREATE flag.
    hr = pStore->Initialize(AZ_AZSTORE_FLAG_CREATE, storeName, myVar);
    if (!(SUCCEEDED(hr)))
        MyHandleError("Could not initialize store.");

    //  Call the submit method to save changes to the new store.
    hr = pStore->Submit(0, myVar);
    if (!(SUCCEEDED(hr)))
        MyHandleError("Could not save data to the store.");

    //  Clean up resources.
    pStore->Release();
    SysFreeString(storeName);
    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);
}