Freigeben über


Delegieren der Definition von Berechtigungen in C++

Autorisierungsrichtlinienspeicher, die in Active Directory gespeichert sind, unterstützen die Delegierung der Verwaltung. Die Verwaltung kann an Benutzer und Gruppen auf Speicher-, Anwendungs- oder Bereichsebene delegiert werden.

Auf jeder Ebene gibt es eine Liste von Administratoren und Lesern. Administratoren eines Speichers, einer Anwendung oder eines Bereichs können den Richtlinienspeicher auf delegierter Ebene lesen und ändern. Leser können den Richtlinienspeicher auf delegierter Ebene lesen, aber den Speicher nicht ändern.

Ein Benutzer oder eine Gruppe, die entweder ein Administrator oder ein Leser einer Anwendung ist, muss auch als delegierter Benutzer des Richtlinienspeichers hinzugefügt werden, der diese Anwendung enthält. Ebenso muss ein Benutzer oder eine Gruppe, der administrator oder leser eines Bereichs ist, als delegierter Benutzer der Anwendung hinzugefügt werden, die diesen Bereich enthält.

Um beispielsweise die Verwaltung eines Bereichs zu delegieren, fügen Sie zuerst den Benutzer oder die Gruppe zur Liste der delegierten Benutzer des Speichers hinzu, der den Bereich enthält, indem Sie die IAzAuthorizationStore::AddDelegatedPolicyUser-Methode aufrufen. Fügen Sie dann den Benutzer oder die Gruppe zur Liste der delegierten Benutzer der Anwendung hinzu, die den Bereich enthält, indem Sie die IAzApplication::AddDelegatedPolicyUser-Methode aufrufen. Fügen Sie schließlich den Benutzer oder die Gruppe zur Liste der Administratoren des Bereichs hinzu, indem Sie die IAzScope::AddPolicyAdministrator-Methode aufrufen.

XML-basierte Richtlinienspeicher unterstützen keine Delegierung auf jeder Ebene.

Ein Bereich innerhalb eines In Active Directory gespeicherten Autorisierungsspeichers kann nicht delegiert werden, wenn der Bereich Aufgabendefinitionen enthält, die Autorisierungsregeln oder Rollendefinitionen enthalten, die Autorisierungsregeln enthalten.

Das folgende Beispiel zeigt, wie die Verwaltung einer Anwendung delegiert wird. Im Beispiel wird davon ausgegangen, dass an dem angegebenen Speicherort ein Active Directory-Autorisierungsrichtlinienspeicher vorhanden ist, dass dieser Richtlinienspeicher eine Anwendung mit dem Namen "Spesenkosten" enthält und dass diese Anwendung keine Aufgaben mit Geschäftsregelskripts enthält.

#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);
}