Appel d’assistants de création à partir de votre application

Une application ou un composant peut utiliser les mêmes Assistants de création d’objets de service d’annuaire que les composants logiciels enfichables MMC d’administration Active Directory. Cette opération est effectuée avec l’interface IDsAdminCreateObj .

Utilisation de l’interface IDsAdminCreateObj

Une application ou un composant (client) crée un instance de l’interface IDsAdminCreateObj en appelant CoCreateInstance avec l’identificateur de classe CLSID_DsAdminCreateObj. COM doit être initialisé en appelant CoInitialize avant l’appel de CoCreateInstance .

Le client appelle ensuite IDsAdminCreateObj::Initialize pour initialiser l’objet IDsAdminCreateObj . IDsAdminCreateObj::Initialize accepte un pointeur d’interface IADsContainer qui représente le conteneur dans lequel l’objet doit être créé et le nom de classe de l’objet à créer. Lors de la création d’objets utilisateur, il est également possible de spécifier un objet existant qui sera copié dans le nouvel objet.

Lorsque l’objet IDsAdminCreateObj a été initialisé, le client appelle IDsAdminCreateObj::CreateModal pour afficher l’Assistant Création d’objets.

Contrairement à la plupart des identificateurs de classe et d’interface, les CLSID_DsAdminCreateObj et les IID_ADsAdminCreateObj ne sont pas définis dans un fichier de bibliothèque. Cela signifie que vous devez définir le stockage de ces identificateurs dans votre application. Pour ce faire, vous devez inclure le fichier initguid.h immédiatement avant d’inclure dsadmin.h. Le fichier initguid.h ne doit être inclus qu’une seule fois dans une application. L’exemple de code suivant montre comment inclure ces fichiers.

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

L’exemple de code suivant montre comment l’interface IDsAdminCreateObj peut être créée et utilisée pour démarrer l’Assistant Création d’objets pour un objet utilisateur.

//  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;
}