Richiamo di creazioni guidate dall'applicazione

Un'applicazione o un componente può usare le stesse procedure guidate di creazione di oggetti del servizio directory usate dagli snap-in MMC amministrativi di Active Directory. Questa operazione viene eseguita con l'interfaccia ID Amministrazione CreateObj.

Uso degli ID Amministrazione CreateObj Interface

Un'applicazione o un componente (client) crea un'istanza degli ID Amministrazione CreateObj interfaccia chiamando CoCreateInstance con l'identificatore di classe CLSID_DsAmministrazione CreateObj. COM deve essere inizializzato chiamando CoInitialize prima di chiamare CoCreateInstance.

Il client chiama quindi ID Amministrazione CreateObj::Initialize per inizializzare l'oggetto ID Amministrazione CreateObj. ID Amministrazione CreateObj::Initialize accetta un puntatore all'interfaccia IADsContainer che rappresenta il contenitore in cui deve essere creato l'oggetto e il nome della classe dell'oggetto da creare. Quando si creano oggetti utente, è anche possibile specificare un oggetto esistente che verrà copiato nel nuovo oggetto.

Quando l'oggetto ID Amministrazione CreateObj è stato inizializzato, il client chiama ID Amministrazione CreateObj::CreateModal per visualizzare la creazione guidata dell'oggetto.

A differenza della maggior parte degli identificatori di classe e di interfaccia, CLSID_DsAmministrazione CreateObj e IID_ADsAmministrazione CreateObj non sono definiti in un file di libreria. Ciò significa che è necessario definire lo spazio di archiviazione per questi identificatori all'interno dell'applicazione. A tale scopo, è necessario includere il file initguid.h immediatamente prima di includere dsadmin.h. Il file initguid.h deve essere incluso una sola volta in un'applicazione. Nell'esempio di codice seguente viene illustrato come includere questi file.

#include <initguid.h>
#include <dsadmin.h>

Nell'esempio di codice seguente viene illustrato come creare e usare l'interfaccia ID Amministrazione CreateObj per avviare la creazione guidata di oggetti per un oggetto utente.

//  Add activeds.lib to your project
//  Add adsiid.lib to your project

#include "stdafx.h"
#include <atlbase.h>
#include <atlstr.h>
#include "activeds.h"
#include <initguid.h> // Only include this in one source file
#include <dsadmin.h>

//  GetUserContainer() function binds to the user container
IADsContainer* GetUserContainer(void)
{
    IADsContainer *pUsers = NULL;
    HRESULT hr;
    IADs *pRoot;

    //  Bind to the rootDSE.
    hr = ADsGetObject(L"LDAP://rootDSE", IID_IADs, (LPVOID*)&pRoot);

    if(SUCCEEDED(hr))
    {
        VARIANT var;
        VariantInit(&var);
        CComBSTR sbstr(L"defaultNamingContext");

        //  Get the default naming context (domain) DN.
        hr = pRoot->Get(sbstr, &var);
        if(SUCCEEDED(hr) && (VT_BSTR == var.vt))
        {
            CStringW sstr(L"LDAP://CN=Users,");
            sstr += var.bstrVal;

            //  Bind to the User container.
            hr = ADsGetObject(sstr, IID_IADsContainer, (LPVOID*)&pUsers);

            VariantClear(&var);
        }
    }

    return pUsers;
}


//  The LaunchNewUserWizard() function launches the user wizard.
HRESULT LaunchNewUserWizard(IADs** ppAdsOut)
{
    if(NULL == ppAdsOut)
    {
        return E_INVALIDARG;
    }

    HRESULT hr;
    IDsAdminCreateObj* pCreateObj = NULL;

    hr = ::CoCreateInstance(CLSID_DsAdminCreateObj,
                            NULL, 
                            CLSCTX_INPROC_SERVER,
                            IID_IDsAdminCreateObj,
                            (void**)&pCreateObj);

    if(SUCCEEDED(hr))
    {
        IADsContainer *pContainer;

        pContainer = GetUserContainer();

        if(pContainer)
        {
            hr = pCreateObj->Initialize(pContainer, NULL, L"user");
            if(SUCCEEDED(hr))
            {
                HWND    hwndParent;

                hwndParent = GetDesktopWindow();

                hr = pCreateObj->CreateModal(hwndParent, ppAdsOut);
            }

            pContainer->Release();
        }

        pCreateObj->Release();
    }

    return hr;    
}

//  Entry point to the application
int main(void)
{
    HRESULT hr;
    IADs *pAds = NULL;

    CoInitialize(NULL);

    hr = LaunchNewUserWizard(&pAds);
    if((S_OK == hr) && (NULL != pAds))
    {
        pAds->Release();
    }

    CoUninitialize();

    return 0;
}