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
- Criando um repositório de SQL Server
- Criando 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);
}