Aufrufen von Erstellungs-Assistenten über Ihre Anwendung

Eine Anwendung oder Komponente kann die gleichen Assistenten zum Erstellen von Verzeichnisdienstobjekten verwenden, die von den MmC-Snap-Ins für die Active Directory-Verwaltung verwendet werden. Dies wird mit der IDsAdminCreateObj-Schnittstelle erreicht.

Verwenden der IDsAdminCreateObj-Schnittstelle

Eine Anwendung oder Komponente (Client) erstellt eine instance der IDsAdminCreateObj-Schnittstelle, indem CoCreateInstance mit dem CLSID_DsAdminCreateObj Klassenbezeichner aufgerufen wird. COM muss durch Aufrufen von CoInitialize initialisiert werden, bevor CoCreateInstance aufgerufen wird.

Der Client ruft dann IDsAdminCreateObj::Initialize auf, um das IDsAdminCreateObj-Objekt zu initialisieren. IDsAdminCreateObj::Initialize akzeptiert einen IADsContainer-Schnittstellenzeiger , der den Container darstellt, in dem das Objekt erstellt werden soll, und den Klassennamen des zu erstellenden Objekts. Beim Erstellen von Benutzerobjekten kann auch ein vorhandenes Objekt angegeben werden, das in das neue Objekt kopiert wird.

Wenn das IDsAdminCreateObj-Objekt initialisiert wurde, ruft der Client IDsAdminCreateObj::CreateModal auf, um den Objekterstellungs-Assistenten anzuzeigen.

Im Gegensatz zu den meisten Klassen- und Schnittstellenbezeichnern sind CLSID_DsAdminCreateObj und IID_ADsAdminCreateObj nicht in einer Bibliotheksdatei definiert. Dies bedeutet, dass Sie den Speicher für diese Bezeichner in Ihrer Anwendung definieren müssen. Dazu müssen Sie die Datei "initguid.h" unmittelbar vor dem Einschließen von "dsadmin.h" einschließen. Die Datei "initguid.h" darf nur einmal in eine Anwendung aufgenommen werden. Im folgenden Codebeispiel wird gezeigt, wie diese Dateien eingeschlossen werden.

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

Das folgende Codebeispiel zeigt, wie die IDsAdminCreateObj-Schnittstelle erstellt und verwendet werden kann, um den Objekterstellungs-Assistenten für ein Benutzerobjekt zu starten.

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