Memanggil Wizard Pembuatan dari Aplikasi Anda

Aplikasi atau komponen dapat menggunakan wizard pembuatan objek layanan direktori yang sama yang digunakan oleh snap-in MMC administratif Direktori Aktif. Ini dicapai dengan antarmuka IDsAdminCreateObj.

Menggunakan Antarmuka IDAdminCreateObj

Aplikasi atau komponen (klien) membuat instans antarmuka IDsAdminCreateObj dengan memanggil CoCreateInstance dengan pengidentifikasi kelas CLSID_DsAdminCreateObj. COM harus diinisialisasi dengan memanggil CoInitialize sebelum CoCreateInstance dipanggil.

Klien kemudian memanggil IDAdminCreateObj::Initialize untuk menginisialisasi objek IDsAdminCreateObj. IDsAdminCreateObj::Initialize menerima penunjuk antarmuka IADsContainer yang mewakili kontainer tempat objek harus dibuat, dan nama kelas objek yang akan dibuat. Saat membuat objek pengguna, dimungkinkan juga untuk menentukan objek yang ada yang akan disalin ke objek baru.

Ketika objek IDsAdminCreateObj telah diinisialisasi, klien memanggil IDsAdminCreateObj::CreateModal untuk menampilkan wizard pembuatan objek.

Tidak seperti kebanyakan pengidentifikasi kelas dan antarmuka, CLSID_DsAdminCreateObj dan IID_ADsAdminCreateObj tidak ditentukan dalam file pustaka. Ini berarti Anda harus menentukan penyimpanan untuk pengidentifikasi ini dalam aplikasi Anda. Untuk melakukan ini, Anda harus segera menyertakan file initguid.h sebelum menyertakan dsadmin.h. File initguid.h hanya boleh disertakan sekali dalam aplikasi. Contoh kode berikut menunjukkan cara menyertakan file-file ini.

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

Contoh kode berikut menunjukkan bagaimana antarmuka IDAdminCreateObj dapat dibuat dan digunakan untuk memulai wizard pembuatan objek untuk objek pengguna.

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